aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--addressbook/gui/minicard/e-minicard-label.c3
-rw-r--r--addressbook/gui/minicard/e-minicard.c5
-rw-r--r--addressbook/gui/widgets/e-minicard-label.c3
-rw-r--r--addressbook/gui/widgets/e-minicard.c5
-rw-r--r--e-util/e-canvas.c68
-rw-r--r--e-util/e-canvas.h5
-rw-r--r--widgets/e-canvas.c68
-rw-r--r--widgets/e-canvas.h5
-rw-r--r--widgets/e-minicard-label.c3
-rw-r--r--widgets/e-minicard.c5
-rw-r--r--widgets/e-minicard/e-minicard-label.c3
-rw-r--r--widgets/e-minicard/e-minicard.c5
-rw-r--r--widgets/misc/e-canvas.c68
-rw-r--r--widgets/misc/e-canvas.h5
15 files changed, 248 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 6c4c3ab0e3..a4894ce38e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
2000-01-28 Christopher James Lahey <clahey@helixcode.com>
+ * widgets/e-minicard-label.c, widgets/e-minicard.c: Use
+ e_canvas_item_grab_focus so that it will work with old versions of
+ gnome-canvas.
+
+ * widgets/e-canvas.c, widgets/e-canvas.h: Finished working around
+ focus bugs.
+
+2000-01-28 Christopher James Lahey <clahey@helixcode.com>
+
* widgets/test-reflow.c: Set the minimum_width.
* widgets/e-reflow.h, widgets/e-reflow.c: Added one more column
diff --git a/addressbook/gui/minicard/e-minicard-label.c b/addressbook/gui/minicard/e-minicard-label.c
index 2b0fb3faf8..43603f2d6d 100644
--- a/addressbook/gui/minicard/e-minicard-label.c
+++ b/addressbook/gui/minicard/e-minicard-label.c
@@ -23,6 +23,7 @@
#include <gnome.h>
#include "e-minicard-label.h"
#include "e-text.h"
+#include "e-canvas.h"
static void e_minicard_label_init (EMinicardLabel *card);
static void e_minicard_label_class_init (EMinicardLabelClass *klass);
static void e_minicard_label_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
@@ -152,7 +153,7 @@ e_minicard_label_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
break;
case ARG_HAS_FOCUS:
if (e_minicard_label->field && GTK_VALUE_BOOL(*arg))
- gnome_canvas_item_grab_focus(e_minicard_label->field);
+ e_canvas_item_grab_focus(e_minicard_label->field);
break;
case ARG_FIELD:
if ( e_minicard_label->field )
diff --git a/addressbook/gui/minicard/e-minicard.c b/addressbook/gui/minicard/e-minicard.c
index b6de4b2d0c..b667f1ac21 100644
--- a/addressbook/gui/minicard/e-minicard.c
+++ b/addressbook/gui/minicard/e-minicard.c
@@ -24,6 +24,7 @@
#include "e-minicard.h"
#include "e-minicard-label.h"
#include "e-text.h"
+#include "e-canvas.h"
static void e_minicard_init (EMinicard *card);
static void e_minicard_class_init (EMinicardClass *klass);
static void e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
@@ -153,7 +154,7 @@ e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
"has_focus", GTK_VALUE_BOOL(*arg),
NULL);
else
- gnome_canvas_item_grab_focus(GNOME_CANVAS_ITEM(e_minicard));
+ e_canvas_item_grab_focus(GNOME_CANVAS_ITEM(e_minicard));
break;
case ARG_CARD:
/* e_minicard->card = GTK_VALUE_POINTER (*arg);
@@ -353,7 +354,7 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event)
break;
case GDK_BUTTON_PRESS:
if (event->button.button == 1) {
- gnome_canvas_item_grab_focus(item);
+ e_canvas_item_grab_focus(item);
}
break;
case GDK_KEY_PRESS:
diff --git a/addressbook/gui/widgets/e-minicard-label.c b/addressbook/gui/widgets/e-minicard-label.c
index 2b0fb3faf8..43603f2d6d 100644
--- a/addressbook/gui/widgets/e-minicard-label.c
+++ b/addressbook/gui/widgets/e-minicard-label.c
@@ -23,6 +23,7 @@
#include <gnome.h>
#include "e-minicard-label.h"
#include "e-text.h"
+#include "e-canvas.h"
static void e_minicard_label_init (EMinicardLabel *card);
static void e_minicard_label_class_init (EMinicardLabelClass *klass);
static void e_minicard_label_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
@@ -152,7 +153,7 @@ e_minicard_label_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
break;
case ARG_HAS_FOCUS:
if (e_minicard_label->field && GTK_VALUE_BOOL(*arg))
- gnome_canvas_item_grab_focus(e_minicard_label->field);
+ e_canvas_item_grab_focus(e_minicard_label->field);
break;
case ARG_FIELD:
if ( e_minicard_label->field )
diff --git a/addressbook/gui/widgets/e-minicard.c b/addressbook/gui/widgets/e-minicard.c
index b6de4b2d0c..b667f1ac21 100644
--- a/addressbook/gui/widgets/e-minicard.c
+++ b/addressbook/gui/widgets/e-minicard.c
@@ -24,6 +24,7 @@
#include "e-minicard.h"
#include "e-minicard-label.h"
#include "e-text.h"
+#include "e-canvas.h"
static void e_minicard_init (EMinicard *card);
static void e_minicard_class_init (EMinicardClass *klass);
static void e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
@@ -153,7 +154,7 @@ e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
"has_focus", GTK_VALUE_BOOL(*arg),
NULL);
else
- gnome_canvas_item_grab_focus(GNOME_CANVAS_ITEM(e_minicard));
+ e_canvas_item_grab_focus(GNOME_CANVAS_ITEM(e_minicard));
break;
case ARG_CARD:
/* e_minicard->card = GTK_VALUE_POINTER (*arg);
@@ -353,7 +354,7 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event)
break;
case GDK_BUTTON_PRESS:
if (event->button.button == 1) {
- gnome_canvas_item_grab_focus(item);
+ e_canvas_item_grab_focus(item);
}
break;
case GDK_KEY_PRESS:
diff --git a/e-util/e-canvas.c b/e-util/e-canvas.c
index 74af105b36..850e438386 100644
--- a/e-util/e-canvas.c
+++ b/e-util/e-canvas.c
@@ -27,6 +27,11 @@ static void e_canvas_class_init (ECanvasClass *klass);
static gint e_canvas_key (GtkWidget *widget,
GdkEventKey *event);
+static gint e_canvas_focus_in (GtkWidget *widget,
+ GdkEventFocus *event);
+static gint e_canvas_focus_out (GtkWidget *widget,
+ GdkEventFocus *event);
+
static int emit_event (GnomeCanvas *canvas, GdkEvent *event);
static GnomeCanvasClass *parent_class = NULL;
@@ -71,6 +76,8 @@ e_canvas_class_init (ECanvasClass *klass)
widget_class->key_press_event = e_canvas_key;
widget_class->key_release_event = e_canvas_key;
+ widget_class->focus_in_event = e_canvas_focus_in;
+ widget_class->focus_out_event = e_canvas_focus_out;
}
static void
@@ -231,3 +238,64 @@ e_canvas_key (GtkWidget *widget, GdkEventKey *event)
return emit_event (canvas, (GdkEvent *) event);
}
+
+/**
+ * e_canvas_item_grab_focus:
+ * @item: A canvas item.
+ *
+ * Makes the specified item take the keyboard focus, so all keyboard events will
+ * be sent to it. If the canvas widget itself did not have the focus, it grabs
+ * it as well.
+ **/
+void
+e_canvas_item_grab_focus (GnomeCanvasItem *item)
+{
+ GnomeCanvasItem *focused_item;
+ GdkEvent ev;
+
+ g_return_if_fail (item != NULL);
+ g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
+ g_return_if_fail (GTK_WIDGET_CAN_FOCUS (GTK_WIDGET (item->canvas)));
+
+ focused_item = item->canvas->focused_item;
+
+ if (focused_item) {
+ ev.focus_change.type = GDK_FOCUS_CHANGE;
+ ev.focus_change.window = GTK_LAYOUT (item->canvas)->bin_window;
+ ev.focus_change.send_event = FALSE;
+ ev.focus_change.in = FALSE;
+
+ emit_event (item->canvas, &ev);
+ }
+
+ item->canvas->focused_item = item;
+ gtk_widget_grab_focus (GTK_WIDGET (item->canvas));
+}
+
+/* Focus in handler for the canvas */
+static gint
+e_canvas_focus_in (GtkWidget *widget, GdkEventFocus *event)
+{
+ GnomeCanvas *canvas;
+
+ canvas = GNOME_CANVAS (widget);
+
+ if (canvas->focused_item)
+ return emit_event (canvas, (GdkEvent *) event);
+ else
+ return FALSE;
+}
+
+/* Focus out handler for the canvas */
+static gint
+e_canvas_focus_out (GtkWidget *widget, GdkEventFocus *event)
+{
+ GnomeCanvas *canvas;
+
+ canvas = GNOME_CANVAS (widget);
+
+ if (canvas->focused_item)
+ return emit_event (canvas, (GdkEvent *) event);
+ else
+ return FALSE;
+}
diff --git a/e-util/e-canvas.h b/e-util/e-canvas.h
index 06c3625f3a..0ece5ae3b4 100644
--- a/e-util/e-canvas.h
+++ b/e-util/e-canvas.h
@@ -58,6 +58,11 @@ struct _ECanvasClass
GtkType e_canvas_get_type (void);
GtkWidget *e_canvas_new (void);
+/* Used to send all of the keystroke events to a specific item as well as
+ * GDK_FOCUS_CHANGE events.
+ */
+void e_canvas_item_grab_focus (GnomeCanvasItem *item);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/widgets/e-canvas.c b/widgets/e-canvas.c
index 74af105b36..850e438386 100644
--- a/widgets/e-canvas.c
+++ b/widgets/e-canvas.c
@@ -27,6 +27,11 @@ static void e_canvas_class_init (ECanvasClass *klass);
static gint e_canvas_key (GtkWidget *widget,
GdkEventKey *event);
+static gint e_canvas_focus_in (GtkWidget *widget,
+ GdkEventFocus *event);
+static gint e_canvas_focus_out (GtkWidget *widget,
+ GdkEventFocus *event);
+
static int emit_event (GnomeCanvas *canvas, GdkEvent *event);
static GnomeCanvasClass *parent_class = NULL;
@@ -71,6 +76,8 @@ e_canvas_class_init (ECanvasClass *klass)
widget_class->key_press_event = e_canvas_key;
widget_class->key_release_event = e_canvas_key;
+ widget_class->focus_in_event = e_canvas_focus_in;
+ widget_class->focus_out_event = e_canvas_focus_out;
}
static void
@@ -231,3 +238,64 @@ e_canvas_key (GtkWidget *widget, GdkEventKey *event)
return emit_event (canvas, (GdkEvent *) event);
}
+
+/**
+ * e_canvas_item_grab_focus:
+ * @item: A canvas item.
+ *
+ * Makes the specified item take the keyboard focus, so all keyboard events will
+ * be sent to it. If the canvas widget itself did not have the focus, it grabs
+ * it as well.
+ **/
+void
+e_canvas_item_grab_focus (GnomeCanvasItem *item)
+{
+ GnomeCanvasItem *focused_item;
+ GdkEvent ev;
+
+ g_return_if_fail (item != NULL);
+ g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
+ g_return_if_fail (GTK_WIDGET_CAN_FOCUS (GTK_WIDGET (item->canvas)));
+
+ focused_item = item->canvas->focused_item;
+
+ if (focused_item) {
+ ev.focus_change.type = GDK_FOCUS_CHANGE;
+ ev.focus_change.window = GTK_LAYOUT (item->canvas)->bin_window;
+ ev.focus_change.send_event = FALSE;
+ ev.focus_change.in = FALSE;
+
+ emit_event (item->canvas, &ev);
+ }
+
+ item->canvas->focused_item = item;
+ gtk_widget_grab_focus (GTK_WIDGET (item->canvas));
+}
+
+/* Focus in handler for the canvas */
+static gint
+e_canvas_focus_in (GtkWidget *widget, GdkEventFocus *event)
+{
+ GnomeCanvas *canvas;
+
+ canvas = GNOME_CANVAS (widget);
+
+ if (canvas->focused_item)
+ return emit_event (canvas, (GdkEvent *) event);
+ else
+ return FALSE;
+}
+
+/* Focus out handler for the canvas */
+static gint
+e_canvas_focus_out (GtkWidget *widget, GdkEventFocus *event)
+{
+ GnomeCanvas *canvas;
+
+ canvas = GNOME_CANVAS (widget);
+
+ if (canvas->focused_item)
+ return emit_event (canvas, (GdkEvent *) event);
+ else
+ return FALSE;
+}
diff --git a/widgets/e-canvas.h b/widgets/e-canvas.h
index 06c3625f3a..0ece5ae3b4 100644
--- a/widgets/e-canvas.h
+++ b/widgets/e-canvas.h
@@ -58,6 +58,11 @@ struct _ECanvasClass
GtkType e_canvas_get_type (void);
GtkWidget *e_canvas_new (void);
+/* Used to send all of the keystroke events to a specific item as well as
+ * GDK_FOCUS_CHANGE events.
+ */
+void e_canvas_item_grab_focus (GnomeCanvasItem *item);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/widgets/e-minicard-label.c b/widgets/e-minicard-label.c
index 2b0fb3faf8..43603f2d6d 100644
--- a/widgets/e-minicard-label.c
+++ b/widgets/e-minicard-label.c
@@ -23,6 +23,7 @@
#include <gnome.h>
#include "e-minicard-label.h"
#include "e-text.h"
+#include "e-canvas.h"
static void e_minicard_label_init (EMinicardLabel *card);
static void e_minicard_label_class_init (EMinicardLabelClass *klass);
static void e_minicard_label_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
@@ -152,7 +153,7 @@ e_minicard_label_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
break;
case ARG_HAS_FOCUS:
if (e_minicard_label->field && GTK_VALUE_BOOL(*arg))
- gnome_canvas_item_grab_focus(e_minicard_label->field);
+ e_canvas_item_grab_focus(e_minicard_label->field);
break;
case ARG_FIELD:
if ( e_minicard_label->field )
diff --git a/widgets/e-minicard.c b/widgets/e-minicard.c
index b6de4b2d0c..b667f1ac21 100644
--- a/widgets/e-minicard.c
+++ b/widgets/e-minicard.c
@@ -24,6 +24,7 @@
#include "e-minicard.h"
#include "e-minicard-label.h"
#include "e-text.h"
+#include "e-canvas.h"
static void e_minicard_init (EMinicard *card);
static void e_minicard_class_init (EMinicardClass *klass);
static void e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
@@ -153,7 +154,7 @@ e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
"has_focus", GTK_VALUE_BOOL(*arg),
NULL);
else
- gnome_canvas_item_grab_focus(GNOME_CANVAS_ITEM(e_minicard));
+ e_canvas_item_grab_focus(GNOME_CANVAS_ITEM(e_minicard));
break;
case ARG_CARD:
/* e_minicard->card = GTK_VALUE_POINTER (*arg);
@@ -353,7 +354,7 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event)
break;
case GDK_BUTTON_PRESS:
if (event->button.button == 1) {
- gnome_canvas_item_grab_focus(item);
+ e_canvas_item_grab_focus(item);
}
break;
case GDK_KEY_PRESS:
diff --git a/widgets/e-minicard/e-minicard-label.c b/widgets/e-minicard/e-minicard-label.c
index 2b0fb3faf8..43603f2d6d 100644
--- a/widgets/e-minicard/e-minicard-label.c
+++ b/widgets/e-minicard/e-minicard-label.c
@@ -23,6 +23,7 @@
#include <gnome.h>
#include "e-minicard-label.h"
#include "e-text.h"
+#include "e-canvas.h"
static void e_minicard_label_init (EMinicardLabel *card);
static void e_minicard_label_class_init (EMinicardLabelClass *klass);
static void e_minicard_label_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
@@ -152,7 +153,7 @@ e_minicard_label_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
break;
case ARG_HAS_FOCUS:
if (e_minicard_label->field && GTK_VALUE_BOOL(*arg))
- gnome_canvas_item_grab_focus(e_minicard_label->field);
+ e_canvas_item_grab_focus(e_minicard_label->field);
break;
case ARG_FIELD:
if ( e_minicard_label->field )
diff --git a/widgets/e-minicard/e-minicard.c b/widgets/e-minicard/e-minicard.c
index b6de4b2d0c..b667f1ac21 100644
--- a/widgets/e-minicard/e-minicard.c
+++ b/widgets/e-minicard/e-minicard.c
@@ -24,6 +24,7 @@
#include "e-minicard.h"
#include "e-minicard-label.h"
#include "e-text.h"
+#include "e-canvas.h"
static void e_minicard_init (EMinicard *card);
static void e_minicard_class_init (EMinicardClass *klass);
static void e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
@@ -153,7 +154,7 @@ e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id)
"has_focus", GTK_VALUE_BOOL(*arg),
NULL);
else
- gnome_canvas_item_grab_focus(GNOME_CANVAS_ITEM(e_minicard));
+ e_canvas_item_grab_focus(GNOME_CANVAS_ITEM(e_minicard));
break;
case ARG_CARD:
/* e_minicard->card = GTK_VALUE_POINTER (*arg);
@@ -353,7 +354,7 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event)
break;
case GDK_BUTTON_PRESS:
if (event->button.button == 1) {
- gnome_canvas_item_grab_focus(item);
+ e_canvas_item_grab_focus(item);
}
break;
case GDK_KEY_PRESS:
diff --git a/widgets/misc/e-canvas.c b/widgets/misc/e-canvas.c
index 74af105b36..850e438386 100644
--- a/widgets/misc/e-canvas.c
+++ b/widgets/misc/e-canvas.c
@@ -27,6 +27,11 @@ static void e_canvas_class_init (ECanvasClass *klass);
static gint e_canvas_key (GtkWidget *widget,
GdkEventKey *event);
+static gint e_canvas_focus_in (GtkWidget *widget,
+ GdkEventFocus *event);
+static gint e_canvas_focus_out (GtkWidget *widget,
+ GdkEventFocus *event);
+
static int emit_event (GnomeCanvas *canvas, GdkEvent *event);
static GnomeCanvasClass *parent_class = NULL;
@@ -71,6 +76,8 @@ e_canvas_class_init (ECanvasClass *klass)
widget_class->key_press_event = e_canvas_key;
widget_class->key_release_event = e_canvas_key;
+ widget_class->focus_in_event = e_canvas_focus_in;
+ widget_class->focus_out_event = e_canvas_focus_out;
}
static void
@@ -231,3 +238,64 @@ e_canvas_key (GtkWidget *widget, GdkEventKey *event)
return emit_event (canvas, (GdkEvent *) event);
}
+
+/**
+ * e_canvas_item_grab_focus:
+ * @item: A canvas item.
+ *
+ * Makes the specified item take the keyboard focus, so all keyboard events will
+ * be sent to it. If the canvas widget itself did not have the focus, it grabs
+ * it as well.
+ **/
+void
+e_canvas_item_grab_focus (GnomeCanvasItem *item)
+{
+ GnomeCanvasItem *focused_item;
+ GdkEvent ev;
+
+ g_return_if_fail (item != NULL);
+ g_return_if_fail (GNOME_IS_CANVAS_ITEM (item));
+ g_return_if_fail (GTK_WIDGET_CAN_FOCUS (GTK_WIDGET (item->canvas)));
+
+ focused_item = item->canvas->focused_item;
+
+ if (focused_item) {
+ ev.focus_change.type = GDK_FOCUS_CHANGE;
+ ev.focus_change.window = GTK_LAYOUT (item->canvas)->bin_window;
+ ev.focus_change.send_event = FALSE;
+ ev.focus_change.in = FALSE;
+
+ emit_event (item->canvas, &ev);
+ }
+
+ item->canvas->focused_item = item;
+ gtk_widget_grab_focus (GTK_WIDGET (item->canvas));
+}
+
+/* Focus in handler for the canvas */
+static gint
+e_canvas_focus_in (GtkWidget *widget, GdkEventFocus *event)
+{
+ GnomeCanvas *canvas;
+
+ canvas = GNOME_CANVAS (widget);
+
+ if (canvas->focused_item)
+ return emit_event (canvas, (GdkEvent *) event);
+ else
+ return FALSE;
+}
+
+/* Focus out handler for the canvas */
+static gint
+e_canvas_focus_out (GtkWidget *widget, GdkEventFocus *event)
+{
+ GnomeCanvas *canvas;
+
+ canvas = GNOME_CANVAS (widget);
+
+ if (canvas->focused_item)
+ return emit_event (canvas, (GdkEvent *) event);
+ else
+ return FALSE;
+}
diff --git a/widgets/misc/e-canvas.h b/widgets/misc/e-canvas.h
index 06c3625f3a..0ece5ae3b4 100644
--- a/widgets/misc/e-canvas.h
+++ b/widgets/misc/e-canvas.h
@@ -58,6 +58,11 @@ struct _ECanvasClass
GtkType e_canvas_get_type (void);
GtkWidget *e_canvas_new (void);
+/* Used to send all of the keystroke events to a specific item as well as
+ * GDK_FOCUS_CHANGE events.
+ */
+void e_canvas_item_grab_focus (GnomeCanvasItem *item);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */