diff options
Diffstat (limited to 'libs/clearlooks-newer/widget-information.c')
-rw-r--r-- | libs/clearlooks-newer/widget-information.c | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/libs/clearlooks-newer/widget-information.c b/libs/clearlooks-newer/widget-information.c new file mode 100644 index 0000000000..cbeb00e291 --- /dev/null +++ b/libs/clearlooks-newer/widget-information.c @@ -0,0 +1,312 @@ +#include <gtk/gtk.h> + +#include "general-support.h" +#include "widget-information.h" +#include <math.h> +#include <string.h> + +/* Widget Type Lookups/Macros + + Based on/modified from functions in + Smooth-Engine. +*/ +gboolean +ge_object_is_a (const GObject * object, const gchar * type_name) +{ + gboolean result = FALSE; + + if ((object)) + { + GType tmp = g_type_from_name (type_name); + + if (tmp) + result = g_type_check_instance_is_a ((GTypeInstance *) object, tmp); + } + + return result; +} + +gboolean +ge_is_combo_box_entry (GtkWidget * widget) +{ + gboolean result = FALSE; + + if ((widget) && (widget->parent)) + { + if (GE_IS_COMBO_BOX_ENTRY (widget->parent)) + result = TRUE; + else + result = ge_is_combo_box_entry (widget->parent); + } + return result; +} + +static gboolean +ge_combo_box_is_using_list (GtkWidget * widget) +{ + gboolean result = FALSE; + + if (GE_IS_COMBO_BOX (widget)) + { + gboolean *tmp = NULL; + + gtk_widget_style_get (widget, "appears-as-list", &result, NULL); + + if (tmp) + result = *tmp; + } + + return result; +} + +gboolean +ge_is_combo_box (GtkWidget * widget, gboolean as_list) +{ + gboolean result = FALSE; + + if ((widget) && (widget->parent)) + { + if (GE_IS_COMBO_BOX (widget->parent)) + { + if (as_list) + result = (ge_combo_box_is_using_list(widget->parent)); + else + result = (!ge_combo_box_is_using_list(widget->parent)); + } + else + result = ge_is_combo_box (widget->parent, as_list); + } + return result; +} + +gboolean +ge_is_combo (GtkWidget * widget) +{ + gboolean result = FALSE; + + if ((widget) && (widget->parent)) + { + if (GE_IS_COMBO (widget->parent)) + result = TRUE; + else + result = ge_is_combo (widget->parent); + } + return result; +} + +gboolean +ge_is_in_combo_box (GtkWidget * widget) +{ + return ((ge_is_combo (widget) || ge_is_combo_box (widget, TRUE) || ge_is_combo_box_entry (widget))); +} + +gboolean +ge_is_toolbar_item (GtkWidget * widget) +{ + gboolean result = FALSE; + + if ((widget) && (widget->parent)) { + if ((GE_IS_BONOBO_TOOLBAR (widget->parent)) + || (GE_IS_BONOBO_DOCK_ITEM (widget->parent)) + || (GE_IS_EGG_TOOLBAR (widget->parent)) + || (GE_IS_TOOLBAR (widget->parent)) + || (GE_IS_HANDLE_BOX (widget->parent))) + result = TRUE; + else + result = ge_is_toolbar_item (widget->parent); + } + return result; +} + +gboolean +ge_is_panel_widget_item (GtkWidget * widget) +{ + gboolean result = FALSE; + + if ((widget) && (widget->parent)) + { + if (GE_IS_PANEL_WIDGET (widget->parent)) + result = TRUE; + else + result = ge_is_panel_widget_item (widget->parent); + } + return result; +} + +gboolean +ge_is_bonobo_dock_item (GtkWidget * widget) +{ + gboolean result = FALSE; + + if ((widget)) + { + if (GE_IS_BONOBO_DOCK_ITEM(widget) || GE_IS_BONOBO_DOCK_ITEM (widget->parent)) + result = TRUE; + else if (GE_IS_BOX(widget) || GE_IS_BOX(widget->parent)) + { + GtkContainer *box = GE_IS_BOX(widget)?GTK_CONTAINER(widget):GTK_CONTAINER(widget->parent); + GList *children = NULL, *child = NULL; + + children = gtk_container_get_children(box); + + for (child = g_list_first(children); child; child = g_list_next(child)) + { + if (GE_IS_BONOBO_DOCK_ITEM_GRIP(child->data)) + { + result = TRUE; + child = NULL; + } + } + + if (children) + g_list_free(children); + } + } + return result; +} + +static GtkWidget * +ge_find_combo_box_entry_widget (GtkWidget * widget) +{ + GtkWidget *result = NULL; + + if (widget) + { + if (GE_IS_COMBO_BOX_ENTRY (widget)) + result = widget; + else + result = ge_find_combo_box_entry_widget (widget->parent); + } + + return result; +} + +static GtkWidget * +ge_find_combo_box_widget (GtkWidget * widget, gboolean as_list) +{ + GtkWidget *result = NULL; + + if (widget) + { + if (GE_IS_COMBO_BOX (widget)) + { + if (as_list) + result = (ge_combo_box_is_using_list(widget))?widget:NULL; + else + result = (!ge_combo_box_is_using_list(widget))?widget:NULL; + } + else + result = ge_find_combo_box_widget (widget->parent, as_list); + } + return result; +} + +static GtkWidget * +ge_find_combo_widget (GtkWidget * widget) +{ + GtkWidget *result = NULL; + + if (widget) + { + if (GE_IS_COMBO (widget)) + result = widget; + else + result = ge_find_combo_widget(widget->parent); + } + return result; +} + +GtkWidget* +ge_find_combo_box_widget_parent (GtkWidget * widget) +{ + GtkWidget *result = NULL; + + if (!result) + result = ge_find_combo_widget(widget); + + if (!result) + result = ge_find_combo_box_widget(widget, TRUE); + + if (!result) + result = ge_find_combo_box_entry_widget(widget); + + return result; +} + +/*********************************************** + * option_menu_get_props - + * + * Find Option Menu Size and Spacing + * + * Taken from Smooth + ***********************************************/ +void +ge_option_menu_get_props (GtkWidget * widget, + GtkRequisition * indicator_size, + GtkBorder * indicator_spacing) +{ + GtkRequisition default_size = { 9, 5 }; + GtkBorder default_spacing = { 7, 5, 2, 2 }; + GtkRequisition *tmp_size = NULL; + GtkBorder *tmp_spacing = NULL; + + if ((widget) && GE_IS_OPTION_MENU(widget)) + gtk_widget_style_get (widget, + "indicator_size", &tmp_size, + "indicator_spacing", &tmp_spacing, NULL); + + if (tmp_size) + { + *indicator_size = *tmp_size; + gtk_requisition_free (tmp_size); + } + else + *indicator_size = default_size; + + if (tmp_spacing) + { + *indicator_spacing = *tmp_spacing; + gtk_border_free (tmp_spacing); + } + else + *indicator_spacing = default_spacing; +} + +void +ge_button_get_default_border (GtkWidget *widget, + GtkBorder *border) +{ + GtkBorder default_border = {1, 1, 1, 1}; + GtkBorder *tmp_border = NULL; + + if (widget && GE_IS_BUTTON (widget)) + gtk_widget_style_get (widget, "default-border", &tmp_border, NULL); + + if (tmp_border) + { + *border = *tmp_border; + gtk_border_free (tmp_border); + } + else + { + *border = default_border; + } +} + + +gboolean +ge_widget_is_ltr (GtkWidget *widget) +{ + GtkTextDirection dir = GTK_TEXT_DIR_NONE; + + if (GE_IS_WIDGET (widget)) + dir = gtk_widget_get_direction (widget); + + if (dir == GTK_TEXT_DIR_NONE) + dir = gtk_widget_get_default_direction (); + + if (dir == GTK_TEXT_DIR_RTL) + return FALSE; + else + return TRUE; +} |