1
#include "gtk-window-decorator.h"
4
move_resize_window (WnckWindow *win,
6
decor_event *gtkwd_event)
9
GdkDisplay *gdkdisplay;
14
gdkdisplay = gdk_display_get_default ();
15
xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay);
16
screen = gdk_display_get_default_screen (gdkdisplay);
17
xroot = RootWindowOfScreen (gdk_x11_screen_get_xscreen (screen));
19
if (action_menu_mapped)
21
gtk_object_destroy (GTK_OBJECT (action_menu));
22
action_menu_mapped = FALSE;
27
ev.xclient.type = ClientMessage;
28
ev.xclient.display = xdisplay;
30
ev.xclient.serial = 0;
31
ev.xclient.send_event = TRUE;
33
ev.xclient.window = wnck_window_get_xid (win);
34
ev.xclient.message_type = wm_move_resize_atom;
35
ev.xclient.format = 32;
37
ev.xclient.data.l[0] = gtkwd_event->x_root;
38
ev.xclient.data.l[1] = gtkwd_event->y_root;
39
ev.xclient.data.l[2] = direction;
40
ev.xclient.data.l[3] = gtkwd_event->button;
41
ev.xclient.data.l[4] = 1;
43
XUngrabPointer (xdisplay, gtkwd_event->time);
44
XUngrabKeyboard (xdisplay, gtkwd_event->time);
46
XSendEvent (xdisplay, xroot, FALSE,
47
SubstructureRedirectMask | SubstructureNotifyMask,
50
XSync (xdisplay, FALSE);
54
common_button_event (WnckWindow *win,
55
decor_event *gtkwd_event,
56
decor_event_type gtkwd_type,
60
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
61
guint state = d->button_states[button];
63
if (d->frame_window && gtkwd_type == GEnterNotify)
66
cursor = gdk_cursor_new (GDK_LEFT_PTR);
67
gdk_window_set_cursor (d->frame_window, cursor);
68
gdk_cursor_unref (cursor);
73
if (gtkwd_event->button <= max)
74
d->button_states[button] |= PRESSED_EVENT_WINDOW;
77
if (gtkwd_event->button <= max)
78
d->button_states[button] &= ~PRESSED_EVENT_WINDOW;
81
d->button_states[button] |= IN_EVENT_WINDOW;
84
d->button_states[button] &= ~IN_EVENT_WINDOW;
90
if (state != d->button_states[button])
94
#define BUTTON_EVENT_ACTION_STATE (PRESSED_EVENT_WINDOW | IN_EVENT_WINDOW)
97
close_button_event (WnckWindow *win,
98
decor_event *gtkwd_event,
99
decor_event_type gtkwd_type)
101
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
102
guint state = d->button_states[BUTTON_CLOSE];
104
common_button_event (win, gtkwd_event, gtkwd_type,
107
switch (gtkwd_type) {
109
if (gtkwd_event->button == 1)
110
if (state == BUTTON_EVENT_ACTION_STATE)
111
wnck_window_close (win, gtkwd_event->time);
119
max_button_event (WnckWindow *win,
120
decor_event *gtkwd_event,
121
decor_event_type gtkwd_type)
123
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
124
guint state = d->button_states[BUTTON_MAX];
126
if (wnck_window_is_maximized (win))
127
common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_MAX,
130
common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_MAX,
133
switch (gtkwd_type) {
135
if (gtkwd_event->button <= 3)
137
if (state == BUTTON_EVENT_ACTION_STATE)
139
if (gtkwd_event->button == 2)
141
if (wnck_window_is_maximized_vertically (win))
142
wnck_window_unmaximize_vertically (win);
144
wnck_window_maximize_vertically (win);
146
else if (gtkwd_event->button == 3)
148
if (wnck_window_is_maximized_horizontally (win))
149
wnck_window_unmaximize_horizontally (win);
151
wnck_window_maximize_horizontally (win);
155
if (wnck_window_is_maximized (win))
156
wnck_window_unmaximize (win);
158
wnck_window_maximize (win);
169
min_button_event (WnckWindow *win,
170
decor_event *gtkwd_event,
171
decor_event_type gtkwd_type)
173
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
174
guint state = d->button_states[BUTTON_MIN];
176
common_button_event (win, gtkwd_event, gtkwd_type,
179
switch (gtkwd_type) {
181
if (gtkwd_event->button == 1)
182
if (state == BUTTON_EVENT_ACTION_STATE)
183
wnck_window_minimize (win);
191
menu_button_event (WnckWindow *win,
192
decor_event *gtkwd_event,
193
decor_event_type gtkwd_type)
196
common_button_event (win, gtkwd_event, gtkwd_type,
199
switch (gtkwd_type) {
201
if (gtkwd_event->button == 1)
202
action_menu_map (win,
212
shade_button_event (WnckWindow *win,
213
decor_event *gtkwd_event,
214
decor_event_type gtkwd_type)
216
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
217
guint state = d->button_states[BUTTON_SHADE];
219
common_button_event (win, gtkwd_event, gtkwd_type,
222
switch (gtkwd_type) {
224
if (gtkwd_event->button == 1)
226
if (state == BUTTON_EVENT_ACTION_STATE)
227
wnck_window_shade (win);
236
above_button_event (WnckWindow *win,
237
decor_event *gtkwd_event,
238
decor_event_type gtkwd_type)
240
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
241
guint state = d->button_states[BUTTON_ABOVE];
243
common_button_event (win, gtkwd_event, gtkwd_type,
246
switch (gtkwd_type) {
248
if (gtkwd_event->button == 1)
249
if (state == BUTTON_EVENT_ACTION_STATE)
250
#ifdef HAVE_LIBWNCK_2_18_1
251
wnck_window_make_above (win);
260
stick_button_event (WnckWindow *win,
261
decor_event *gtkwd_event,
262
decor_event_type gtkwd_type)
264
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
265
guint state = d->button_states[BUTTON_STICK];
267
common_button_event (win, gtkwd_event, gtkwd_type,
270
switch (gtkwd_type) {
272
if (gtkwd_event->button == 1)
273
if (state == BUTTON_EVENT_ACTION_STATE)
274
wnck_window_stick (win);
282
unshade_button_event (WnckWindow *win,
283
decor_event *gtkwd_event,
284
decor_event_type gtkwd_type)
286
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
287
guint state = d->button_states[BUTTON_UNSHADE];
289
common_button_event (win, gtkwd_event, gtkwd_type,
292
switch (gtkwd_type) {
294
if (gtkwd_event->button == 1)
295
if (state == BUTTON_EVENT_ACTION_STATE)
296
wnck_window_unshade (win);
304
unabove_button_event (WnckWindow *win,
305
decor_event *gtkwd_event,
306
decor_event_type gtkwd_type)
308
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
309
guint state = d->button_states[BUTTON_UNABOVE];
311
common_button_event (win, gtkwd_event, gtkwd_type,
314
switch (gtkwd_type) {
316
if (gtkwd_event->button == 1)
317
if (state == BUTTON_EVENT_ACTION_STATE)
318
#ifdef HAVE_LIBWNCK_2_18_1
319
wnck_window_unmake_above (win);
328
unstick_button_event (WnckWindow *win,
329
decor_event *gtkwd_event,
330
decor_event_type gtkwd_type)
332
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
333
guint state = d->button_states[BUTTON_UNSTICK];
335
common_button_event (win, gtkwd_event, gtkwd_type,
338
switch (gtkwd_type) {
340
if (gtkwd_event->button == 1)
341
if (state == BUTTON_EVENT_ACTION_STATE)
342
wnck_window_unstick (win);
350
handle_title_button_event (WnckWindow *win,
352
decor_event *gtkwd_event)
355
case CLICK_ACTION_SHADE:
356
if (wnck_window_is_shaded (win))
357
wnck_window_unshade (win);
359
wnck_window_shade (win);
361
case CLICK_ACTION_MAXIMIZE:
362
if (wnck_window_is_maximized (win))
363
wnck_window_unmaximize (win);
365
wnck_window_maximize (win);
367
case CLICK_ACTION_MINIMIZE:
368
if (!wnck_window_is_minimized (win))
369
wnck_window_minimize (win);
371
case CLICK_ACTION_RAISE:
372
restack_window (win, Above);
374
case CLICK_ACTION_LOWER:
375
restack_window (win, Below);
377
case CLICK_ACTION_MENU:
378
action_menu_map (win, gtkwd_event->button, gtkwd_event->time);
384
handle_mouse_wheel_title_event (WnckWindow *win,
387
switch (wheel_action) {
388
case WHEEL_ACTION_SHADE:
391
if (!wnck_window_is_shaded (win))
392
wnck_window_shade (win);
394
else if (button == 5)
396
if (wnck_window_is_shaded (win))
397
wnck_window_unshade (win);
406
title_event (WnckWindow *win,
407
decor_event *gtkwd_event,
408
decor_event_type gtkwd_type)
410
static int last_button_num = 0;
411
static Window last_button_xwindow = None;
412
static Time last_button_time = 0;
413
static int last_button_x = 0;
414
static int last_button_y = 0;
416
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
418
if (d->frame_window && gtkwd_type == GEnterNotify)
420
GdkCursor* cursor = gdk_cursor_new (GDK_LEFT_PTR);
421
gdk_window_set_cursor (d->frame_window, cursor);
422
gdk_cursor_unref (cursor);
425
if (gtkwd_type != GButtonPress)
428
if (gtkwd_event->button == 1)
430
if (gtkwd_event->button == last_button_num &&
431
gtkwd_event->window == last_button_xwindow &&
432
gtkwd_event->time < last_button_time + double_click_timeout &&
433
dist (gtkwd_event->x, gtkwd_event->y,
434
last_button_x, last_button_y) < DOUBLE_CLICK_DISTANCE)
436
handle_title_button_event (win, double_click_action,
440
last_button_xwindow = None;
441
last_button_time = 0;
447
last_button_num = gtkwd_event->button;
448
last_button_xwindow = gtkwd_event->window;
449
last_button_time = gtkwd_event->time;
450
last_button_x = gtkwd_event->x;
451
last_button_y = gtkwd_event->y;
453
restack_window (win, Above);
455
move_resize_window (win, WM_MOVERESIZE_MOVE, gtkwd_event);
458
else if (gtkwd_event->button == 2)
460
handle_title_button_event (win, middle_click_action,
463
else if (gtkwd_event->button == 3)
465
handle_title_button_event (win, right_click_action,
468
else if (gtkwd_event->button == 4 ||
469
gtkwd_event->button == 5)
471
handle_mouse_wheel_title_event (win, gtkwd_event->button);
476
frame_common_event (WnckWindow *win,
478
decor_event *gtkwd_event,
479
decor_event_type gtkwd_type)
482
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
484
if (d->frame_window && gtkwd_type == GEnterNotify)
486
GdkCursor *cursor = NULL;
490
case WM_MOVERESIZE_SIZE_TOPLEFT:
491
cursor = gdk_cursor_new (GDK_TOP_LEFT_CORNER);
493
case WM_MOVERESIZE_SIZE_LEFT:
494
cursor = gdk_cursor_new (GDK_LEFT_SIDE);
496
case WM_MOVERESIZE_SIZE_BOTTOMLEFT:
497
cursor = gdk_cursor_new (GDK_BOTTOM_LEFT_CORNER);
499
case WM_MOVERESIZE_SIZE_BOTTOM:
500
cursor = gdk_cursor_new (GDK_BOTTOM_SIDE);
502
case WM_MOVERESIZE_SIZE_BOTTOMRIGHT:
503
cursor = gdk_cursor_new (GDK_BOTTOM_RIGHT_CORNER);
505
case WM_MOVERESIZE_SIZE_RIGHT:
506
cursor = gdk_cursor_new (GDK_RIGHT_SIDE);
508
case WM_MOVERESIZE_SIZE_TOPRIGHT:
509
cursor = gdk_cursor_new (GDK_TOP_RIGHT_CORNER);
511
case WM_MOVERESIZE_SIZE_TOP:
512
cursor = gdk_cursor_new (GDK_TOP_SIDE);
520
gdk_window_set_cursor (d->frame_window, cursor);
521
gdk_cursor_unref (cursor);
525
if (gtkwd_type != GButtonPress)
528
switch (gtkwd_event->button) {
530
move_resize_window (win, direction, gtkwd_event);
531
restack_window (win, Above);
534
handle_title_button_event (win, middle_click_action,
538
handle_title_button_event (win, right_click_action,
545
top_left_event (WnckWindow *win,
546
decor_event *gtkwd_event,
547
decor_event_type gtkwd_type)
549
frame_common_event (win, WM_MOVERESIZE_SIZE_TOPLEFT,
550
gtkwd_event, gtkwd_type);
554
top_event (WnckWindow *win,
555
decor_event *gtkwd_event,
556
decor_event_type gtkwd_type)
558
frame_common_event (win, WM_MOVERESIZE_SIZE_TOP,
559
gtkwd_event, gtkwd_type);
563
top_right_event (WnckWindow *win,
564
decor_event *gtkwd_event,
565
decor_event_type gtkwd_type)
567
frame_common_event (win, WM_MOVERESIZE_SIZE_TOPRIGHT,
568
gtkwd_event, gtkwd_type);
572
left_event (WnckWindow *win,
573
decor_event *gtkwd_event,
574
decor_event_type gtkwd_type)
576
frame_common_event (win, WM_MOVERESIZE_SIZE_LEFT,
577
gtkwd_event, gtkwd_type);
581
right_event (WnckWindow *win,
582
decor_event *gtkwd_event,
583
decor_event_type gtkwd_type)
585
frame_common_event (win, WM_MOVERESIZE_SIZE_RIGHT,
586
gtkwd_event, gtkwd_type);
590
bottom_left_event (WnckWindow *win,
591
decor_event *gtkwd_event,
592
decor_event_type gtkwd_type)
594
frame_common_event (win, WM_MOVERESIZE_SIZE_BOTTOMLEFT,
595
gtkwd_event, gtkwd_type);
599
bottom_event (WnckWindow *win,
600
decor_event *gtkwd_event,
601
decor_event_type gtkwd_type)
603
frame_common_event (win, WM_MOVERESIZE_SIZE_BOTTOM,
604
gtkwd_event, gtkwd_type);
608
bottom_right_event (WnckWindow *win,
609
decor_event *gtkwd_event,
610
decor_event_type gtkwd_type)
612
frame_common_event (win, WM_MOVERESIZE_SIZE_BOTTOMRIGHT,
613
gtkwd_event, gtkwd_type);
617
frame_window_realized (GtkWidget *widget,
620
decor_t *d = (decor_t *) data;
624
GdkWindow *gdk_frame_window = gtk_widget_get_window (d->decor_window);
625
gdk_window_reparent (gdk_frame_window, d->frame_window, 0, 0);
626
gdk_window_lower (gdk_frame_window);
632
find_event_callback_for_point (decor_t *d,
642
for (i = 0; i < BUTTON_NUM; i++)
644
box = &d->button_windows[i].pos;
645
if (x >= box->x1 && x <= box->x2 &&
646
y >= box->y1 && y <= box->y2)
648
if (d->last_pos_entered != box)
652
if (leave && d->last_pos_entered)
657
return d->button_windows[i].callback;
661
for (i = 0; i < 3; i++)
663
for (j = 0; j < 3; j++)
665
box = &d->event_windows[i][j].pos;
666
if (x >= box->x1 && x <= box->x2 &&
667
y >= box->y1 && y <= box->y2)
669
if (d->last_pos_entered != box)
673
if (leave && d->last_pos_entered)
678
return d->event_windows[i][j].callback;
687
find_leave_event_callback (decor_t *d)
691
for (i = 0; i < BUTTON_NUM; i++)
693
if (d->last_pos_entered == &d->button_windows[i].pos)
694
return d->button_windows[i].callback;
697
for (i = 0; i < 3; i++)
699
for (j = 0; j < 3; j++)
701
if (d->last_pos_entered == &d->event_windows[i][j].pos)
702
return d->event_windows[i][j].callback;
710
frame_handle_button_press (GtkWidget *widget,
711
GdkEventButton *event,
714
decor_t *d = (decor_t *) user_data;
718
/* Check to see where the event happened and fill out an appropriate
723
cb = find_event_callback_for_point (d, event->x, event->y,
726
if (cb && d->decorated)
728
decor_event gtkwd_event;
730
gtkwd_event.window = GDK_WINDOW_XID (d->frame_window);
731
gtkwd_event.button = event->button;
732
gtkwd_event.x = event->x;
733
gtkwd_event.y = event->y;
734
gtkwd_event.x_root = event->x_root;
735
gtkwd_event.y_root = event->y_root;
736
gtkwd_event.time = event->time;
738
(*cb) (d->win, >kwd_event, GButtonPress);
744
frame_handle_button_release (GtkWidget *widget,
745
GdkEventButton *event,
748
decor_t *d = (decor_t *) user_data;
754
cb = find_event_callback_for_point (d, event->x, event->y,
757
if (cb && d->decorated)
759
decor_event gtkwd_event;
761
gtkwd_event.window = GDK_WINDOW_XID (d->frame_window);
762
gtkwd_event.button = event->button;
763
gtkwd_event.x = event->x;
764
gtkwd_event.y = event->y;
765
gtkwd_event.x_root = event->x_root;
766
gtkwd_event.y_root = event->y_root;
767
gtkwd_event.time = event->time;
769
(*cb) (d->win, >kwd_event, GButtonRelease);
775
frame_handle_motion (GtkWidget *widget,
776
GdkEventMotion *event,
779
decor_t *d = (decor_t *) user_data;
783
event_callback cb = NULL;
784
Bool send_enter = FALSE;
785
Bool send_leave = FALSE;
788
cb = find_event_callback_for_point (d, event->x, event->y,
789
&send_enter, &send_leave,
792
if (cb && d->decorated)
794
decor_event gtkwd_event;
796
gtkwd_event.window = GDK_WINDOW_XID (d->frame_window);
797
gtkwd_event.x = event->x;
798
gtkwd_event.y = event->y;
799
gtkwd_event.x_root = event->x_root;
800
gtkwd_event.y_root = event->y_root;
801
gtkwd_event.time = event->time;
804
(*cb) (d->win, >kwd_event, GEnterNotify);
808
event_callback leave_cb;
810
leave_cb = find_leave_event_callback (d);
813
(*leave_cb) (d->win, >kwd_event, GLeaveNotify);
818
d->last_pos_entered = entered_box;
820
else if (d->last_pos_entered && d->decorated)
822
/* We are not in an event / button window but last_pos_entered
823
* is still set, so send a GLeaveNotify to last_pos_entered
827
event_callback leave_cb;
829
leave_cb = find_leave_event_callback (d);
833
decor_event gtkwd_event;
835
gtkwd_event.window = GDK_WINDOW_XID (d->frame_window);
836
gtkwd_event.x = event->x;
837
gtkwd_event.y = event->y;
838
gtkwd_event.x_root = event->x_root;
839
gtkwd_event.y_root = event->y_root;
840
gtkwd_event.time = event->time;
842
(*leave_cb) (d->win, >kwd_event, GLeaveNotify);
845
d->last_pos_entered = NULL;
851
event_filter_func (GdkXEvent *gdkxevent,
856
GdkDisplay *gdkdisplay;
857
XEvent *xevent = gdkxevent;
861
gdkdisplay = gdk_display_get_default ();
862
xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay);
864
switch (xevent->type) {
867
if (!wnck_window_get (xevent->xcreatewindow.window))
869
GdkWindow *toplevel = gdk_window_foreign_new_for_display (gdkdisplay,
870
xevent->xcreatewindow.window);
874
gdk_window_set_events (toplevel,
875
gdk_window_get_events (toplevel) |
876
GDK_PROPERTY_CHANGE_MASK);
878
/* check if the window is a switcher and update accordingly */
880
if (get_window_prop (xevent->xcreatewindow.window, select_window_atom, &select))
881
update_switcher_window (xevent->xcreatewindow.window, select);
889
g_hash_table_lookup (frame_table,
890
GINT_TO_POINTER (xevent->xbutton.window));
895
g_hash_table_lookup (frame_table,
896
GINT_TO_POINTER (xevent->xcrossing.window));
900
g_hash_table_lookup (frame_table,
901
GINT_TO_POINTER (xevent->xmotion.window));
904
if (xevent->xproperty.atom == frame_input_window_atom)
908
xid = xevent->xproperty.window;
910
win = wnck_window_get (xid);
915
if (!get_window_prop (xid, select_window_atom, &select))
917
if (get_window_prop (xid, frame_input_window_atom, &frame))
918
add_frame_window (win, frame, FALSE);
920
remove_frame_window (win);
924
if (xevent->xproperty.atom == frame_output_window_atom)
928
xid = xevent->xproperty.window;
930
win = wnck_window_get (xid);
935
if (!get_window_prop (xid, select_window_atom, &select))
937
if (get_window_prop (xid, frame_output_window_atom, &frame))
938
add_frame_window (win, frame, TRUE);
940
remove_frame_window (win);
944
else if (xevent->xproperty.atom == compiz_shadow_info_atom ||
945
xevent->xproperty.atom == compiz_shadow_color_atom)
947
GdkScreen *g_screen = gdk_display_get_default_screen (gdkdisplay);
948
Window root = GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (g_screen));
951
screen = wnck_screen_get_for_root (root);
955
shadow_property_changed (screen);
958
else if (xevent->xproperty.atom == mwm_hints_atom)
962
xid = xevent->xproperty.window;
964
win = wnck_window_get (xid);
967
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
968
gboolean decorated = FALSE;
970
if (get_mwm_prop (xid) & (MWM_DECOR_ALL | MWM_DECOR_TITLE))
973
if (decorated != d->decorated)
975
d->decorated = decorated;
979
d->width = d->height = 0;
981
update_window_decoration_size (win);
982
update_event_windows (win);
986
gdk_error_trap_push ();
987
XDeleteProperty (xdisplay, xid, win_decor_atom);
988
gdk_display_sync (gdk_display_get_default ());
989
gdk_error_trap_pop ();
994
else if (xevent->xproperty.atom == select_window_atom)
998
if (get_window_prop (xevent->xproperty.window, select_window_atom, &select))
999
update_switcher_window (xevent->xproperty.window, select);
1001
else if (xevent->xproperty.atom == XA_WM_TRANSIENT_FOR)
1003
WnckWindow *win = wnck_window_get (xevent->xproperty.window);
1006
wnck_window_get_window_type (win) == WNCK_WINDOW_DIALOG)
1010
if (get_window_prop (xevent->xproperty.window, XA_WM_TRANSIENT_FOR, &parent))
1012
WnckWindow *p = wnck_window_get (parent);
1013
decor_t *d = g_object_get_data (G_OBJECT (p), "decor");
1014
decor_t *d_transient = g_object_get_data (G_OBJECT (p), "decor");
1016
if (g_slist_find (d->transient_windows, p))
1021
d->transient_windows = g_slist_append (d->transient_windows, win);
1022
d_transient->transient_parent = p;
1030
g_hash_table_remove (frame_table,
1031
GINT_TO_POINTER (xevent->xproperty.window));
1036
if (xevent->xclient.message_type == toolkit_action_atom)
1040
action = xevent->xclient.data.l[0];
1041
if (action == toolkit_action_window_menu_atom)
1045
win = wnck_window_get (xevent->xclient.window);
1048
action_menu_map (win,
1049
xevent->xclient.data.l[2],
1050
xevent->xclient.data.l[1]);
1053
else if (action == toolkit_action_force_quit_dialog_atom)
1057
win = wnck_window_get (xevent->xclient.window);
1060
if (xevent->xclient.data.l[2])
1061
show_force_quit_dialog (win,
1062
xevent->xclient.data.l[1]);
1064
hide_force_quit_dialog (win);
1076
win = wnck_window_get (xid);
1079
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
1084
event_callback cb = NULL;
1085
Window w = xevent->xany.window;
1087
for (i = 0; i < 3; i++)
1088
for (j = 0; j < 3; j++)
1089
if (d->event_windows[i][j].window == w)
1090
cb = d->event_windows[i][j].callback;
1094
for (i = 0; i < BUTTON_NUM; i++)
1095
if (d->button_windows[i].window == w)
1096
cb = d->button_windows[i].callback;
1101
decor_event gtkwd_event;
1102
decor_event_type gtkwd_type;
1104
gtkwd_event.window = w;
1106
switch (xevent->type)
1110
if (xevent->type == ButtonPress)
1111
gtkwd_type = GButtonPress;
1113
gtkwd_type = GButtonRelease;
1114
gtkwd_event.button = xevent->xbutton.button;
1115
gtkwd_event.x = xevent->xbutton.x;
1116
gtkwd_event.y = xevent->xbutton.y;
1117
gtkwd_event.x_root = xevent->xbutton.x_root;
1118
gtkwd_event.y_root = xevent->xbutton.y_root;
1119
gtkwd_event.time = xevent->xbutton.time;
1123
if (xevent->type == EnterNotify)
1124
gtkwd_type = GEnterNotify;
1126
gtkwd_type = GLeaveNotify;
1127
gtkwd_event.x = xevent->xcrossing.x;
1128
gtkwd_event.y = xevent->xcrossing.y;
1129
gtkwd_event.x_root = xevent->xcrossing.x_root;
1130
gtkwd_event.y_root = xevent->xcrossing.y_root;
1131
gtkwd_event.time = xevent->xcrossing.time;
1138
(*cb) (win, >kwd_event, gtkwd_type);
1144
return GDK_FILTER_CONTINUE;
1148
selection_event_filter_func (GdkXEvent *gdkxevent,
1153
GdkDisplay *gdkdisplay;
1154
XEvent *xevent = gdkxevent;
1157
gdkdisplay = gdk_display_get_default ();
1158
xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay);
1160
switch (xevent->type) {
1161
case SelectionRequest:
1162
decor_handle_selection_request (xdisplay, xevent, dm_sn_timestamp);
1164
case SelectionClear:
1165
status = decor_handle_selection_clear (xdisplay, xevent, 0);
1166
if (status == DECOR_SELECTION_GIVE_UP)
1172
return GDK_FILTER_CONTINUE;