Tue, 07 May 2013 05:04:46 -0400
Rewrite debug window filter in JS.
Note, this does cause a couple regressions, but they are probably not
that big a deal. First, the JS regular expression syntax is slightly
different. Second, the JS regex API lacks a way to reliably determine
the location of matched groups, so we can't highlight just the groups
and must highlight the entire expression.
I suspect that none of our users ever had to use any fancy regex in the
debug window, and that most of our developers didn't even know it could
be done. So I doubt these regressions will cause much pain.
| 4390 | 1 | /* |
| 2 | GNOME stroke implementation | |
| 3 | Copyright (c) 2000, 2001 Dan Nicolaescu | |
| 4 | See the file COPYING for distribution information. | |
| 5 | */ | |
| 6 | ||
| 7 | #include "config.h" | |
| 8 | ||
| 9 | #include <unistd.h> | |
| 10 | #include <stdlib.h> | |
| 11 | #include <stdio.h> | |
| 12 | #include <glib.h> | |
| 13 | #include <gtk/gtk.h> | |
|
20800
76183d18c059
Fix building the gestures plugin.
Daniel Atallah <datallah@pidgin.im>
parents:
20796
diff
changeset
|
14 | #include <gdk/gdkx.h> |
| 4390 | 15 | |
| 16 | #include "gstroke.h" | |
| 17 | #include "gstroke-internal.h" | |
| 18 | ||
| 19 | #include <X11/Xlib.h> | |
| 20 | #include <X11/Xutil.h> | |
| 21 | ||
|
33170
ce4447562d64
Add checks for old GTK+2 stuff.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33133
diff
changeset
|
22 | #include "gtk3compat.h" |
|
ce4447562d64
Add checks for old GTK+2 stuff.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33133
diff
changeset
|
23 | |
| 4390 | 24 | static void gstroke_invisible_window_init (GtkWidget *widget); |
| 25 | /*FIXME: Maybe these should be put in a structure, and not static...*/ | |
|
4529
7e59b197d10d
[gaim-migrate @ 4807]
Christian Hammond <chipx86@chipx86.com>
parents:
4432
diff
changeset
|
26 | static Display * gstroke_disp = NULL; |
| 4390 | 27 | static Window gstroke_window; |
| 28 | static GC gstroke_gc; | |
| 29 | static int mouse_button = 2; | |
| 30 | static gboolean draw_strokes = FALSE; | |
| 31 | ||
| 32 | #define GSTROKE_TIMEOUT_DURATION 10 | |
| 33 | ||
| 34 | #define GSTROKE_SIGNALS "gstroke_signals" | |
| 35 | ||
| 36 | struct gstroke_func_and_data { | |
|
9855
7c63808983ad
[gaim-migrate @ 10734]
Mark Doliner <markdoliner@pidgin.im>
parents:
9843
diff
changeset
|
37 | void (*func)(GtkWidget *, void *); |
|
7c63808983ad
[gaim-migrate @ 10734]
Mark Doliner <markdoliner@pidgin.im>
parents:
9843
diff
changeset
|
38 | gpointer data; |
| 4390 | 39 | }; |
| 40 | ||
| 41 | ||
| 42 | /*FIXME: maybe it's better to just make 2 static variables, not a | |
| 43 | structure */ | |
| 44 | struct mouse_position { | |
|
9855
7c63808983ad
[gaim-migrate @ 10734]
Mark Doliner <markdoliner@pidgin.im>
parents:
9843
diff
changeset
|
45 | struct s_point last_point; |
|
7c63808983ad
[gaim-migrate @ 10734]
Mark Doliner <markdoliner@pidgin.im>
parents:
9843
diff
changeset
|
46 | gboolean invalid; |
| 4390 | 47 | }; |
| 48 | ||
| 49 | ||
| 50 | static struct mouse_position last_mouse_position; | |
| 51 | static guint timer_id; | |
| 52 | ||
| 53 | static void gstroke_execute (GtkWidget *widget, const gchar *name); | |
| 54 | ||
| 55 | static void | |
| 56 | record_stroke_segment (GtkWidget *widget) | |
| 57 | { | |
| 58 | gint x, y; | |
| 59 | struct gstroke_metrics *metrics; | |
| 60 | ||
|
9843
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
61 | g_return_if_fail( widget != NULL ); |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
62 | |
| 4390 | 63 | gtk_widget_get_pointer (widget, &x, &y); |
| 64 | ||
| 65 | if (last_mouse_position.invalid) | |
| 66 | last_mouse_position.invalid = FALSE; | |
| 67 | else if (gstroke_draw_strokes()) | |
| 68 | { | |
| 69 | #if 1 | |
| 70 | XDrawLine (gstroke_disp, gstroke_window, gstroke_gc, | |
| 71 | last_mouse_position.last_point.x, | |
| 72 | last_mouse_position.last_point.y, | |
| 73 | x, y); | |
| 74 | /* XFlush (gstroke_disp); */ | |
| 75 | #else | |
| 76 | /* FIXME: this does not work. It will only work if we create a | |
| 77 | corresponding GDK window for stroke_window and draw on | |
| 78 | that... */ | |
|
30010
2b3e5bbd0492
Prepare Pidgin plugins for GTK+3.0. They're almost GSeal-compliant, except
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
20800
diff
changeset
|
79 | gdk_draw_line (gtk_widget_get_window(widget), |
|
2b3e5bbd0492
Prepare Pidgin plugins for GTK+3.0. They're almost GSeal-compliant, except
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
20800
diff
changeset
|
80 | widget->style->fg_gc[GTK_STATE_NORMAL], |
| 4390 | 81 | last_mouse_position.last_point.x, |
| 82 | last_mouse_position.last_point.y, | |
| 83 | x, | |
| 84 | y); | |
| 85 | #endif | |
| 86 | } | |
| 87 | ||
| 88 | if (last_mouse_position.last_point.x != x | |
| 89 | || last_mouse_position.last_point.y != y) | |
| 90 | { | |
| 91 | last_mouse_position.last_point.x = x; | |
| 92 | last_mouse_position.last_point.y = y; | |
| 93 | metrics = (struct gstroke_metrics *)g_object_get_data(G_OBJECT(widget), | |
| 94 | GSTROKE_METRICS); | |
| 95 | _gstroke_record (x, y, metrics); | |
| 96 | } | |
| 97 | } | |
| 98 | ||
| 99 | static gint | |
| 100 | gstroke_timeout (gpointer data) | |
| 101 | { | |
|
9855
7c63808983ad
[gaim-migrate @ 10734]
Mark Doliner <markdoliner@pidgin.im>
parents:
9843
diff
changeset
|
102 | GtkWidget *widget; |
|
7c63808983ad
[gaim-migrate @ 10734]
Mark Doliner <markdoliner@pidgin.im>
parents:
9843
diff
changeset
|
103 | |
|
7c63808983ad
[gaim-migrate @ 10734]
Mark Doliner <markdoliner@pidgin.im>
parents:
9843
diff
changeset
|
104 | g_return_val_if_fail(data != NULL, FALSE); |
| 4390 | 105 | |
|
9855
7c63808983ad
[gaim-migrate @ 10734]
Mark Doliner <markdoliner@pidgin.im>
parents:
9843
diff
changeset
|
106 | widget = GTK_WIDGET (data); |
|
7c63808983ad
[gaim-migrate @ 10734]
Mark Doliner <markdoliner@pidgin.im>
parents:
9843
diff
changeset
|
107 | record_stroke_segment (widget); |
|
7c63808983ad
[gaim-migrate @ 10734]
Mark Doliner <markdoliner@pidgin.im>
parents:
9843
diff
changeset
|
108 | |
|
7c63808983ad
[gaim-migrate @ 10734]
Mark Doliner <markdoliner@pidgin.im>
parents:
9843
diff
changeset
|
109 | return TRUE; |
| 4390 | 110 | } |
| 111 | ||
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
30010
diff
changeset
|
112 | static void gstroke_cancel(GdkEvent *event) |
|
9843
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
113 | { |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
114 | last_mouse_position.invalid = TRUE; |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
115 | |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
116 | if (timer_id > 0) |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
117 | g_source_remove (timer_id); |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
118 | |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
119 | timer_id = 0; |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
120 | |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
121 | if( event != NULL ) |
|
33270
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
122 | #if GTK_CHECK_VERSION(3,0,0) |
|
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
123 | gdk_device_ungrab(gdk_event_get_device(event), event->button.time); |
|
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
124 | #else |
|
9843
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
125 | gdk_pointer_ungrab (event->button.time); |
|
33270
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
126 | #endif |
|
9843
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
127 | |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
128 | if (gstroke_draw_strokes() && gstroke_disp != NULL) { |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
129 | /* get rid of the invisible stroke window */ |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
130 | XUnmapWindow (gstroke_disp, gstroke_window); |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
131 | XFlush (gstroke_disp); |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
132 | } |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
133 | |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
134 | } |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
135 | |
| 4390 | 136 | static gint |
| 137 | process_event (GtkWidget *widget, GdkEvent *event, gpointer data G_GNUC_UNUSED) | |
| 138 | { | |
| 139 | static GtkWidget *original_widget = NULL; | |
|
5861
9311ed5b8492
[gaim-migrate @ 6292]
Christian Hammond <chipx86@chipx86.com>
parents:
5227
diff
changeset
|
140 | static GdkCursor *cursor = NULL; |
|
9311ed5b8492
[gaim-migrate @ 6292]
Christian Hammond <chipx86@chipx86.com>
parents:
5227
diff
changeset
|
141 | |
| 4390 | 142 | switch (event->type) { |
| 143 | case GDK_BUTTON_PRESS: | |
|
9843
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
144 | if (event->button.button != gstroke_get_mouse_button()) { |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
145 | /* Similar to the bug below catch when any other button is |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
146 | * clicked after the middle button is clicked (but possibly |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
147 | * not released) |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
148 | */ |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
30010
diff
changeset
|
149 | gstroke_cancel(event); |
|
9843
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
150 | original_widget = NULL; |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
151 | break; |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
152 | } |
| 4390 | 153 | |
| 154 | original_widget = widget; /* remeber the widget where | |
| 155 | the stroke started */ | |
| 156 | ||
| 157 | gstroke_invisible_window_init (widget); | |
| 158 | ||
| 159 | record_stroke_segment (widget); | |
| 160 | ||
|
5861
9311ed5b8492
[gaim-migrate @ 6292]
Christian Hammond <chipx86@chipx86.com>
parents:
5227
diff
changeset
|
161 | if (cursor == NULL) |
|
9311ed5b8492
[gaim-migrate @ 6292]
Christian Hammond <chipx86@chipx86.com>
parents:
5227
diff
changeset
|
162 | cursor = gdk_cursor_new(GDK_PENCIL); |
|
9311ed5b8492
[gaim-migrate @ 6292]
Christian Hammond <chipx86@chipx86.com>
parents:
5227
diff
changeset
|
163 | |
|
33270
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
164 | #if GTK_CHECK_VERSION(3,0,0) |
|
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
165 | gdk_device_grab(gdk_event_get_device(event), |
|
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
166 | gtk_widget_get_window(widget), GDK_OWNERSHIP_WINDOW, |
|
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
167 | FALSE, GDK_BUTTON_RELEASE_MASK, cursor, |
|
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
168 | event->button.time); |
|
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
169 | #else |
|
30010
2b3e5bbd0492
Prepare Pidgin plugins for GTK+3.0. They're almost GSeal-compliant, except
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
20800
diff
changeset
|
170 | gdk_pointer_grab (gtk_widget_get_window(widget), FALSE, |
|
5861
9311ed5b8492
[gaim-migrate @ 6292]
Christian Hammond <chipx86@chipx86.com>
parents:
5227
diff
changeset
|
171 | GDK_BUTTON_RELEASE_MASK, NULL, cursor, |
| 4390 | 172 | event->button.time); |
|
33270
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
173 | #endif |
| 8555 | 174 | timer_id = g_timeout_add (GSTROKE_TIMEOUT_DURATION, |
| 4390 | 175 | gstroke_timeout, widget); |
| 176 | return TRUE; | |
| 177 | ||
| 178 | case GDK_BUTTON_RELEASE: | |
| 179 | if ((event->button.button != gstroke_get_mouse_button()) | |
|
4399
c021f4365b91
[gaim-migrate @ 4668]
Christian Hammond <chipx86@chipx86.com>
parents:
4390
diff
changeset
|
180 | || (original_widget == NULL)) { |
|
c021f4365b91
[gaim-migrate @ 4668]
Christian Hammond <chipx86@chipx86.com>
parents:
4390
diff
changeset
|
181 | |
|
9843
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
182 | /* Nice bug when you hold down one button and press another. */ |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
183 | /* We'll just cancel the gesture instead. */ |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
184 | gstroke_cancel(event); |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
185 | original_widget = NULL; |
|
4daa0a6b2dd0
[gaim-migrate @ 10721]
Dave West <kat@users.sourceforge.net>
parents:
8555
diff
changeset
|
186 | break; |
|
4399
c021f4365b91
[gaim-migrate @ 4668]
Christian Hammond <chipx86@chipx86.com>
parents:
4390
diff
changeset
|
187 | } |
| 4390 | 188 | |
| 189 | last_mouse_position.invalid = TRUE; | |
| 190 | original_widget = NULL; | |
| 8555 | 191 | g_source_remove (timer_id); |
|
33270
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
192 | #if GTK_CHECK_VERSION(3,0,0) |
|
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
193 | gdk_device_ungrab(gdk_event_get_device(event), event->button.time); |
|
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
194 | #else |
| 4390 | 195 | gdk_pointer_ungrab (event->button.time); |
|
33270
a6493d38dc28
Use GdkDevice instead of keyboard and pointer grabs.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
33170
diff
changeset
|
196 | #endif |
| 4390 | 197 | timer_id = 0; |
| 198 | ||
| 199 | { | |
| 200 | char result[GSTROKE_MAX_SEQUENCE]; | |
| 201 | struct gstroke_metrics *metrics; | |
| 202 | ||
| 203 | metrics = (struct gstroke_metrics *)g_object_get_data(G_OBJECT (widget), | |
| 204 | GSTROKE_METRICS); | |
| 205 | if (gstroke_draw_strokes()) { | |
| 206 | /* get rid of the invisible stroke window */ | |
| 207 | XUnmapWindow (gstroke_disp, gstroke_window); | |
| 208 | XFlush (gstroke_disp); | |
| 209 | } | |
| 210 | ||
| 211 | _gstroke_canonical (result, metrics); | |
| 212 | gstroke_execute (widget, result); | |
| 213 | } | |
|
12204
77be85a65fe8
[gaim-migrate @ 14506]
Richard Laager <rlaager@pidgin.im>
parents:
10814
diff
changeset
|
214 | return FALSE; |
|
77be85a65fe8
[gaim-migrate @ 14506]
Richard Laager <rlaager@pidgin.im>
parents:
10814
diff
changeset
|
215 | |
| 4390 | 216 | default: |
| 217 | break; | |
| 218 | } | |
| 219 | ||
| 220 | return FALSE; | |
| 221 | } | |
| 222 | ||
| 223 | void | |
| 224 | gstroke_set_draw_strokes(gboolean draw) | |
| 225 | { | |
| 226 | draw_strokes = draw; | |
| 227 | } | |
| 228 | ||
| 229 | gboolean | |
| 230 | gstroke_draw_strokes(void) | |
| 231 | { | |
| 232 | return draw_strokes; | |
| 233 | } | |
| 234 | ||
| 235 | void | |
| 236 | gstroke_set_mouse_button(gint button) | |
| 237 | { | |
| 238 | mouse_button = button; | |
| 239 | } | |
| 240 | ||
| 7631 | 241 | guint |
| 4390 | 242 | gstroke_get_mouse_button(void) |
| 243 | { | |
| 244 | return mouse_button; | |
| 245 | } | |
| 246 | ||
| 247 | void | |
| 248 | gstroke_enable (GtkWidget *widget) | |
| 249 | { | |
| 250 | struct gstroke_metrics* | |
| 251 | metrics = (struct gstroke_metrics *)g_object_get_data(G_OBJECT(widget), | |
| 252 | GSTROKE_METRICS); | |
| 253 | if (metrics == NULL) | |
| 254 | { | |
| 255 | metrics = (struct gstroke_metrics *)g_malloc (sizeof | |
| 256 | (struct gstroke_metrics)); | |
| 257 | metrics->pointList = NULL; | |
| 258 | metrics->min_x = 10000; | |
| 259 | metrics->min_y = 10000; | |
| 260 | metrics->max_x = 0; | |
| 261 | metrics->max_y = 0; | |
| 262 | metrics->point_count = 0; | |
| 263 | ||
| 264 | g_object_set_data(G_OBJECT(widget), GSTROKE_METRICS, metrics); | |
| 265 | ||
| 266 | g_signal_connect(G_OBJECT(widget), "event", | |
| 267 | G_CALLBACK(process_event), NULL); | |
| 268 | } | |
| 269 | else | |
| 270 | _gstroke_init (metrics); | |
| 271 | ||
| 272 | last_mouse_position.invalid = TRUE; | |
| 273 | } | |
| 274 | ||
|
12667
1677da671689
[gaim-migrate @ 15010]
Richard Laager <rlaager@pidgin.im>
parents:
12204
diff
changeset
|
275 | void |
|
1677da671689
[gaim-migrate @ 15010]
Richard Laager <rlaager@pidgin.im>
parents:
12204
diff
changeset
|
276 | gstroke_disable(GtkWidget *widget) |
|
1677da671689
[gaim-migrate @ 15010]
Richard Laager <rlaager@pidgin.im>
parents:
12204
diff
changeset
|
277 | { |
|
1677da671689
[gaim-migrate @ 15010]
Richard Laager <rlaager@pidgin.im>
parents:
12204
diff
changeset
|
278 | g_signal_handlers_disconnect_by_func(G_OBJECT(widget), G_CALLBACK(process_event), NULL); |
|
1677da671689
[gaim-migrate @ 15010]
Richard Laager <rlaager@pidgin.im>
parents:
12204
diff
changeset
|
279 | } |
|
1677da671689
[gaim-migrate @ 15010]
Richard Laager <rlaager@pidgin.im>
parents:
12204
diff
changeset
|
280 | |
| 4390 | 281 | guint |
| 282 | gstroke_signal_connect (GtkWidget *widget, | |
| 283 | const gchar *name, | |
| 284 | void (*func)(GtkWidget *widget, void *data), | |
| 285 | gpointer data) | |
| 286 | { | |
| 287 | struct gstroke_func_and_data *func_and_data; | |
| 288 | GHashTable *hash_table = | |
| 289 | (GHashTable*)g_object_get_data(G_OBJECT(widget), GSTROKE_SIGNALS); | |
| 290 | ||
| 291 | if (!hash_table) | |
| 292 | { | |
| 293 | hash_table = g_hash_table_new (g_str_hash, g_str_equal); | |
| 294 | g_object_set_data(G_OBJECT(widget), GSTROKE_SIGNALS, | |
| 295 | (gpointer)hash_table); | |
| 296 | } | |
| 297 | func_and_data = g_new (struct gstroke_func_and_data, 1); | |
| 298 | func_and_data->func = func; | |
| 299 | func_and_data->data = data; | |
| 300 | g_hash_table_insert (hash_table, (gpointer)name, (gpointer)func_and_data); | |
| 301 | return TRUE; | |
| 302 | } | |
| 303 | ||
| 304 | static void | |
| 305 | gstroke_execute (GtkWidget *widget, const gchar *name) | |
| 306 | { | |
| 307 | ||
| 308 | GHashTable *hash_table = | |
| 309 | (GHashTable*)g_object_get_data(G_OBJECT(widget), GSTROKE_SIGNALS); | |
| 310 | ||
| 311 | #if 0 | |
| 15884 | 312 | purple_debug(PURPLE_DEBUG_MISC, "gestures", "gstroke %s\n", name); |
| 4390 | 313 | #endif |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
30010
diff
changeset
|
314 | |
| 4390 | 315 | if (hash_table) |
| 316 | { | |
| 317 | struct gstroke_func_and_data *fd = | |
| 318 | (struct gstroke_func_and_data*)g_hash_table_lookup (hash_table, name); | |
| 319 | if (fd) | |
| 320 | (*fd->func)(widget, fd->data); | |
| 321 | } | |
| 322 | } | |
| 323 | ||
| 324 | void | |
| 325 | gstroke_cleanup (GtkWidget *widget) | |
| 326 | { | |
| 327 | struct gstroke_metrics *metrics; | |
| 328 | GHashTable *hash_table = | |
| 329 | (GHashTable*)g_object_get_data(G_OBJECT(widget), GSTROKE_SIGNALS); | |
| 330 | if (hash_table) | |
| 331 | /* FIXME: does this delete the elements too? */ | |
| 332 | g_hash_table_destroy (hash_table); | |
| 333 | ||
| 334 | g_object_steal_data(G_OBJECT(widget), GSTROKE_SIGNALS); | |
| 335 | ||
| 336 | metrics = (struct gstroke_metrics*)g_object_get_data(G_OBJECT(widget), | |
| 337 | GSTROKE_METRICS); | |
| 338 | if (metrics) | |
| 339 | g_free (metrics); | |
| 340 | g_object_steal_data(G_OBJECT(widget), GSTROKE_METRICS); | |
| 341 | } | |
| 342 | ||
| 343 | ||
| 10814 | 344 | /* This function should be written using GTK+ primitives*/ |
| 4390 | 345 | static void |
| 346 | gstroke_invisible_window_init (GtkWidget *widget) | |
| 347 | { | |
| 348 | XSetWindowAttributes w_attr; | |
| 349 | XWindowAttributes orig_w_attr; | |
| 350 | unsigned long mask, col_border, col_background; | |
| 351 | unsigned int border_width; | |
| 352 | XSizeHints hints; | |
|
30010
2b3e5bbd0492
Prepare Pidgin plugins for GTK+3.0. They're almost GSeal-compliant, except
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
20800
diff
changeset
|
353 | Display *disp = GDK_WINDOW_XDISPLAY(gtk_widget_get_window(widget)); |
|
33133
9a31f084f259
Fix some merge errors.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
32438
diff
changeset
|
354 | Window wind = gdk_x11_window_get_xid(gtk_widget_get_window(widget)); |
| 4390 | 355 | int screen = DefaultScreen (disp); |
| 356 | ||
| 357 | if (!gstroke_draw_strokes()) | |
| 358 | return; | |
| 359 | ||
| 360 | gstroke_disp = disp; | |
| 361 | ||
| 362 | /* X server should save what's underneath */ | |
| 363 | XGetWindowAttributes (gstroke_disp, wind, &orig_w_attr); | |
| 364 | hints.x = orig_w_attr.x; | |
| 365 | hints.y = orig_w_attr.y; | |
| 366 | hints.width = orig_w_attr.width; | |
| 367 | hints.height = orig_w_attr.height; | |
| 368 | mask = CWSaveUnder; | |
| 369 | w_attr.save_under = True; | |
| 370 | ||
| 371 | /* inhibit all the decorations */ | |
| 372 | mask |= CWOverrideRedirect; | |
| 373 | w_attr.override_redirect = True; | |
| 374 | ||
| 375 | /* Don't set a background, transparent window */ | |
| 376 | mask |= CWBackPixmap; | |
| 377 | w_attr.background_pixmap = None; | |
| 378 | ||
| 379 | /* Default input window look */ | |
| 380 | col_background = WhitePixel (gstroke_disp, screen); | |
| 381 | ||
| 382 | /* no border for the window */ | |
|
4399
c021f4365b91
[gaim-migrate @ 4668]
Christian Hammond <chipx86@chipx86.com>
parents:
4390
diff
changeset
|
383 | #if 0 |
| 4390 | 384 | border_width = 5; |
|
4399
c021f4365b91
[gaim-migrate @ 4668]
Christian Hammond <chipx86@chipx86.com>
parents:
4390
diff
changeset
|
385 | #endif |
| 4390 | 386 | border_width = 0; |
|
4399
c021f4365b91
[gaim-migrate @ 4668]
Christian Hammond <chipx86@chipx86.com>
parents:
4390
diff
changeset
|
387 | |
| 4390 | 388 | col_border = BlackPixel (gstroke_disp, screen); |
| 389 | ||
| 390 | gstroke_window = XCreateSimpleWindow (gstroke_disp, wind, | |
| 391 | 0, 0, | |
| 392 | hints.width - 2 * border_width, | |
| 393 | hints.height - 2 * border_width, | |
| 394 | border_width, | |
| 395 | col_border, col_background); | |
| 396 | ||
| 397 | gstroke_gc = XCreateGC (gstroke_disp, gstroke_window, 0, NULL); | |
| 398 | ||
| 399 | XSetFunction (gstroke_disp, gstroke_gc, GXinvert); | |
| 400 | ||
| 401 | XChangeWindowAttributes (gstroke_disp, gstroke_window, mask, &w_attr); | |
| 402 | ||
| 403 | XSetLineAttributes (gstroke_disp, gstroke_gc, 2, LineSolid, | |
| 404 | CapButt, JoinMiter); | |
| 405 | XMapRaised (gstroke_disp, gstroke_window); | |
| 406 | ||
| 407 | #if 0 | |
| 408 | /*FIXME: is this call really needed? If yes, does it need the real | |
| 409 | argc and argv? */ | |
| 410 | hints.flags = PPosition | PSize; | |
| 411 | XSetStandardProperties (gstroke_disp, gstroke_window, "gstroke_test", NULL, | |
| 412 | (Pixmap)NULL, NULL, 0, &hints); | |
| 413 | ||
| 414 | ||
| 415 | /* Receive the close window client message */ | |
| 416 | { | |
| 417 | /* FIXME: is this really needed? If yes, something should be done | |
| 418 | with wmdelete...*/ | |
| 419 | Atom wmdelete = XInternAtom (gstroke_disp, "WM_DELETE_WINDOW", | |
| 420 | False); | |
| 421 | XSetWMProtocols (gstroke_disp, gstroke_window, &wmdelete, True); | |
| 422 | } | |
| 423 | #endif | |
| 424 | } |