aboutsummaryrefslogtreecommitdiffstats
path: root/e-util
diff options
context:
space:
mode:
Diffstat (limited to 'e-util')
-rw-r--r--e-util/ChangeLog5
-rw-r--r--e-util/e-gui-utils.c81
-rw-r--r--e-util/e-gui-utils.h3
3 files changed, 88 insertions, 1 deletions
diff --git a/e-util/ChangeLog b/e-util/ChangeLog
index e3f3f89943..d315be574f 100644
--- a/e-util/ChangeLog
+++ b/e-util/ChangeLog
@@ -1,3 +1,8 @@
+2000-08-07 Christopher James Lahey <clahey@helixcode.com>
+
+ * e-gui-utils.c, e-gui-utils.c: Added
+ e_container_change_tab_order.
+
2000-07-27 Peter Williams <peterw@helixcode.com>
* e-canvas.c (e_canvas_destroy): Chain the
diff --git a/e-util/e-gui-utils.c b/e-util/e-gui-utils.c
index 5d53c64d35..2e31eb101b 100644
--- a/e-util/e-gui-utils.c
+++ b/e-util/e-gui-utils.c
@@ -136,3 +136,84 @@ e_container_foreach_leaf(GtkContainer *container,
callback_closure.closure = closure;
gtk_container_foreach(container, (GtkCallback) e_container_foreach_leaf_callback, &callback_closure);
}
+
+static void
+e_container_change_tab_order_destroy_notify(gpointer data)
+{
+ GList *list = data;
+ g_list_foreach(list, (GFunc) gtk_object_unref, NULL);
+ g_list_free(list);
+}
+
+
+static gint
+e_container_change_tab_order_callback(GtkContainer *container,
+ GtkDirectionType direction,
+ GList *children)
+{
+ GtkWidget *focus_child;
+ GtkWidget *child;
+
+ if (direction != GTK_DIR_TAB_FORWARD &&
+ direction != GTK_DIR_TAB_BACKWARD)
+ return FALSE;
+
+ focus_child = container->focus_child;
+
+ if (direction == GTK_DIR_TAB_BACKWARD) {
+ children = g_list_last(children);
+ }
+
+ while (children) {
+ child = children->data;
+ if (direction == GTK_DIR_TAB_FORWARD)
+ children = children->next;
+ else
+ children = children->prev;
+
+ if (!child)
+ continue;
+
+ if (focus_child) {
+ if (focus_child == child) {
+ focus_child = NULL;
+
+ if (GTK_WIDGET_DRAWABLE (child) &&
+ GTK_IS_CONTAINER (child) &&
+ !GTK_WIDGET_HAS_FOCUS (child))
+ if (gtk_container_focus (GTK_CONTAINER (child), direction)) {
+ gtk_signal_emit_stop_by_name(GTK_OBJECT(container), "focus");
+ return TRUE;
+ }
+ }
+ }
+ else if (GTK_WIDGET_DRAWABLE (child)) {
+ if (GTK_IS_CONTAINER (child)) {
+ if (gtk_container_focus (GTK_CONTAINER (child), direction)) {
+ gtk_signal_emit_stop_by_name(GTK_OBJECT(container), "focus");
+ return TRUE;
+ }
+ }
+ else if (GTK_WIDGET_CAN_FOCUS (child)) {
+ gtk_widget_grab_focus (child);
+ gtk_signal_emit_stop_by_name(GTK_OBJECT(container), "focus");
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+gint
+e_container_change_tab_order(GtkContainer *container, GList *widgets)
+{
+ GList *list;
+ list = g_list_copy(widgets);
+ g_list_foreach(list, (GFunc) gtk_object_ref, NULL);
+ return gtk_signal_connect_full(GTK_OBJECT(container), "focus",
+ GTK_SIGNAL_FUNC(e_container_change_tab_order_callback),
+ NULL, list,
+ e_container_change_tab_order_destroy_notify,
+ FALSE, FALSE);
+}
diff --git a/e-util/e-gui-utils.h b/e-util/e-gui-utils.h
index c1958879aa..1d47a7b514 100644
--- a/e-util/e-gui-utils.h
+++ b/e-util/e-gui-utils.h
@@ -13,6 +13,7 @@ GtkWidget *e_create_image_widget (gchar *name, gchar *string1, gchar *string
void e_container_foreach_leaf (GtkContainer *container,
GtkCallback callback,
gpointer closure);
-
+gint e_container_change_tab_order (GtkContainer *container,
+ GList *widgets);
#endif /* E_GUI_UTILS_H */