Merge lp:~ted/ido/calendar-fix into lp:ido/0.3

Proposed by Ted Gould
Status: Merged
Merged at revision: 90
Proposed branch: lp:~ted/ido/calendar-fix
Merge into: lp:ido/0.3
Diff against target: 85 lines (+50/-19)
1 file modified
src/idocalendarmenuitem.c (+50/-19)
To merge this branch: bzr merge lp:~ted/ido/calendar-fix
Reviewer Review Type Date Requested Status
Robert Carr (community) Approve
Indicator Applet Developers Pending
Review via email: mp+75792@code.launchpad.net

Description of the change

Pass button events along to the calendar. Turns out the calender uses which GDK Window is in the event for filtering out the events so we have to do some of the hit mask stuff ourselves :-/ But it works now.

To post a comment you must log in.
lp:~ted/ido/calendar-fix updated
91. By Ted Gould

Freeing the new event

Revision history for this message
Robert Carr (robertcarr) wrote :

+1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/idocalendarmenuitem.c'
2--- src/idocalendarmenuitem.c 2011-06-21 16:55:01 +0000
3+++ src/idocalendarmenuitem.c 2011-09-16 18:07:25 +0000
4@@ -196,31 +196,62 @@
5 ido_calendar_menu_item_button_press (GtkWidget *widget,
6 GdkEventButton *event)
7 {
8- GtkWidget *calendar = IDO_CALENDAR_MENU_ITEM (widget)->priv->calendar;
9-
10- if (event->button == 1)
11- {
12- if (gtk_widget_get_window (calendar) != NULL)
13- {
14- gdk_window_raise (gtk_widget_get_window (calendar));
15- }
16-
17- if (!gtk_widget_has_focus (calendar))
18- {
19- gtk_widget_grab_focus (calendar);
20- }
21-
22- return TRUE;
23- }
24-
25- return FALSE;
26+ GtkWidget *calendar = IDO_CALENDAR_MENU_ITEM (widget)->priv->calendar;
27+
28+ if (event->button == 1) {
29+ if (gtk_widget_get_window (calendar) != NULL) {
30+ gdk_window_raise (gtk_widget_get_window (calendar));
31+ }
32+
33+ if (!gtk_widget_has_focus (calendar)) {
34+ gtk_widget_grab_focus (calendar);
35+ }
36+
37+#if GTK_CHECK_VERSION (3, 0, 0)
38+ GdkEvent * newevent = gdk_event_copy((GdkEvent *)(event));
39+ GList * children = gdk_window_get_children(gtk_widget_get_window(calendar));
40+ GList * child;
41+
42+ gint root_x = event->x_root;
43+ gint root_y = event->y_root;
44+
45+ for (child = children; child != NULL; child = g_list_next(child)) {
46+ gint newx, newy;
47+ gint winx, winy;
48+ GdkWindow * newwindow = (GdkWindow*)child->data;
49+
50+ ((GdkEventButton *)newevent)->window = newwindow;
51+
52+ gdk_window_get_origin(newwindow, &winx, &winy);
53+ newx = root_x - winx;
54+ newy = root_y - winy;
55+
56+ if (newx >= 0 && newy >= 0 && newx < gdk_window_get_width(newwindow) && newy < gdk_window_get_height(newwindow)) {
57+ ((GdkEventButton *)newevent)->x = newx;
58+ ((GdkEventButton *)newevent)->y = newy;
59+
60+ GTK_WIDGET_GET_CLASS(calendar)->button_press_event(GTK_WIDGET(calendar), (GdkEventButton*)newevent);
61+ }
62+ }
63+
64+ ((GdkEventButton *)newevent)->window = event->window;
65+ gdk_event_free(newevent);
66+#endif
67+
68+ return TRUE;
69+ }
70+
71+ return FALSE;
72 }
73
74 static gboolean
75 ido_calendar_menu_item_button_release (GtkWidget *widget,
76 GdkEventButton *event)
77 {
78- // GtkWidget *calendar = IDO_CALENDAR_MENU_ITEM (widget)->priv->calendar;
79+#if GTK_CHECK_VERSION (3, 0, 0)
80+ GtkWidget *calendar = IDO_CALENDAR_MENU_ITEM (widget)->priv->calendar;
81+ GTK_WIDGET_GET_CLASS(calendar)->button_release_event(GTK_WIDGET(calendar), event);
82+#endif
83
84 return TRUE;
85 }

Subscribers

People subscribed via source and target branches