2
* Copyright © 2006 Novell, Inc.
4
* This library is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Lesser General Public
6
* License as published by the Free Software Foundation; either
7
* version 2 of the License, or (at your option) any later version.
9
* This library is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Lesser General Public License for more details.
14
* You should have received a copy of the GNU Lesser General Public
15
* License along with this library; if not, write to the
16
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17
* Boston, MA 02111-1307, USA.
19
* Author: David Reveman <davidr@novell.com>
21
* 2D Mode: Copyright © 2010 Sam Spilsbury <smspillaz@gmail.com>
22
* Frames Management: Copright © 2011 Canonical Ltd.
23
* Authored By: Sam Spilsbury <sam.spilsbury@canonical.com>
26
#include "gtk-window-decorator.h"
29
move_resize_window (WnckWindow *win,
31
decor_event *gtkwd_event)
34
GdkDisplay *gdkdisplay;
39
gdkdisplay = gdk_display_get_default ();
40
xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay);
41
screen = gdk_display_get_default_screen (gdkdisplay);
42
xroot = RootWindowOfScreen (gdk_x11_screen_get_xscreen (screen));
44
if (action_menu_mapped)
46
gtk_object_destroy (GTK_OBJECT (action_menu));
47
action_menu_mapped = FALSE;
52
ev.xclient.type = ClientMessage;
53
ev.xclient.display = xdisplay;
55
ev.xclient.serial = 0;
56
ev.xclient.send_event = TRUE;
58
ev.xclient.window = wnck_window_get_xid (win);
59
ev.xclient.message_type = wm_move_resize_atom;
60
ev.xclient.format = 32;
62
ev.xclient.data.l[0] = gtkwd_event->x_root;
63
ev.xclient.data.l[1] = gtkwd_event->y_root;
64
ev.xclient.data.l[2] = direction;
65
ev.xclient.data.l[3] = gtkwd_event->button;
66
ev.xclient.data.l[4] = 1;
68
XUngrabPointer (xdisplay, gtkwd_event->time);
69
XUngrabKeyboard (xdisplay, gtkwd_event->time);
71
XSendEvent (xdisplay, xroot, FALSE,
72
SubstructureRedirectMask | SubstructureNotifyMask,
75
XSync (xdisplay, FALSE);
79
common_button_event (WnckWindow *win,
80
decor_event *gtkwd_event,
81
decor_event_type gtkwd_type,
86
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
87
guint state = d->button_states[button];
89
handle_tooltip_event (win, gtkwd_event, gtkwd_type, state, tooltip);
91
if (d->frame_window && gtkwd_type == GEnterNotify)
94
cursor = gdk_cursor_new (GDK_LEFT_PTR);
95
gdk_window_set_cursor (d->frame_window, cursor);
96
gdk_cursor_unref (cursor);
101
if (gtkwd_event->button <= max)
102
d->button_states[button] |= PRESSED_EVENT_WINDOW;
105
if (gtkwd_event->button <= max)
106
d->button_states[button] &= ~PRESSED_EVENT_WINDOW;
109
d->button_states[button] |= IN_EVENT_WINDOW;
112
d->button_states[button] &= ~IN_EVENT_WINDOW;
118
if (state != d->button_states[button])
119
queue_decor_draw (d);
122
#define BUTTON_EVENT_ACTION_STATE (PRESSED_EVENT_WINDOW | IN_EVENT_WINDOW)
125
close_button_event (WnckWindow *win,
126
decor_event *gtkwd_event,
127
decor_event_type gtkwd_type)
129
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
130
guint state = d->button_states[BUTTON_CLOSE];
132
common_button_event (win, gtkwd_event, gtkwd_type,
133
BUTTON_CLOSE, 1, _("Close Window"));
135
switch (gtkwd_type) {
137
if (gtkwd_event->button == 1)
138
if (state == BUTTON_EVENT_ACTION_STATE)
139
wnck_window_close (win, gtkwd_event->time);
147
max_button_event (WnckWindow *win,
148
decor_event *gtkwd_event,
149
decor_event_type gtkwd_type)
151
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
152
guint state = d->button_states[BUTTON_MAX];
154
if (wnck_window_is_maximized (win))
155
common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_MAX,
156
3, _("Unmaximize Window"));
158
common_button_event (win, gtkwd_event, gtkwd_type, BUTTON_MAX,
159
3, _("Maximize Window"));
161
switch (gtkwd_type) {
163
if (gtkwd_event->button <= 3)
165
if (state == BUTTON_EVENT_ACTION_STATE)
167
if (gtkwd_event->button == 2)
169
if (wnck_window_is_maximized_vertically (win))
170
wnck_window_unmaximize_vertically (win);
172
wnck_window_maximize_vertically (win);
174
else if (gtkwd_event->button == 3)
176
if (wnck_window_is_maximized_horizontally (win))
177
wnck_window_unmaximize_horizontally (win);
179
wnck_window_maximize_horizontally (win);
183
if (wnck_window_is_maximized (win))
184
wnck_window_unmaximize (win);
186
wnck_window_maximize (win);
197
min_button_event (WnckWindow *win,
198
decor_event *gtkwd_event,
199
decor_event_type gtkwd_type)
201
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
202
guint state = d->button_states[BUTTON_MIN];
204
common_button_event (win, gtkwd_event, gtkwd_type,
205
BUTTON_MIN, 1, _("Minimize Window"));
207
switch (gtkwd_type) {
209
if (gtkwd_event->button == 1)
210
if (state == BUTTON_EVENT_ACTION_STATE)
211
wnck_window_minimize (win);
219
menu_button_event (WnckWindow *win,
220
decor_event *gtkwd_event,
221
decor_event_type gtkwd_type)
224
common_button_event (win, gtkwd_event, gtkwd_type,
225
BUTTON_MENU, 1, _("Window Menu"));
227
switch (gtkwd_type) {
229
if (gtkwd_event->button == 1)
230
action_menu_map (win,
240
shade_button_event (WnckWindow *win,
241
decor_event *gtkwd_event,
242
decor_event_type gtkwd_type)
244
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
245
guint state = d->button_states[BUTTON_SHADE];
247
common_button_event (win, gtkwd_event, gtkwd_type,
248
BUTTON_SHADE, 1, _("Shade"));
250
switch (gtkwd_type) {
252
if (gtkwd_event->button == 1)
254
if (state == BUTTON_EVENT_ACTION_STATE)
255
wnck_window_shade (win);
264
above_button_event (WnckWindow *win,
265
decor_event *gtkwd_event,
266
decor_event_type gtkwd_type)
268
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
269
guint state = d->button_states[BUTTON_ABOVE];
271
common_button_event (win, gtkwd_event, gtkwd_type,
272
BUTTON_ABOVE, 1, _("Make Above"));
274
switch (gtkwd_type) {
276
if (gtkwd_event->button == 1)
277
if (state == BUTTON_EVENT_ACTION_STATE)
278
#ifdef HAVE_LIBWNCK_2_18_1
279
wnck_window_make_above (win);
288
stick_button_event (WnckWindow *win,
289
decor_event *gtkwd_event,
290
decor_event_type gtkwd_type)
292
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
293
guint state = d->button_states[BUTTON_STICK];
295
common_button_event (win, gtkwd_event, gtkwd_type,
296
BUTTON_STICK, 1, _("Stick"));
298
switch (gtkwd_type) {
300
if (gtkwd_event->button == 1)
301
if (state == BUTTON_EVENT_ACTION_STATE)
302
wnck_window_stick (win);
310
unshade_button_event (WnckWindow *win,
311
decor_event *gtkwd_event,
312
decor_event_type gtkwd_type)
314
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
315
guint state = d->button_states[BUTTON_UNSHADE];
317
common_button_event (win, gtkwd_event, gtkwd_type,
318
BUTTON_UNSHADE, 1, _("Unshade"));
320
switch (gtkwd_type) {
322
if (gtkwd_event->button == 1)
323
if (state == BUTTON_EVENT_ACTION_STATE)
324
wnck_window_unshade (win);
332
unabove_button_event (WnckWindow *win,
333
decor_event *gtkwd_event,
334
decor_event_type gtkwd_type)
336
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
337
guint state = d->button_states[BUTTON_UNABOVE];
339
common_button_event (win, gtkwd_event, gtkwd_type,
340
BUTTON_UNABOVE, 1, _("Unmake Above"));
342
switch (gtkwd_type) {
344
if (gtkwd_event->button == 1)
345
if (state == BUTTON_EVENT_ACTION_STATE)
346
#ifdef HAVE_LIBWNCK_2_18_1
347
wnck_window_unmake_above (win);
356
unstick_button_event (WnckWindow *win,
357
decor_event *gtkwd_event,
358
decor_event_type gtkwd_type)
360
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
361
guint state = d->button_states[BUTTON_UNSTICK];
363
common_button_event (win, gtkwd_event, gtkwd_type,
364
BUTTON_UNSTICK, 1, _("Unstick"));
366
switch (gtkwd_type) {
368
if (gtkwd_event->button == 1)
369
if (state == BUTTON_EVENT_ACTION_STATE)
370
wnck_window_unstick (win);
378
handle_title_button_event (WnckWindow *win,
380
decor_event *gtkwd_event)
383
case CLICK_ACTION_SHADE:
384
if (wnck_window_is_shaded (win))
385
wnck_window_unshade (win);
387
wnck_window_shade (win);
389
case CLICK_ACTION_MAXIMIZE:
390
if (wnck_window_is_maximized (win))
391
wnck_window_unmaximize (win);
393
wnck_window_maximize (win);
395
case CLICK_ACTION_MINIMIZE:
396
if (!wnck_window_is_minimized (win))
397
wnck_window_minimize (win);
399
case CLICK_ACTION_RAISE:
400
restack_window (win, Above);
402
case CLICK_ACTION_LOWER:
403
restack_window (win, Below);
405
case CLICK_ACTION_MENU:
406
action_menu_map (win, gtkwd_event->button, gtkwd_event->time);
412
handle_mouse_wheel_title_event (WnckWindow *win,
415
switch (settings->wheel_action) {
416
case WHEEL_ACTION_SHADE:
419
if (!wnck_window_is_shaded (win))
420
wnck_window_shade (win);
422
else if (button == 5)
424
if (wnck_window_is_shaded (win))
425
wnck_window_unshade (win);
434
title_event (WnckWindow *win,
435
decor_event *gtkwd_event,
436
decor_event_type gtkwd_type)
438
static int last_button_num = 0;
439
static Window last_button_xwindow = None;
440
static Time last_button_time = 0;
441
static int last_button_x = 0;
442
static int last_button_y = 0;
444
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
446
if (d->frame_window && gtkwd_type == GEnterNotify)
448
GdkCursor* cursor = gdk_cursor_new (GDK_LEFT_PTR);
449
gdk_window_set_cursor (d->frame_window, cursor);
450
gdk_cursor_unref (cursor);
453
if (gtkwd_type != GButtonPress)
456
if (gtkwd_event->button == 1)
458
if (gtkwd_event->button == last_button_num &&
459
gtkwd_event->window == last_button_xwindow &&
460
gtkwd_event->time < last_button_time + double_click_timeout &&
461
dist (gtkwd_event->x, gtkwd_event->y,
462
last_button_x, last_button_y) < DOUBLE_CLICK_DISTANCE)
464
handle_title_button_event (win, settings->double_click_action,
468
last_button_xwindow = None;
469
last_button_time = 0;
475
last_button_num = gtkwd_event->button;
476
last_button_xwindow = gtkwd_event->window;
477
last_button_time = gtkwd_event->time;
478
last_button_x = gtkwd_event->x;
479
last_button_y = gtkwd_event->y;
481
restack_window (win, Above);
483
move_resize_window (win, WM_MOVERESIZE_MOVE, gtkwd_event);
486
else if (gtkwd_event->button == 2)
488
handle_title_button_event (win, settings->middle_click_action,
491
else if (gtkwd_event->button == 3)
493
handle_title_button_event (win, settings->right_click_action,
496
else if (gtkwd_event->button == 4 ||
497
gtkwd_event->button == 5)
499
handle_mouse_wheel_title_event (win, gtkwd_event->button);
504
frame_common_event (WnckWindow *win,
506
decor_event *gtkwd_event,
507
decor_event_type gtkwd_type)
510
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
512
if (d->frame_window && gtkwd_type == GEnterNotify)
514
GdkCursor *cursor = NULL;
518
case WM_MOVERESIZE_SIZE_TOPLEFT:
519
cursor = gdk_cursor_new (GDK_TOP_LEFT_CORNER);
521
case WM_MOVERESIZE_SIZE_LEFT:
522
cursor = gdk_cursor_new (GDK_LEFT_SIDE);
524
case WM_MOVERESIZE_SIZE_BOTTOMLEFT:
525
cursor = gdk_cursor_new (GDK_BOTTOM_LEFT_CORNER);
527
case WM_MOVERESIZE_SIZE_BOTTOM:
528
cursor = gdk_cursor_new (GDK_BOTTOM_SIDE);
530
case WM_MOVERESIZE_SIZE_BOTTOMRIGHT:
531
cursor = gdk_cursor_new (GDK_BOTTOM_RIGHT_CORNER);
533
case WM_MOVERESIZE_SIZE_RIGHT:
534
cursor = gdk_cursor_new (GDK_RIGHT_SIDE);
536
case WM_MOVERESIZE_SIZE_TOPRIGHT:
537
cursor = gdk_cursor_new (GDK_TOP_RIGHT_CORNER);
539
case WM_MOVERESIZE_SIZE_TOP:
540
cursor = gdk_cursor_new (GDK_TOP_SIDE);
548
gdk_window_set_cursor (d->frame_window, cursor);
549
gdk_cursor_unref (cursor);
553
if (gtkwd_type != GButtonPress)
556
switch (gtkwd_event->button) {
558
move_resize_window (win, direction, gtkwd_event);
559
restack_window (win, Above);
562
handle_title_button_event (win, settings->middle_click_action,
566
handle_title_button_event (win, settings->right_click_action,
573
top_left_event (WnckWindow *win,
574
decor_event *gtkwd_event,
575
decor_event_type gtkwd_type)
577
frame_common_event (win, WM_MOVERESIZE_SIZE_TOPLEFT,
578
gtkwd_event, gtkwd_type);
582
top_event (WnckWindow *win,
583
decor_event *gtkwd_event,
584
decor_event_type gtkwd_type)
586
frame_common_event (win, WM_MOVERESIZE_SIZE_TOP,
587
gtkwd_event, gtkwd_type);
591
top_right_event (WnckWindow *win,
592
decor_event *gtkwd_event,
593
decor_event_type gtkwd_type)
595
frame_common_event (win, WM_MOVERESIZE_SIZE_TOPRIGHT,
596
gtkwd_event, gtkwd_type);
600
left_event (WnckWindow *win,
601
decor_event *gtkwd_event,
602
decor_event_type gtkwd_type)
604
frame_common_event (win, WM_MOVERESIZE_SIZE_LEFT,
605
gtkwd_event, gtkwd_type);
609
right_event (WnckWindow *win,
610
decor_event *gtkwd_event,
611
decor_event_type gtkwd_type)
613
frame_common_event (win, WM_MOVERESIZE_SIZE_RIGHT,
614
gtkwd_event, gtkwd_type);
618
bottom_left_event (WnckWindow *win,
619
decor_event *gtkwd_event,
620
decor_event_type gtkwd_type)
622
frame_common_event (win, WM_MOVERESIZE_SIZE_BOTTOMLEFT,
623
gtkwd_event, gtkwd_type);
627
bottom_event (WnckWindow *win,
628
decor_event *gtkwd_event,
629
decor_event_type gtkwd_type)
631
frame_common_event (win, WM_MOVERESIZE_SIZE_BOTTOM,
632
gtkwd_event, gtkwd_type);
636
bottom_right_event (WnckWindow *win,
637
decor_event *gtkwd_event,
638
decor_event_type gtkwd_type)
640
frame_common_event (win, WM_MOVERESIZE_SIZE_BOTTOMRIGHT,
641
gtkwd_event, gtkwd_type);
645
frame_window_realized (GtkWidget *widget,
648
decor_t *d = (decor_t *) data;
652
GdkWindow *gdk_frame_window = gtk_widget_get_window (d->decor_window);
653
gdk_window_reparent (gdk_frame_window, d->frame_window, 0, 0);
654
gdk_window_lower (gdk_frame_window);
660
find_event_callback_for_point (decor_t *d,
670
for (i = 0; i < BUTTON_NUM; i++)
672
box = &d->button_windows[i].pos;
673
if (x >= box->x1 && x <= box->x2 &&
674
y >= box->y1 && y <= box->y2)
676
if (d->last_pos_entered != box)
680
if (leave && d->last_pos_entered)
685
return d->button_windows[i].callback;
689
for (i = 0; i < 3; i++)
691
for (j = 0; j < 3; j++)
693
box = &d->event_windows[i][j].pos;
694
if (x >= box->x1 && x <= box->x2 &&
695
y >= box->y1 && y <= box->y2)
697
if (d->last_pos_entered != box)
701
if (leave && d->last_pos_entered)
706
return d->event_windows[i][j].callback;
715
find_leave_event_callback (decor_t *d)
719
for (i = 0; i < BUTTON_NUM; i++)
721
if (d->last_pos_entered == &d->button_windows[i].pos)
722
return d->button_windows[i].callback;
725
for (i = 0; i < 3; i++)
727
for (j = 0; j < 3; j++)
729
if (d->last_pos_entered == &d->event_windows[i][j].pos)
730
return d->event_windows[i][j].callback;
738
frame_handle_button_press (GtkWidget *widget,
739
GdkEventButton *event,
742
decor_t *d = (decor_t *) user_data;
746
/* Check to see where the event happened and fill out an appropriate
751
cb = find_event_callback_for_point (d, event->x, event->y,
754
if (cb && d->decorated)
756
decor_event gtkwd_event;
758
gtkwd_event.window = GDK_WINDOW_XID (d->frame_window);
759
gtkwd_event.button = event->button;
760
gtkwd_event.x = event->x;
761
gtkwd_event.y = event->y;
762
gtkwd_event.x_root = event->x_root;
763
gtkwd_event.y_root = event->y_root;
764
gtkwd_event.time = event->time;
766
(*cb) (d->win, >kwd_event, GButtonPress);
772
frame_handle_button_release (GtkWidget *widget,
773
GdkEventButton *event,
776
decor_t *d = (decor_t *) user_data;
782
cb = find_event_callback_for_point (d, event->x, event->y,
785
if (cb && d->decorated)
787
decor_event gtkwd_event;
789
gtkwd_event.window = GDK_WINDOW_XID (d->frame_window);
790
gtkwd_event.button = event->button;
791
gtkwd_event.x = event->x;
792
gtkwd_event.y = event->y;
793
gtkwd_event.x_root = event->x_root;
794
gtkwd_event.y_root = event->y_root;
795
gtkwd_event.time = event->time;
797
(*cb) (d->win, >kwd_event, GButtonRelease);
803
frame_handle_motion (GtkWidget *widget,
804
GdkEventMotion *event,
807
decor_t *d = (decor_t *) user_data;
811
event_callback cb = NULL;
812
Bool send_enter = FALSE;
813
Bool send_leave = FALSE;
816
cb = find_event_callback_for_point (d, event->x, event->y,
817
&send_enter, &send_leave,
820
if (cb && d->decorated)
822
decor_event gtkwd_event;
824
gtkwd_event.window = GDK_WINDOW_XID (d->frame_window);
825
gtkwd_event.x = event->x;
826
gtkwd_event.y = event->y;
827
gtkwd_event.x_root = event->x_root;
828
gtkwd_event.y_root = event->y_root;
829
gtkwd_event.time = event->time;
832
(*cb) (d->win, >kwd_event, GEnterNotify);
836
event_callback leave_cb;
838
leave_cb = find_leave_event_callback (d);
841
(*leave_cb) (d->win, >kwd_event, GLeaveNotify);
846
d->last_pos_entered = entered_box;
848
else if (d->last_pos_entered && d->decorated)
850
/* We are not in an event / button window but last_pos_entered
851
* is still set, so send a GLeaveNotify to last_pos_entered
855
event_callback leave_cb;
857
leave_cb = find_leave_event_callback (d);
861
decor_event gtkwd_event;
863
gtkwd_event.window = GDK_WINDOW_XID (d->frame_window);
864
gtkwd_event.x = event->x;
865
gtkwd_event.y = event->y;
866
gtkwd_event.x_root = event->x_root;
867
gtkwd_event.y_root = event->y_root;
868
gtkwd_event.time = event->time;
870
(*leave_cb) (d->win, >kwd_event, GLeaveNotify);
873
d->last_pos_entered = NULL;
879
event_filter_func (GdkXEvent *gdkxevent,
884
GdkDisplay *gdkdisplay;
885
XEvent *xevent = gdkxevent;
889
gdkdisplay = gdk_display_get_default ();
890
xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay);
892
switch (xevent->type) {
895
if (!wnck_window_get (xevent->xcreatewindow.window))
897
GdkWindow *toplevel = create_foreign_window (xevent->xcreatewindow.window);
901
gdk_window_set_events (toplevel,
902
gdk_window_get_events (toplevel) |
903
GDK_PROPERTY_CHANGE_MASK);
905
/* check if the window is a switcher and update accordingly */
907
if (get_window_prop (xevent->xcreatewindow.window, select_window_atom, &select))
908
update_switcher_window (xevent->xcreatewindow.window, select);
916
g_hash_table_lookup (frame_table,
917
GINT_TO_POINTER (xevent->xbutton.window));
922
g_hash_table_lookup (frame_table,
923
GINT_TO_POINTER (xevent->xcrossing.window));
927
g_hash_table_lookup (frame_table,
928
GINT_TO_POINTER (xevent->xmotion.window));
931
if (xevent->xproperty.atom == frame_input_window_atom)
935
xid = xevent->xproperty.window;
937
win = wnck_window_get (xid);
942
if (!get_window_prop (xid, select_window_atom, &select))
944
if (get_window_prop (xid, frame_input_window_atom, &frame))
945
add_frame_window (win, frame, FALSE);
947
remove_frame_window (win);
951
if (xevent->xproperty.atom == frame_output_window_atom)
955
xid = xevent->xproperty.window;
957
win = wnck_window_get (xid);
962
if (!get_window_prop (xid, select_window_atom, &select))
964
if (get_window_prop (xid, frame_output_window_atom, &frame))
965
add_frame_window (win, frame, TRUE);
967
remove_frame_window (win);
971
else if (xevent->xproperty.atom == compiz_shadow_info_atom ||
972
xevent->xproperty.atom == compiz_shadow_color_atom)
974
GdkScreen *g_screen = gdk_display_get_default_screen (gdkdisplay);
975
Window root = GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (g_screen));
978
screen = wnck_screen_get_for_root (root);
982
if (shadow_property_changed (screen))
983
decorations_changed (screen);
986
else if (xevent->xproperty.atom == mwm_hints_atom)
990
xid = xevent->xproperty.window;
992
win = wnck_window_get (xid);
995
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
996
gboolean decorated = FALSE;
998
if (get_mwm_prop (xid) & (MWM_DECOR_ALL | MWM_DECOR_TITLE))
1001
if (decorated != d->decorated)
1003
d->decorated = decorated;
1007
d->width = d->height = 0;
1009
update_window_decoration_size (win);
1010
update_event_windows (win);
1014
gdk_error_trap_push ();
1015
XDeleteProperty (xdisplay, xid, win_decor_atom);
1016
gdk_display_sync (gdk_display_get_default ());
1017
gdk_error_trap_pop ();
1022
else if (xevent->xproperty.atom == select_window_atom)
1026
if (get_window_prop (xevent->xproperty.window, select_window_atom, &select))
1027
update_switcher_window (xevent->xproperty.window, select);
1031
g_hash_table_remove (frame_table,
1032
GINT_TO_POINTER (xevent->xproperty.window));
1035
if (xevent->xclient.message_type == toolkit_action_atom)
1039
action = xevent->xclient.data.l[0];
1040
if (action == toolkit_action_window_menu_atom)
1044
win = wnck_window_get (xevent->xclient.window);
1047
action_menu_map (win,
1048
xevent->xclient.data.l[2],
1049
xevent->xclient.data.l[1]);
1052
else if (action == toolkit_action_force_quit_dialog_atom)
1056
win = wnck_window_get (xevent->xclient.window);
1059
if (xevent->xclient.data.l[2])
1060
show_force_quit_dialog (win,
1061
xevent->xclient.data.l[1]);
1063
hide_force_quit_dialog (win);
1075
win = wnck_window_get (xid);
1078
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
1083
event_callback cb = NULL;
1084
Window w = xevent->xany.window;
1086
for (i = 0; i < 3; i++)
1087
for (j = 0; j < 3; j++)
1088
if (d->event_windows[i][j].window == w)
1089
cb = d->event_windows[i][j].callback;
1093
for (i = 0; i < BUTTON_NUM; i++)
1094
if (d->button_windows[i].window == w)
1095
cb = d->button_windows[i].callback;
1100
decor_event gtkwd_event;
1101
decor_event_type gtkwd_type;
1103
gtkwd_event.window = w;
1105
switch (xevent->type)
1109
if (xevent->type == ButtonPress)
1110
gtkwd_type = GButtonPress;
1112
gtkwd_type = GButtonRelease;
1113
gtkwd_event.button = xevent->xbutton.button;
1114
gtkwd_event.x = xevent->xbutton.x;
1115
gtkwd_event.y = xevent->xbutton.y;
1116
gtkwd_event.x_root = xevent->xbutton.x_root;
1117
gtkwd_event.y_root = xevent->xbutton.y_root;
1118
gtkwd_event.time = xevent->xbutton.time;
1122
if (xevent->type == EnterNotify)
1123
gtkwd_type = GEnterNotify;
1125
gtkwd_type = GLeaveNotify;
1126
gtkwd_event.x = xevent->xcrossing.x;
1127
gtkwd_event.y = xevent->xcrossing.y;
1128
gtkwd_event.x_root = xevent->xcrossing.x_root;
1129
gtkwd_event.y_root = xevent->xcrossing.y_root;
1130
gtkwd_event.time = xevent->xcrossing.time;
1137
(*cb) (win, >kwd_event, gtkwd_type);
1143
return GDK_FILTER_CONTINUE;
1147
selection_event_filter_func (GdkXEvent *gdkxevent,
1152
GdkDisplay *gdkdisplay;
1153
XEvent *xevent = gdkxevent;
1156
gdkdisplay = gdk_display_get_default ();
1157
xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay);
1159
switch (xevent->type) {
1160
case SelectionRequest:
1161
decor_handle_selection_request (xdisplay, xevent, dm_sn_timestamp);
1163
case SelectionClear:
1164
status = decor_handle_selection_clear (xdisplay, xevent, 0);
1165
if (status == DECOR_SELECTION_GIVE_UP)
1171
return GDK_FILTER_CONTINUE;