Changeset 537 for trunk/thune/gl/gui.c
- Timestamp:
- 06/07/08 03:35:15 (6 months ago)
- Files:
-
- 1 modified
-
trunk/thune/gl/gui.c (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/thune/gl/gui.c
r536 r537 72 72 for(it.id = ui->rootList; IS_VALID(it.id); it.id = it.w->next) { \ 73 73 it.w = WPTR(it.id); 74 75 #define EACH_SHOWN_ROOT(it) \ 76 EACH_ROOT(it) \ 77 if( it.w->flags & GW_HIDDEN ) \ 78 continue; 74 79 75 80 #define EACH_END } … … 121 126 122 127 123 static void gui_freeWidgetP( GUI* ui, GWidget* w, GWidgetId id ) 124 { 125 GWidgetIt it; 126 GWidgetId next; 127 128 w->next = ui->firstFree; 129 ui->firstFree = id; 130 128 static void gui_removeFocus( GUI* ui, GWidgetId id ) 129 { 131 130 if( ui->mouseFocus == id ) 132 131 { … … 137 136 if( ui->keyFocus == id ) 138 137 ui->keyFocus = NO_WID; 138 } 139 140 141 static void gui_freeWidgetP( GUI* ui, GWidget* w, GWidgetId id ) 142 { 143 GWidgetIt it; 144 GWidgetId next; 145 146 w->next = ui->firstFree; 147 ui->firstFree = id; 148 149 gui_removeFocus( ui, id ); 139 150 140 151 //EACH_CHILD( w, it ) … … 896 907 ui->ut = ut; 897 908 ui->style = 0; 898 ui->root = NO_WID;899 909 ui->keyFocus = NO_WID; 900 910 ui->mouseFocus = NO_WID; … … 956 966 957 967 968 void gui_setKeyFocus( GUI* ui, GWidgetId id ) 969 { 970 ui->keyFocus = id; 971 } 972 973 974 void gui_setMouseFocus( GUI* ui, GWidgetId id ) 975 { 976 ui->mouseFocus = id; 977 } 978 979 980 void gui_grabMouse( GUI* ui, GWidgetId id ) 981 { 982 ui->mouseFocus = id; 983 ui->mouseGrabbed = 1; 984 } 985 986 987 void gui_ungrabMouse( GUI* ui, GWidgetId id ) 988 { 989 if( ui->mouseFocus == id ) 990 { 991 ui->mouseGrabbed = 0; 992 } 993 } 994 995 958 996 static GWidget* childAt( GUI* ui, GWidget* wp, const GLViewEvent* ev ) 959 997 { … … 967 1005 968 1006 969 void gui_setKeyFocus( GUI* ui, GWidgetId id ) 970 { 971 ui->keyFocus = id; 972 } 973 974 975 void gui_grabMouse( GUI* ui, GWidgetId id ) 976 { 977 ui->mouseFocus = id; 978 ui->mouseGrabbed = 1; 979 } 980 981 982 void gui_ungrabMouse( GUI* ui, GWidgetId id ) 983 { 984 if( ui->mouseFocus == id ) 985 { 986 ui->mouseGrabbed = 0; 987 } 1007 static GWidgetId widgetAt( GUI* ui, const GLViewEvent* ev ) 1008 { 1009 GWidgetIt it; 1010 EACH_SHOWN_ROOT( it ) 1011 if( gui_widgetContains( it.w, ev->x, ev->y ) ) 1012 { 1013 it.w = childAt( ui, it.w, ev ); 1014 return it.w ? WID(it.w) : NO_WID; 1015 } 1016 EACH_END 1017 return NO_WID; 988 1018 } 989 1019 … … 994 1024 995 1025 #if 0 996 printf( "KR dispatch %d root %dmouseFocus %d keyFocus %d\n",997 ev->type, ui-> root, ui->mouseFocus, ui->keyFocus );1026 printf( "KR dispatch %d mouseFocus %d keyFocus %d\n", 1027 ev->type, ui->mouseFocus, ui->keyFocus ); 998 1028 #endif 999 1029 … … 1004 1034 // Convert window system origin from top of window to the bottom. 1005 1035 ev->y = ui->rootH - ev->y; 1036 // Fall through... 1006 1037 1007 1038 case GLV_EVENT_WHEEL: … … 1031 1062 ev->state, ev->x, ev->y ); 1032 1063 CLASS( w ).dispatch( ui, w, &me ); 1033 ui->mouseFocus = NO_WID;1034 1064 } 1035 1065 } 1036 if( IS_VALID(ui->root) ) 1066 1067 ui->mouseFocus = widgetAt( ui, ev ); 1068 if( IS_VALID(ui->mouseFocus) ) 1037 1069 { 1038 GWidget* rw = WPTR(ui->root); 1039 w = childAt( ui, rw, ev ); 1040 if( /*(w != rw) &&*/ (! (w->flags & GW_DISABLED)) ) 1070 w = WPTR(ui->mouseFocus); 1071 if( ! (w->flags & GW_DISABLED) ) 1041 1072 { 1042 1073 GLViewEvent me; … … 1044 1075 ev->state, ev->x, ev->y ); 1045 1076 CLASS( w ).dispatch( ui, w, &me ); 1046 ui->mouseFocus = WID(w);1047 1077 goto dispatch; 1048 1078 } … … 1060 1090 1061 1091 case GLV_EVENT_FOCUS_IN: 1092 ui->mouseFocus = widgetAt( ui, ev ); 1093 // Fall through... 1094 1062 1095 case GLV_EVENT_FOCUS_OUT: 1063 goto root;1064 }1065 1066 root: 1067 1068 if( ! IS_VALID(ui->root) )1069 return;1070 w = WPTR(ui->root);1096 if( IS_VALID(ui->mouseFocus) ) 1097 { 1098 w = WPTR(ui->mouseFocus); 1099 goto dispatch; 1100 } 1101 break; 1102 } 1103 return; 1071 1104 1072 1105 dispatch: … … 1170 1203 1171 1204 /** 1172 Returns pointer to root widget or zero if id is invalid.1205 Returns pointer to root parent widget or zero if id is invalid. 1173 1206 */ 1174 1207 GWidget* gui_root( const GUI* ui, GWidgetId id ) … … 1225 1258 else if( ! hidden ) 1226 1259 { 1260 GWidgetId id = WID(wp); 1261 gui_removeFocus( ui, id ); 1227 1262 wp->flags |= GW_HIDDEN; 1228 1263 markLayoutDirty( ui, wp->parent ); … … 1339 1374 { 1340 1375 linkRoot( ui, wp, ms->wid ); 1341 ui->root = ms->wid;1342 1343 1376 if( ! IS_VALID(ui->keyFocus) ) 1344 ui->keyFocus = ui->root;1377 ui->keyFocus = ms->wid; 1345 1378 } 1346 1379 //return wp;
