summaryrefslogtreecommitdiff
path: root/libs/clearlooks-newer/widget-information.c
diff options
context:
space:
mode:
Diffstat (limited to 'libs/clearlooks-newer/widget-information.c')
-rw-r--r--libs/clearlooks-newer/widget-information.c312
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;
+}