aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/misc
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/misc')
-rw-r--r--widgets/misc/e-canvas.c68
-rw-r--r--widgets/misc/e-canvas.h61
2 files changed, 111 insertions, 18 deletions
diff --git a/widgets/misc/e-canvas.c b/widgets/misc/e-canvas.c
index 378bc31e56..e5b0b78bcd 100644
--- a/widgets/misc/e-canvas.c
+++ b/widgets/misc/e-canvas.c
@@ -24,6 +24,8 @@
#include <gtk/gtksignal.h>
#include "e-canvas.h"
#include "gal/util/e-util.h"
+#include <X11/Xlib.h>
+#include <gtk/gtkmain.h>
static void e_canvas_init (ECanvas *card);
static void e_canvas_destroy (GtkObject *object);
@@ -1082,3 +1084,69 @@ void e_canvas_hide_tooltip (ECanvas *canvas)
canvas->tooltip_window = NULL;
}
}
+
+
+static gboolean
+grab_cancelled_check (gpointer data)
+{
+ ECanvas *canvas = data;
+
+ if (gtk_grab_get_current ()) {
+ gnome_canvas_item_ungrab(GNOME_CANVAS (canvas)->grabbed_item, canvas->grab_cancelled_time);
+ if (canvas->grab_cancelled_cb) {
+ canvas->grab_cancelled_cb (canvas,
+ GNOME_CANVAS (canvas)->grabbed_item,
+ canvas->grab_cancelled_data);
+ }
+ canvas->grab_cancelled_cb = NULL;
+ canvas->grab_cancelled_check_id = 0;
+ canvas->grab_cancelled_time = 0;
+ canvas->grab_cancelled_data = NULL;
+ return FALSE;
+ }
+ return TRUE;
+}
+
+int
+e_canvas_item_grab (ECanvas *canvas,
+ GnomeCanvasItem *item,
+ guint event_mask,
+ GdkCursor *cursor,
+ guint32 etime,
+ ECanvasItemGrabCancelled cancelled_cb,
+ gpointer cancelled_data)
+{
+ if (gtk_grab_get_current ()) {
+ return AlreadyGrabbed;
+ } else {
+ int ret_val = gnome_canvas_item_grab (item, event_mask, cursor, etime);
+ if (ret_val == GrabSuccess) {
+ canvas->grab_cancelled_cb = cancelled_cb;
+ canvas->grab_cancelled_check_id =
+ g_timeout_add_full (G_PRIORITY_LOW,
+ 100,
+ grab_cancelled_check,
+ canvas,
+ NULL);
+ canvas->grab_cancelled_time = etime;
+ canvas->grab_cancelled_data = cancelled_data;
+ }
+
+ return ret_val;
+ }
+}
+
+void
+e_canvas_item_ungrab (ECanvas *canvas,
+ GnomeCanvasItem *item,
+ guint32 etime)
+{
+ if (canvas->grab_cancelled_check_id) {
+ g_source_remove (canvas->grab_cancelled_check_id);
+ canvas->grab_cancelled_cb = NULL;
+ canvas->grab_cancelled_check_id = 0;
+ canvas->grab_cancelled_time = 0;
+ canvas->grab_cancelled_data = NULL;
+ gnome_canvas_item_ungrab (item, etime);
+ }
+}
diff --git a/widgets/misc/e-canvas.h b/widgets/misc/e-canvas.h
index ee25a4b6bf..fb0d7398e7 100644
--- a/widgets/misc/e-canvas.h
+++ b/widgets/misc/e-canvas.h
@@ -74,6 +74,8 @@ typedef struct {
gpointer id;
} ECanvasSelectionInfo;
+typedef void (*ECanvasItemGrabCancelled) (ECanvas *canvas, GnomeCanvasItem *item, gpointer data);
+
struct _ECanvas
{
GnomeCanvas parent;
@@ -90,6 +92,11 @@ struct _ECanvas
/* Input context for dead key support */
GdkIC *ic;
GdkICAttr *ic_attr;
+
+ ECanvasItemGrabCancelled grab_cancelled_cb;
+ guint grab_cancelled_check_id;
+ guint32 grab_cancelled_time;
+ gpointer grab_cancelled_data;
};
struct _ECanvasClass
@@ -99,30 +106,48 @@ struct _ECanvasClass
};
-GtkType e_canvas_get_type (void);
-GtkWidget *e_canvas_new (void);
+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, gboolean widget_too);
-
-void e_canvas_item_request_reflow (GnomeCanvasItem *item);
-void e_canvas_item_request_parent_reflow (GnomeCanvasItem *item);
-void e_canvas_item_set_reflow_callback (GnomeCanvasItem *item, ECanvasItemReflowFunc func);
-
-void e_canvas_item_set_selection_callback (GnomeCanvasItem *item, ECanvasItemSelectionFunc func);
-void e_canvas_item_set_selection_compare_callback (GnomeCanvasItem *item, ECanvasItemSelectionCompareFunc func);
-
-void e_canvas_item_set_cursor (GnomeCanvasItem *item, gpointer id);
-void e_canvas_item_add_selection (GnomeCanvasItem *item, gpointer id);
-void e_canvas_item_remove_selection (GnomeCanvasItem *item, gpointer id);
+void e_canvas_item_grab_focus (GnomeCanvasItem *item,
+ gboolean widget_too);
+void e_canvas_item_request_reflow (GnomeCanvasItem *item);
+void e_canvas_item_request_parent_reflow (GnomeCanvasItem *item);
+void e_canvas_item_set_reflow_callback (GnomeCanvasItem *item,
+ ECanvasItemReflowFunc func);
+void e_canvas_item_set_selection_callback (GnomeCanvasItem *item,
+ ECanvasItemSelectionFunc func);
+void e_canvas_item_set_selection_compare_callback (GnomeCanvasItem *item,
+ ECanvasItemSelectionCompareFunc func);
+void e_canvas_item_set_cursor (GnomeCanvasItem *item,
+ gpointer id);
+void e_canvas_item_add_selection (GnomeCanvasItem *item,
+ gpointer id);
+void e_canvas_item_remove_selection (GnomeCanvasItem *item,
+ gpointer id);
+
+int e_canvas_item_grab (ECanvas *canvas,
+ GnomeCanvasItem *item,
+ guint event_mask,
+ GdkCursor *cursor,
+ guint32 etime,
+ ECanvasItemGrabCancelled cancelled,
+ gpointer cancelled_data);
+void e_canvas_item_ungrab (ECanvas *canvas,
+ GnomeCanvasItem *item,
+ guint32 etime);
/* Not implemented yet. */
-void e_canvas_item_set_cursor_end (GnomeCanvasItem *item, gpointer id);
-
-void e_canvas_popup_tooltip (ECanvas *canvas, GtkWidget *widget, int x, int y);
-void e_canvas_hide_tooltip (ECanvas *canvas);
+void e_canvas_item_set_cursor_end (GnomeCanvasItem *item,
+ gpointer id);
+void e_canvas_popup_tooltip (ECanvas *canvas,
+ GtkWidget *widget,
+ int x,
+ int y);
+void e_canvas_hide_tooltip (ECanvas *canvas);
#ifdef __cplusplus
}