3 #include "general-support.h"
4 #include "widget-information.h"
9 static gchar ge_widget_hints[] =
25 ge_check_hint (GEHint hint,
29 static GEHint quark_hint_lookup[GE_HINT_COUNT] = {0};
31 g_assert ((hint >= 0) && (hint < GE_HINT_COUNT));
33 /* Initilize lookup table */
34 if (G_UNLIKELY (quark_hint_lookup[0] == 0))
37 gchar *cur_hint_str = ge_widget_hints;
38 while ((i < GE_HINT_COUNT) && cur_hint_str[0])
40 /* Can't use _from_static_string as the engine may be unloaded. */
41 quark_hint_lookup[i] = g_quark_from_string (cur_hint_str);
42 cur_hint_str += strlen(cur_hint_str) + 1;
45 g_assert (i == GE_HINT_COUNT && cur_hint_str[0] == '\0');
49 if (quark_hint_lookup[hint] == style_hint)
53 /* Try to decide based on other hints, eg. hscale is also a scale. */
54 if (hint == GE_HINT_SCALE)
55 if (ge_check_hint (GE_HINT_VSCALE, style_hint, widget) ||
56 ge_check_hint (GE_HINT_HSCALE, style_hint, widget))
58 if (hint == GE_HINT_SCROLLBAR)
59 if (ge_check_hint (GE_HINT_VSCROLLBAR, style_hint, widget) ||
60 ge_check_hint (GE_HINT_HSCROLLBAR, style_hint, widget))
62 if (hint == GE_HINT_TREEVIEW)
63 if (ge_check_hint (GE_HINT_TREEVIEW_HEADER, style_hint, widget))
67 /* These may be caused by applications so we never want to disable them.
68 * TODO: This does not catch the case where the theme uses appears-as-list
69 * and the application turns it off again. Though this case
70 * is even less likely. */
72 case GE_HINT_COMBOBOX_ENTRY:
73 if (widget && ge_object_is_a (G_OBJECT (widget), "GtkComboBox"))
75 gboolean appears_as_list = FALSE;
77 gtk_widget_style_get (widget, "appears-as-list", &appears_as_list, NULL);
88 #ifdef ENABLE_WIDGET_CHECKS
89 /* If a style_hint *was* set, and nothing matched, just give up right away.
90 * A theme shall either support it fully, or not at all. */
94 /* No widget? Just give up. Nothing we can do. */
98 /* Try to do something based on the passed in widget pointer. */
100 case GE_HINT_TREEVIEW:
101 if (widget->parent && (ge_object_is_a (G_OBJECT (widget->parent), "GtkTreeView")))
104 case GE_HINT_TREEVIEW_HEADER:
105 if (ge_object_is_a (G_OBJECT (widget), "GtkButton") && widget->parent &&
106 (ge_object_is_a (G_OBJECT (widget->parent), "GtkTreeView") || ge_object_is_a (G_OBJECT (widget->parent), "GtkCList") ||
107 ge_object_is_a (G_OBJECT (widget->parent), "GtkCTree")))
109 if (widget->parent && ge_object_is_a (G_OBJECT (widget->parent), "ETreeView"))
112 case GE_HINT_COMBOBOX_ENTRY:
113 if (ge_is_in_combo_box (widget))
116 case GE_HINT_SPINBUTTON:
117 if (ge_object_is_a (G_OBJECT (widget), "GtkSpinButton"))
120 case GE_HINT_STATUSBAR:
121 if (widget->parent && ge_object_is_a (G_OBJECT (widget), "GtkStatusbar"))
125 if (ge_object_is_a (G_OBJECT (widget), "GtkScale"))
129 if (ge_object_is_a (G_OBJECT (widget), "GtkHScale"))
133 if (ge_object_is_a (G_OBJECT (widget), "GtkVScale"))
136 case GE_HINT_SCROLLBAR:
137 if (ge_object_is_a (G_OBJECT (widget), "GtkScrollbar"))
140 case GE_HINT_HSCROLLBAR:
141 if (ge_object_is_a (G_OBJECT (widget), "GtkHScrollbar"))
144 case GE_HINT_VSCROLLBAR:
145 if (ge_object_is_a (G_OBJECT (widget), "GtkVScrollbar"))
148 case GE_HINT_PROGRESSBAR:
149 if (ge_object_is_a (G_OBJECT (widget), "GtkProgressBar"))
152 case GE_HINT_MENUBAR:
153 if (ge_object_is_a (G_OBJECT (widget), "GtkMenuBar") ||
154 ge_object_is_a (G_OBJECT (widget->parent), "GtkMenuBar"))
168 /* Widget Type Lookups/Macros
170 Based on/modified from functions in
174 ge_object_is_a (const GObject * object, const gchar * type_name)
176 gboolean result = FALSE;
180 GType tmp = g_type_from_name (type_name);
183 result = g_type_check_instance_is_a ((GTypeInstance *) object, tmp);
190 ge_is_combo_box_entry (GtkWidget * widget)
192 gboolean result = FALSE;
194 if ((widget) && (widget->parent))
196 if (GE_IS_COMBO_BOX_ENTRY (widget->parent))
199 result = ge_is_combo_box_entry (widget->parent);
205 ge_combo_box_is_using_list (GtkWidget * widget)
207 gboolean result = FALSE;
209 if (GE_IS_COMBO_BOX (widget))
210 gtk_widget_style_get (widget, "appears-as-list", &result, NULL);
216 ge_is_combo_box (GtkWidget * widget, gboolean as_list)
218 gboolean result = FALSE;
220 if ((widget) && (widget->parent))
222 if (GE_IS_COMBO_BOX (widget->parent))
225 result = (ge_combo_box_is_using_list(widget->parent));
227 result = (!ge_combo_box_is_using_list(widget->parent));
230 result = ge_is_combo_box (widget->parent, as_list);
236 ge_is_combo (GtkWidget * widget)
238 gboolean result = FALSE;
240 if ((widget) && (widget->parent))
242 if (GE_IS_COMBO (widget->parent))
245 result = ge_is_combo (widget->parent);
251 ge_is_in_combo_box (GtkWidget * widget)
253 return ((ge_is_combo (widget) || ge_is_combo_box (widget, TRUE) || ge_is_combo_box_entry (widget)));
257 ge_is_toolbar_item (GtkWidget * widget)
259 gboolean result = FALSE;
261 if ((widget) && (widget->parent)) {
262 if ((GE_IS_BONOBO_TOOLBAR (widget->parent))
263 || (GE_IS_BONOBO_DOCK_ITEM (widget->parent))
264 || (GE_IS_EGG_TOOLBAR (widget->parent))
265 || (GE_IS_TOOLBAR (widget->parent))
266 || (GE_IS_HANDLE_BOX (widget->parent)))
269 result = ge_is_toolbar_item (widget->parent);
275 ge_is_panel_widget_item (GtkWidget * widget)
277 gboolean result = FALSE;
279 if ((widget) && (widget->parent))
281 if (GE_IS_PANEL_WIDGET (widget->parent))
284 result = ge_is_panel_widget_item (widget->parent);
290 ge_is_bonobo_dock_item (GtkWidget * widget)
292 gboolean result = FALSE;
296 if (GE_IS_BONOBO_DOCK_ITEM(widget) || GE_IS_BONOBO_DOCK_ITEM (widget->parent))
298 else if (GE_IS_BOX(widget) || GE_IS_BOX(widget->parent))
300 GtkContainer *box = GE_IS_BOX(widget)?GTK_CONTAINER(widget):GTK_CONTAINER(widget->parent);
301 GList *children = NULL, *child = NULL;
303 children = gtk_container_get_children(box);
305 for (child = g_list_first(children); child; child = g_list_next(child))
307 if (GE_IS_BONOBO_DOCK_ITEM_GRIP(child->data))
315 g_list_free(children);
322 ge_find_combo_box_entry_widget (GtkWidget * widget)
324 GtkWidget *result = NULL;
328 if (GE_IS_COMBO_BOX_ENTRY (widget))
331 result = ge_find_combo_box_entry_widget (widget->parent);
338 ge_find_combo_box_widget (GtkWidget * widget, gboolean as_list)
340 GtkWidget *result = NULL;
344 if (GE_IS_COMBO_BOX (widget))
347 result = (ge_combo_box_is_using_list(widget))?widget:NULL;
349 result = (!ge_combo_box_is_using_list(widget))?widget:NULL;
352 result = ge_find_combo_box_widget (widget->parent, as_list);
358 ge_find_combo_widget (GtkWidget * widget)
360 GtkWidget *result = NULL;
364 if (GE_IS_COMBO (widget))
367 result = ge_find_combo_widget(widget->parent);
373 ge_find_combo_box_widget_parent (GtkWidget * widget)
375 GtkWidget *result = NULL;
378 result = ge_find_combo_widget(widget);
381 result = ge_find_combo_box_widget(widget, TRUE);
384 result = ge_find_combo_box_entry_widget(widget);
389 /***********************************************
390 * option_menu_get_props -
392 * Find Option Menu Size and Spacing
395 ***********************************************/
397 ge_option_menu_get_props (GtkWidget * widget,
398 GtkRequisition * indicator_size,
399 GtkBorder * indicator_spacing)
401 GtkRequisition default_size = { 9, 5 };
402 GtkBorder default_spacing = { 7, 5, 2, 2 };
403 GtkRequisition *tmp_size = NULL;
404 GtkBorder *tmp_spacing = NULL;
406 if ((widget) && GE_IS_OPTION_MENU(widget))
407 gtk_widget_style_get (widget,
408 "indicator_size", &tmp_size,
409 "indicator_spacing", &tmp_spacing, NULL);
413 *indicator_size = *tmp_size;
414 gtk_requisition_free (tmp_size);
417 *indicator_size = default_size;
421 *indicator_spacing = *tmp_spacing;
422 gtk_border_free (tmp_spacing);
425 *indicator_spacing = default_spacing;
429 ge_button_get_default_border (GtkWidget *widget,
432 GtkBorder default_border = {1, 1, 1, 1};
433 GtkBorder *tmp_border = NULL;
435 if (widget && GE_IS_BUTTON (widget))
436 gtk_widget_style_get (widget, "default-border", &tmp_border, NULL);
440 *border = *tmp_border;
441 gtk_border_free (tmp_border);
445 *border = default_border;
450 ge_widget_is_ltr (GtkWidget *widget)
452 GtkTextDirection dir = GTK_TEXT_DIR_NONE;
454 if (GE_IS_WIDGET (widget))
455 dir = gtk_widget_get_direction (widget);
457 if (dir == GTK_TEXT_DIR_NONE)
458 dir = gtk_widget_get_default_direction ();
460 if (dir == GTK_TEXT_DIR_RTL)
467 ge_rc_parse_hint (GScanner *scanner,
473 token = g_scanner_get_next_token(scanner);
475 token = g_scanner_get_next_token(scanner);
476 if (token != G_TOKEN_EQUAL_SIGN)
477 return G_TOKEN_EQUAL_SIGN;
479 token = g_scanner_get_next_token(scanner);
480 if (token != G_TOKEN_STRING)
481 return G_TOKEN_STRING;
483 *quark = g_quark_from_string (scanner->value.v_string);