| 165 find_focusable_widget(GNT_BOX(widget)); |
165 find_focusable_widget(GNT_BOX(widget)); |
| 166 } |
166 } |
| 167 DEBUG; |
167 DEBUG; |
| 168 } |
168 } |
| 169 |
169 |
| 170 #if 0 |
|
| 171 static GntWidget * |
|
| 172 find_next_focus(GntBox *box) |
|
| 173 { |
|
| 174 GntWidget *w = box->active; |
|
| 175 GList *iter; |
|
| 176 |
|
| 177 if (w == NULL) |
|
| 178 { |
|
| 179 return find_focusable_widget(box); |
|
| 180 } |
|
| 181 |
|
| 182 while (w && !(iter = g_list_find(box->list, w))) |
|
| 183 w = w->parent; |
|
| 184 |
|
| 185 if (!w) |
|
| 186 box->active = NULL; |
|
| 187 else if (iter) |
|
| 188 { |
|
| 189 GntWidget *next = NULL; |
|
| 190 |
|
| 191 while (!next && (iter = iter->next)) |
|
| 192 { |
|
| 193 if (GNT_IS_BOX(iter->data)) |
|
| 194 next = find_next_focus(iter->data); |
|
| 195 else |
|
| 196 { |
|
| 197 if (GNT_WIDGET_IS_FLAG_SET(iter->data, GNT_WIDGET_CAN_TAKE_FOCUS) && |
|
| 198 GNT_WIDGET_IS_FLAG_SET(iter->data, GNT_WIDGET_HAS_FOCUS)) |
|
| 199 next = iter->data; |
|
| 200 else |
|
| 201 next = NULL; |
|
| 202 } |
|
| 203 } |
|
| 204 box->active = next; |
|
| 205 } |
|
| 206 |
|
| 207 if (box->active == NULL && GNT_WIDGET(box)->parent == NULL) |
|
| 208 { |
|
| 209 box->active = find_focusable_widget(box); |
|
| 210 } |
|
| 211 |
|
| 212 if (box->active) |
|
| 213 GNT_WIDGET_SET_FLAGS(box->active, GNT_WIDGET_HAS_FOCUS); |
|
| 214 |
|
| 215 return box->active; |
|
| 216 } |
|
| 217 #endif |
|
| 218 |
|
| 219 /* Ensures that the current widget can take focus */ |
170 /* Ensures that the current widget can take focus */ |
| 220 static GntWidget * |
171 static GntWidget * |
| 221 find_focusable_widget(GntBox *box) |
172 find_focusable_widget(GntBox *box) |
| 222 { |
173 { |
| 223 if (box->focus == NULL && GNT_WIDGET(box)->parent == NULL) |
174 if (box->focus == NULL && GNT_WIDGET(box)->parent == NULL) |
| 225 |
176 |
| 226 if (box->active == NULL && box->focus) |
177 if (box->active == NULL && box->focus) |
| 227 box->active = box->focus->data; |
178 box->active = box->focus->data; |
| 228 |
179 |
| 229 return box->active; |
180 return box->active; |
| 230 |
|
| 231 #if 0 |
|
| 232 for (iter = box->list; iter; iter = iter->next) |
|
| 233 { |
|
| 234 w = iter->data; |
|
| 235 if (GNT_IS_BOX(w)) |
|
| 236 { |
|
| 237 w = find_focusable_widget(GNT_BOX(w)); |
|
| 238 if (w) |
|
| 239 break; |
|
| 240 } |
|
| 241 else if (GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_CAN_TAKE_FOCUS)) |
|
| 242 break; |
|
| 243 } |
|
| 244 |
|
| 245 if (iter) |
|
| 246 box->active = w; |
|
| 247 else |
|
| 248 box->active = NULL; |
|
| 249 |
|
| 250 if (box->active) |
|
| 251 GNT_WIDGET_SET_FLAGS(box->active, GNT_WIDGET_HAS_FOCUS); |
|
| 252 |
|
| 253 return box->active; |
|
| 254 |
|
| 255 #if 0 |
|
| 256 if (box->active == NULL && box->list) |
|
| 257 box->active = box->list->data; |
|
| 258 else |
|
| 259 w = box->active; |
|
| 260 |
|
| 261 total = g_list_length(box->list); |
|
| 262 |
|
| 263 while (box->active && !GNT_WIDGET_IS_FLAG_SET(box->active, GNT_WIDGET_CAN_TAKE_FOCUS)) |
|
| 264 { |
|
| 265 box->active = box->active->next; |
|
| 266 investigated++; |
|
| 267 } |
|
| 268 |
|
| 269 /* Rotate if necessary */ |
|
| 270 if (!box->active && investigated < total) |
|
| 271 { |
|
| 272 box->active = box->list; |
|
| 273 while (investigated < total && !GNT_WIDGET_IS_FLAG_SET(box->active->data, GNT_WIDGET_CAN_TAKE_FOCUS)) |
|
| 274 { |
|
| 275 box->active = box->active->next; |
|
| 276 investigated++; |
|
| 277 } |
|
| 278 } |
|
| 279 |
|
| 280 if (box->active) |
|
| 281 gnt_widget_set_focus(box->active->data, TRUE); |
|
| 282 if (w && w != box->active->data) |
|
| 283 gnt_widget_set_focus(w, FALSE); |
|
| 284 #endif |
|
| 285 #endif |
|
| 286 } |
181 } |
| 287 |
182 |
| 288 static gboolean |
183 static gboolean |
| 289 gnt_box_key_pressed(GntWidget *widget, const char *text) |
184 gnt_box_key_pressed(GntWidget *widget, const char *text) |
| 290 { |
185 { |
| 333 } |
228 } |
| 334 |
229 |
| 335 return FALSE; |
230 return FALSE; |
| 336 } |
231 } |
| 337 |
232 |
| 338 #if 0 |
233 static void |
| 339 static GntWidget *find_focused_widget(GntBox *box) |
234 gnt_box_lost_focus(GntWidget *widget) |
| 340 { |
235 { |
| 341 GList *iter; |
236 GntWidget *w = GNT_BOX(widget)->active; |
| 342 |
237 if (w) |
| 343 for (iter = box->list; iter; iter = iter->next) |
238 gnt_widget_set_focus(w, FALSE); |
| 344 { |
|
| 345 GntWidget *w = iter->data; |
|
| 346 |
|
| 347 if (GNT_IS_BOX(w)) |
|
| 348 { |
|
| 349 if ((w = find_focused_widget(GNT_BOX(w))) != NULL) |
|
| 350 return w; |
|
| 351 } |
|
| 352 else |
|
| 353 { |
|
| 354 if (GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_CAN_TAKE_FOCUS) && |
|
| 355 GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_HAS_FOCUS)) |
|
| 356 return w; |
|
| 357 } |
|
| 358 } |
|
| 359 return NULL; |
|
| 360 } |
|
| 361 #endif |
|
| 362 |
|
| 363 #if 0 |
|
| 364 static void |
|
| 365 gnt_box_set_focus(GntWidget *widget, gboolean set) |
|
| 366 { |
|
| 367 GntWidget *p = widget; |
|
| 368 |
|
| 369 while (p->parent) |
|
| 370 p = p->parent; |
|
| 371 |
|
| 372 p = find_focused_widget(GNT_BOX(p)); |
|
| 373 if (p) |
|
| 374 gnt_widget_set_focus(p, set); |
|
| 375 gnt_widget_draw(widget); |
239 gnt_widget_draw(widget); |
| 376 } |
240 } |
| 377 |
241 |
| 378 static void |
242 static void |
| 379 gnt_box_lost_focus(GntWidget *widget) |
|
| 380 { |
|
| 381 gnt_box_set_focus(widget, FALSE); |
|
| 382 } |
|
| 383 |
|
| 384 static void |
|
| 385 gnt_box_gained_focus(GntWidget *widget) |
243 gnt_box_gained_focus(GntWidget *widget) |
| 386 { |
244 { |
| 387 GntWidget *p; |
245 GntWidget *w = GNT_BOX(widget)->active; |
| 388 |
246 if (w) |
| 389 while (widget->parent) |
247 gnt_widget_set_focus(w, TRUE); |
| 390 widget = widget->parent; |
248 gnt_widget_draw(widget); |
| 391 |
249 } |
| 392 p = find_focused_widget(GNT_BOX(widget)); |
|
| 393 GNT_BOX(widget)->active = g_list_find(GNT_BOX(widget)->list, p); |
|
| 394 if (p) |
|
| 395 gnt_widget_draw(p); |
|
| 396 } |
|
| 397 #endif |
|
| 398 |
250 |
| 399 static void |
251 static void |
| 400 gnt_box_destroy(GntWidget *w) |
252 gnt_box_destroy(GntWidget *w) |
| 401 { |
253 { |
| 402 GntBox *box = GNT_BOX(w); |
254 GntBox *box = GNT_BOX(w); |
| 430 parent_class->expose = gnt_box_expose; |
282 parent_class->expose = gnt_box_expose; |
| 431 parent_class->map = gnt_box_map; |
283 parent_class->map = gnt_box_map; |
| 432 parent_class->size_request = gnt_box_size_request; |
284 parent_class->size_request = gnt_box_size_request; |
| 433 parent_class->set_position = gnt_box_set_position; |
285 parent_class->set_position = gnt_box_set_position; |
| 434 parent_class->key_pressed = gnt_box_key_pressed; |
286 parent_class->key_pressed = gnt_box_key_pressed; |
| 435 #if 0 |
|
| 436 /* We are going to need this when there are multiple focusble widgets in a box */ |
|
| 437 parent_class->lost_focus = gnt_box_lost_focus; |
287 parent_class->lost_focus = gnt_box_lost_focus; |
| 438 parent_class->gained_focus = gnt_box_gained_focus; |
288 parent_class->gained_focus = gnt_box_gained_focus; |
| 439 #endif |
|
| 440 |
289 |
| 441 DEBUG; |
290 DEBUG; |
| 442 } |
291 } |
| 443 |
292 |
| 444 static void |
293 static void |
| 511 |
360 |
| 512 void gnt_box_set_toplevel(GntBox *box, gboolean set) |
361 void gnt_box_set_toplevel(GntBox *box, gboolean set) |
| 513 { |
362 { |
| 514 GntWidget *widget = GNT_WIDGET(box); |
363 GntWidget *widget = GNT_WIDGET(box); |
| 515 if (set) |
364 if (set) |
| |
365 { |
| 516 GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); |
366 GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); |
| |
367 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_CAN_TAKE_FOCUS); |
| |
368 } |
| 517 else |
369 else |
| |
370 { |
| 518 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); |
371 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); |
| |
372 GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_CAN_TAKE_FOCUS); |
| |
373 } |
| 519 } |
374 } |
| 520 |
375 |
| 521 void gnt_box_sync_children(GntBox *box) |
376 void gnt_box_sync_children(GntBox *box) |
| 522 { |
377 { |
| 523 GList *iter; |
378 GList *iter; |