561
544
GWDSettings *settings = gwd_theme_get_settings (gwd_theme);
562
545
gint titlebar_action = 0;
563
decor_t *d = g_object_get_data (G_OBJECT (win), "decor");
565
if (d->frame_window && gtkwd_type == GEnterNotify)
567
GdkCursor *cursor = NULL;
571
case WM_MOVERESIZE_SIZE_TOPLEFT:
572
cursor = gdk_cursor_new (GDK_TOP_LEFT_CORNER);
574
case WM_MOVERESIZE_SIZE_LEFT:
575
cursor = gdk_cursor_new (GDK_LEFT_SIDE);
577
case WM_MOVERESIZE_SIZE_BOTTOMLEFT:
578
cursor = gdk_cursor_new (GDK_BOTTOM_LEFT_CORNER);
580
case WM_MOVERESIZE_SIZE_BOTTOM:
581
cursor = gdk_cursor_new (GDK_BOTTOM_SIDE);
583
case WM_MOVERESIZE_SIZE_BOTTOMRIGHT:
584
cursor = gdk_cursor_new (GDK_BOTTOM_RIGHT_CORNER);
586
case WM_MOVERESIZE_SIZE_RIGHT:
587
cursor = gdk_cursor_new (GDK_RIGHT_SIDE);
589
case WM_MOVERESIZE_SIZE_TOPRIGHT:
590
cursor = gdk_cursor_new (GDK_TOP_RIGHT_CORNER);
592
case WM_MOVERESIZE_SIZE_TOP:
593
cursor = gdk_cursor_new (GDK_TOP_SIDE);
601
gdk_window_set_cursor (d->frame_window, cursor);
602
g_object_unref (cursor);
606
547
if (gtkwd_type != GButtonPress)
696
637
gtkwd_event, gtkwd_type);
700
frame_window_realized (GtkWidget *widget,
703
decor_t *d = (decor_t *) data;
707
GdkWindow *gdk_frame_window = gtk_widget_get_window (d->decor_window);
708
gdk_window_reparent (gdk_frame_window, d->frame_window, 0, 0);
709
gdk_window_lower (gdk_frame_window);
714
static event_callback
715
find_event_callback_for_point (decor_t *d,
725
for (i = 0; i < BUTTON_NUM; ++i)
727
box = &d->button_windows[i].pos;
728
if (x >= box->x1 && x <= box->x2 &&
729
y >= box->y1 && y <= box->y2)
731
if (d->last_pos_entered != box)
735
if (leave && d->last_pos_entered)
740
return d->button_windows[i].callback;
744
for (i = 0; i < 3; ++i)
746
for (j = 0; j < 3; ++j)
748
box = &d->event_windows[i][j].pos;
749
if (x >= box->x1 && x <= box->x2 &&
750
y >= box->y1 && y <= box->y2)
752
if (d->last_pos_entered != box)
756
if (leave && d->last_pos_entered)
761
return d->event_windows[i][j].callback;
769
static event_callback
770
find_leave_event_callback (decor_t *d)
774
for (i = 0; i < BUTTON_NUM; ++i)
776
if (d->last_pos_entered == &d->button_windows[i].pos)
777
return d->button_windows[i].callback;
780
for (i = 0; i < 3; ++i)
782
for (j = 0; j < 3; ++j)
784
if (d->last_pos_entered == &d->event_windows[i][j].pos)
785
return d->event_windows[i][j].callback;
793
frame_handle_button_press (GtkWidget *widget,
794
GdkEventButton *event,
797
decor_t *d = (decor_t *) user_data;
801
/* Check to see where the event happened and fill out an appropriate
806
cb = find_event_callback_for_point (d, event->x, event->y,
809
if (cb && d->decorated)
811
decor_event gtkwd_event;
813
gtkwd_event.window = GDK_WINDOW_XID (d->frame_window);
814
gtkwd_event.button = event->button;
815
gtkwd_event.x = event->x;
816
gtkwd_event.y = event->y;
817
gtkwd_event.x_root = event->x_root;
818
gtkwd_event.y_root = event->y_root;
819
gtkwd_event.time = event->time;
821
(*cb) (d->win, >kwd_event, GButtonPress);
827
frame_handle_button_release (GtkWidget *widget,
828
GdkEventButton *event,
831
decor_t *d = (decor_t *) user_data;
837
cb = find_event_callback_for_point (d, event->x, event->y,
840
if (cb && d->decorated)
842
decor_event gtkwd_event;
844
gtkwd_event.window = GDK_WINDOW_XID (d->frame_window);
845
gtkwd_event.button = event->button;
846
gtkwd_event.x = event->x;
847
gtkwd_event.y = event->y;
848
gtkwd_event.x_root = event->x_root;
849
gtkwd_event.y_root = event->y_root;
850
gtkwd_event.time = event->time;
852
(*cb) (d->win, >kwd_event, GButtonRelease);
858
frame_handle_motion (GtkWidget *widget,
859
GdkEventMotion *event,
862
decor_t *d = (decor_t *) user_data;
866
event_callback cb = NULL;
867
Bool send_enter = FALSE;
868
Bool send_leave = FALSE;
871
cb = find_event_callback_for_point (d, event->x, event->y,
872
&send_enter, &send_leave,
875
if (cb && d->decorated)
877
decor_event gtkwd_event;
879
gtkwd_event.window = GDK_WINDOW_XID (d->frame_window);
880
gtkwd_event.x = event->x;
881
gtkwd_event.y = event->y;
882
gtkwd_event.x_root = event->x_root;
883
gtkwd_event.y_root = event->y_root;
884
gtkwd_event.time = event->time;
887
(*cb) (d->win, >kwd_event, GEnterNotify);
891
event_callback leave_cb;
893
leave_cb = find_leave_event_callback (d);
896
(*leave_cb) (d->win, >kwd_event, GLeaveNotify);
901
d->last_pos_entered = entered_box;
903
else if (d->last_pos_entered && d->decorated)
905
/* We are not in an event / button window but last_pos_entered
906
* is still set, so send a GLeaveNotify to last_pos_entered
910
event_callback leave_cb;
912
leave_cb = find_leave_event_callback (d);
916
decor_event gtkwd_event;
918
gtkwd_event.window = GDK_WINDOW_XID (d->frame_window);
919
gtkwd_event.x = event->x;
920
gtkwd_event.y = event->y;
921
gtkwd_event.x_root = event->x_root;
922
gtkwd_event.y_root = event->y_root;
923
gtkwd_event.time = event->time;
925
(*leave_cb) (d->win, >kwd_event, GLeaveNotify);
928
d->last_pos_entered = NULL;
934
641
event_filter_func (GdkXEvent *gdkxevent,
997
704
if (!get_window_prop (xid, select_window_atom, &select))
999
706
if (get_window_prop (xid, frame_input_window_atom, &frame))
1000
add_frame_window (win, frame, FALSE);
1002
remove_frame_window (win);
1006
if (xevent->xproperty.atom == frame_output_window_atom)
1010
xid = xevent->xproperty.window;
1012
win = wnck_window_get (xid);
1017
if (!get_window_prop (xid, select_window_atom, &select))
1019
if (get_window_prop (xid, frame_output_window_atom, &frame))
1020
add_frame_window (win, frame, TRUE);
707
add_frame_window (win, frame);
1022
709
remove_frame_window (win);