Merge lp:~attente/gtk/mir-fix-menubar-mouseover into lp:~ubuntu-desktop/gtk/ubuntugtk3
- mir-fix-menubar-mouseover
- Merge into ubuntugtk3
Proposed by
William Hua
on 2015-01-08
| Status: | Merged |
|---|---|
| Merged at revision: | 398 |
| Proposed branch: | lp:~attente/gtk/mir-fix-menubar-mouseover |
| Merge into: | lp:~ubuntu-desktop/gtk/ubuntugtk3 |
| Diff against target: |
577 lines (+241/-122) 1 file modified
debian/patches/mir-backend-unmerged.patch (+241/-122) |
| To merge this branch: | bzr merge lp:~attente/gtk/mir-fix-menubar-mouseover |
| Related bugs: |
| Reviewer | Review Type | Date Requested | Status |
|---|---|---|---|
| Iain Lane | 2015-01-08 | Approve on 2015-01-16 | |
|
Review via email:
|
|||
Commit Message
Add fix for menu bar issues in mir backend.
Description of the Change
Add fix for menu bar issues in mir backend.
To post a comment you must log in.
lp:~attente/gtk/mir-fix-menubar-mouseover
updated
on 2015-01-12
- 396. By William Hua on 2015-01-12
-
Forgot to remove fuzz...
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
| 1 | === modified file 'debian/patches/mir-backend-unmerged.patch' |
| 2 | --- debian/patches/mir-backend-unmerged.patch 2014-12-13 15:50:03 +0000 |
| 3 | +++ debian/patches/mir-backend-unmerged.patch 2015-01-12 15:19:21 +0000 |
| 4 | @@ -1,45 +1,49 @@ |
| 5 | -From 447c406a112e5dd6cc3b49f17bfa779d24e2ef3a Mon Sep 17 00:00:00 2001 |
| 6 | +From e1eec3144dea6f4f56d3a44a70fd0445a8baf626 Mon Sep 17 00:00:00 2001 |
| 7 | From: William Hua <william@attente.ca> |
| 8 | Date: Fri, 28 Nov 2014 08:33:03 -0500 |
| 9 | -Subject: [PATCH 2/2] mir: unmerged commits from wip/mir2 branch |
| 10 | +Subject: [PATCH] mir: unmerged commits from wip/mir2 branch |
| 11 | |
| 12 | Backported from: |
| 13 | -ce596da0d8eee33016bae8bda3d621860b45bccb |
| 14 | -af8cf6945cea6b4257b7ca8b589efc69a8f48129 |
| 15 | -d8fc26da795d2b1730291879eac961441764c80a |
| 16 | -13eb820d7f37a7a4b7e9eb00dd897acfbe116c3c |
| 17 | -73002dca915da3834c6ccf4af422f9fb443637de |
| 18 | -c9c85e1d9f87120c2f43764c78263d216fe04585 |
| 19 | -6db489dc399bfb1fb0fc206d0bd206ac3468c3c7 |
| 20 | -731b01de1f18354be1da21eeaf6ed8066b622a74 |
| 21 | -92dd2b7cb0a53f9d4480472d1a3756bcfae778c8 |
| 22 | -292229fa415133cc6801121eedc460caee287618 |
| 23 | -d2a0e3d013d5521f790aaf81cf68ff531adc7e3d |
| 24 | -7d3257af05e364a7efa250a692e8e0dd2af6280a |
| 25 | -f060bfbc338d109cc12f143761bf9d8d235171e7 |
| 26 | -310faf6c914967c58fa944577cd2238658e9f22a |
| 27 | -62f25bef0f30350faf152b0d885ce01ad341ea70 |
| 28 | -52504167c1aeda2b76c24ad701d44a79968f715c |
| 29 | -ada2ed8eca7f3e116a0e171dcbf6c13eda28c9c4 |
| 30 | -cc0f748f4d883103b50cfa09acda5c239f1a80d1 |
| 31 | -84119c20f297e4d02f4667a3d4d921e785fd77e9 |
| 32 | -d4d6d519bc88c79bfca6902f8f9f17a2392ae4ba |
| 33 | -b9890b3d9ee8a8d3cbb31db6d4446910987f63ec |
| 34 | +17197a742a3be693e2a354c537f4d19318e21da8 |
| 35 | +473d34d756f831f83febf674bbab02a301bddd43 |
| 36 | +ae3b2f249b99dd755bfc13878bf05af87f6382af |
| 37 | +a8700fb23d93052322d97c93ddde8975d030434e |
| 38 | +6cd3b430f7ddafdfb92fff339272bcd307648179 |
| 39 | +ffb39c8f552053ba63273925b38402197ee2d52d |
| 40 | +8d57822a20ccb4fe2b26e11e09d6e25e6243ae1d |
| 41 | +92e8bd0f5e1dc725fb558c64d5c45231e1fdb96f |
| 42 | +6249b8c3cab68ad583a1301d2f7d22f0ffd555b7 |
| 43 | +b2904faa8c6aa36dce7a91cac901ad3dd770ba36 |
| 44 | +34ba7d03b4340bfc16697454d528377ef015a4aa |
| 45 | +b6d0a2149a1f0318b96d8d0a1f7ed723630cdea4 |
| 46 | +3c7855ec87dd288b921d5b3359e23efce5355644 |
| 47 | +d588ae47d57c2ceaaa5e3bf7a3273a15118d4669 |
| 48 | +25a6590b5dfb91bca2723f081bd82ac7d29c19b1 |
| 49 | +132ab62504e5d091647abf3a94da3fbd183fa961 |
| 50 | +2b62118dfd5a575776fe4dc59f962e46f5f0ef47 |
| 51 | +34834b3d0d43ed4ce3dc2cb1523f076a93cea2ee |
| 52 | +c9d4f3a2e1c2747235938a0baf189d480ebebb52 |
| 53 | +9f45287b5a50db306789af58c213731f6d193f4f |
| 54 | +cf2879d781afbecbc3a004c7d62ff55bdd9270ab |
| 55 | +bfb672ff3b9c8a48b1ad371e4081ca34e0ede674 |
| 56 | +d45cc36059246f1693f346290bd20623d03327c1 |
| 57 | +e13fc72af1f7ccad4f1fd7a3f4d077972627ad31 |
| 58 | +e5a1f9a1d326c2e3dd33153d7df5ea13b4eb06bf |
| 59 | --- |
| 60 | - gdk/mir/gdkmir-private.h | 9 ++++ |
| 61 | - gdk/mir/gdkmirdisplay.c | 17 +++++-- |
| 62 | - gdk/mir/gdkmireventsource.c | 109 ++++++++++++++++++++++++++++++-------------- |
| 63 | - gdk/mir/gdkmirkeymap.c | 14 ++++++ |
| 64 | - gdk/mir/gdkmirpointer.c | 6 +++ |
| 65 | - gdk/mir/gdkmirscreen.c | 22 ++++----- |
| 66 | - gdk/mir/gdkmirwindowimpl.c | 86 ++++++++++++++++++++++++++-------- |
| 67 | - 7 files changed, 195 insertions(+), 68 deletions(-) |
| 68 | + gdk/mir/gdkmir-private.h | 14 +++ |
| 69 | + gdk/mir/gdkmirdisplay.c | 17 +++- |
| 70 | + gdk/mir/gdkmireventsource.c | 221 ++++++++++++++++++++++++++++++++------------ |
| 71 | + gdk/mir/gdkmirkeymap.c | 14 +++ |
| 72 | + gdk/mir/gdkmirpointer.c | 6 ++ |
| 73 | + gdk/mir/gdkmirscreen.c | 22 ++--- |
| 74 | + gdk/mir/gdkmirwindowimpl.c | 95 +++++++++++++++---- |
| 75 | + 7 files changed, 295 insertions(+), 94 deletions(-) |
| 76 | |
| 77 | diff --git a/gdk/mir/gdkmir-private.h b/gdk/mir/gdkmir-private.h |
| 78 | -index 8305096..a5802f7 100644 |
| 79 | +index 053615a..6f0b6c3 100644 |
| 80 | --- a/gdk/mir/gdkmir-private.h |
| 81 | +++ b/gdk/mir/gdkmir-private.h |
| 82 | -@@ -45,6 +45,8 @@ GdkDevice *_gdk_mir_device_manager_get_keyboard (GdkDeviceManager *device_manage |
| 83 | +@@ -69,6 +69,8 @@ GdkDevice *_gdk_mir_device_manager_get_keyboard (GdkDeviceManager *device_manage |
| 84 | |
| 85 | GdkKeymap *_gdk_mir_keymap_new (void); |
| 86 | |
| 87 | @@ -48,23 +52,28 @@ |
| 88 | GdkDevice *_gdk_mir_keyboard_new (GdkDeviceManager *device_manager, const gchar *name); |
| 89 | |
| 90 | GdkDevice *_gdk_mir_pointer_new (GdkDeviceManager *device_manager, const gchar *name); |
| 91 | -@@ -89,4 +91,11 @@ void _gdk_mir_print_resize_event (const MirResizeEvent *event); |
| 92 | +@@ -131,4 +133,16 @@ void _gdk_mir_print_resize_event (const MirResizeEvent *event); |
| 93 | |
| 94 | void _gdk_mir_print_event (const MirEvent *event); |
| 95 | |
| 96 | +/* TODO: Remove once we have proper transient window support. */ |
| 97 | +GdkWindow * _gdk_mir_window_get_visible_transient_child (GdkWindow *window, |
| 98 | -+ gint x, |
| 99 | -+ gint y, |
| 100 | -+ gint *out_x, |
| 101 | -+ gint *out_y); |
| 102 | ++ gdouble x, |
| 103 | ++ gdouble y, |
| 104 | ++ gdouble *out_x, |
| 105 | ++ gdouble *out_y); |
| 106 | ++ |
| 107 | ++/* TODO: Remove once we have proper transient window support. */ |
| 108 | ++void _gdk_mir_window_transient_children_foreach (GdkWindow *window, |
| 109 | ++ void (*func) (GdkWindow *, gpointer), |
| 110 | ++ gpointer user_data); |
| 111 | + |
| 112 | #endif /* __GDK_PRIVATE_MIR_H__ */ |
| 113 | diff --git a/gdk/mir/gdkmirdisplay.c b/gdk/mir/gdkmirdisplay.c |
| 114 | -index 207342c..13793ec 100644 |
| 115 | +index 5c27b53..cc92a53 100644 |
| 116 | --- a/gdk/mir/gdkmirdisplay.c |
| 117 | +++ b/gdk/mir/gdkmirdisplay.c |
| 118 | -@@ -391,9 +391,20 @@ gdk_mir_display_create_window_impl (GdkDisplay *display, |
| 119 | +@@ -416,9 +416,20 @@ gdk_mir_display_create_window_impl (GdkDisplay *display, |
| 120 | g_printerr (" location=(%d, %d)", window->x, window->y); |
| 121 | g_printerr (" size=(%d, %d)", window->width, window->height); |
| 122 | g_printerr ("\n"); |
| 123 | @@ -89,7 +98,7 @@ |
| 124 | |
| 125 | static GdkKeymap * |
| 126 | diff --git a/gdk/mir/gdkmireventsource.c b/gdk/mir/gdkmireventsource.c |
| 127 | -index cfe36e8..18364b0 100644 |
| 128 | +index cfe36e8..9843e2a 100644 |
| 129 | --- a/gdk/mir/gdkmireventsource.c |
| 130 | +++ b/gdk/mir/gdkmireventsource.c |
| 131 | @@ -22,6 +22,8 @@ |
| 132 | @@ -259,7 +268,55 @@ |
| 133 | break; |
| 134 | default: |
| 135 | //case mir_key_action_multiple: |
| 136 | -@@ -284,6 +300,7 @@ handle_motion_event (GdkWindow *window, const MirMotionEvent *event) |
| 137 | +@@ -276,6 +292,47 @@ handle_key_event (GdkWindow *window, const MirKeyEvent *event) |
| 138 | + } |
| 139 | + } |
| 140 | + |
| 141 | ++/* TODO: Remove once we have proper transient window support. */ |
| 142 | ++typedef struct |
| 143 | ++{ |
| 144 | ++ GdkWindow *except; |
| 145 | ++ gdouble x; |
| 146 | ++ gdouble y; |
| 147 | ++ guint32 time; |
| 148 | ++} LeaveInfo; |
| 149 | ++ |
| 150 | ++/* TODO: Remove once we have proper transient window support. */ |
| 151 | ++/* |
| 152 | ++ * leave_windows_except: |
| 153 | ++ * |
| 154 | ++ * Generate a leave event for every window except the one the cursor is in. |
| 155 | ++ */ |
| 156 | ++static void |
| 157 | ++leave_windows_except (GdkWindow *window, |
| 158 | ++ gpointer user_data) |
| 159 | ++{ |
| 160 | ++ LeaveInfo info = *((LeaveInfo *) user_data); |
| 161 | ++ |
| 162 | ++ info.x -= window->x; |
| 163 | ++ info.y -= window->y; |
| 164 | ++ |
| 165 | ++ _gdk_mir_window_transient_children_foreach (window, leave_windows_except, &info); |
| 166 | ++ |
| 167 | ++ if (window != info.except) |
| 168 | ++ { |
| 169 | ++ GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); |
| 170 | ++ gboolean cursor_inside; |
| 171 | ++ MirMotionButton button_state; |
| 172 | ++ |
| 173 | ++ _gdk_mir_window_impl_get_cursor_state (impl, NULL, NULL, &cursor_inside, &button_state); |
| 174 | ++ |
| 175 | ++ if (cursor_inside) |
| 176 | ++ generate_crossing_event (window, GDK_LEAVE_NOTIFY, info.x, info.y, info.time); |
| 177 | ++ |
| 178 | ++ _gdk_mir_window_impl_set_cursor_state (impl, info.x, info.y, FALSE, button_state); |
| 179 | ++ } |
| 180 | ++} |
| 181 | ++ |
| 182 | + static void |
| 183 | + handle_motion_event (GdkWindow *window, const MirMotionEvent *event) |
| 184 | + { |
| 185 | +@@ -284,6 +341,7 @@ handle_motion_event (GdkWindow *window, const MirMotionEvent *event) |
| 186 | gboolean cursor_inside; |
| 187 | MirMotionButton button_state; |
| 188 | guint modifier_state; |
| 189 | @@ -267,53 +324,128 @@ |
| 190 | GdkEventType event_type; |
| 191 | MirMotionButton changed_button_state; |
| 192 | |
| 193 | -@@ -294,13 +311,14 @@ handle_motion_event (GdkWindow *window, const MirMotionEvent *event) |
| 194 | +@@ -294,45 +352,87 @@ handle_motion_event (GdkWindow *window, const MirMotionEvent *event) |
| 195 | y = event->pointer_coordinates[0].y; |
| 196 | } |
| 197 | modifier_state = get_modifier_state (event->modifiers, event->button_state); |
| 198 | + event_time = NANO_TO_MILLI (event->event_time); |
| 199 | |
| 200 | - /* The Mir events generate hover-exits even while inside the window so |
| 201 | - counteract this by always generating an enter notify on all other events */ |
| 202 | - if (!cursor_inside && event->action != mir_motion_action_hover_exit) |
| 203 | +- /* The Mir events generate hover-exits even while inside the window so |
| 204 | +- counteract this by always generating an enter notify on all other events */ |
| 205 | +- if (!cursor_inside && event->action != mir_motion_action_hover_exit) |
| 206 | ++ /* TODO: Remove once we have proper transient window support. */ |
| 207 | ++ if (event->action == mir_motion_action_hover_exit) |
| 208 | { |
| 209 | - cursor_inside = TRUE; |
| 210 | +- cursor_inside = TRUE; |
| 211 | - generate_crossing_event (window, GDK_ENTER_NOTIFY, x, y); |
| 212 | -+ generate_crossing_event (window, GDK_ENTER_NOTIFY, x, y, event_time); |
| 213 | - } |
| 214 | +- } |
| 215 | ++ LeaveInfo info; |
| 216 | |
| 217 | - /* Update which window has focus */ |
| 218 | -@@ -312,23 +330,23 @@ handle_motion_event (GdkWindow *window, const MirMotionEvent *event) |
| 219 | - event_type = event->action == mir_motion_action_down ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE; |
| 220 | - changed_button_state = button_state ^ event->button_state; |
| 221 | - if (changed_button_state == 0 || (changed_button_state & mir_motion_button_primary) != 0) |
| 222 | +- /* Update which window has focus */ |
| 223 | +- _gdk_mir_pointer_set_location (get_pointer (window), x, y, window, modifier_state); |
| 224 | +- switch (event->action) |
| 225 | ++ info.x = x; |
| 226 | ++ info.y = y; |
| 227 | ++ info.time = event_time; |
| 228 | ++ info.except = window; |
| 229 | ++ |
| 230 | ++ /* Leave all transient children from leaf to root, except the root since we do it later. */ |
| 231 | ++ _gdk_mir_window_transient_children_foreach (window, leave_windows_except, &info); |
| 232 | ++ } |
| 233 | ++ else |
| 234 | + { |
| 235 | +- case mir_motion_action_down: |
| 236 | +- case mir_motion_action_up: |
| 237 | +- event_type = event->action == mir_motion_action_down ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE; |
| 238 | +- changed_button_state = button_state ^ event->button_state; |
| 239 | +- if (changed_button_state == 0 || (changed_button_state & mir_motion_button_primary) != 0) |
| 240 | - generate_button_event (window, event_type, x, y, GDK_BUTTON_PRIMARY, modifier_state); |
| 241 | -+ generate_button_event (window, event_type, x, y, GDK_BUTTON_PRIMARY, modifier_state, event_time); |
| 242 | - if ((changed_button_state & mir_motion_button_secondary) != 0) |
| 243 | +- if ((changed_button_state & mir_motion_button_secondary) != 0) |
| 244 | - generate_button_event (window, event_type, x, y, GDK_BUTTON_SECONDARY, modifier_state); |
| 245 | -+ generate_button_event (window, event_type, x, y, GDK_BUTTON_SECONDARY, modifier_state, event_time); |
| 246 | - if ((changed_button_state & mir_motion_button_tertiary) != 0) |
| 247 | +- if ((changed_button_state & mir_motion_button_tertiary) != 0) |
| 248 | - generate_button_event (window, event_type, x, y, GDK_BUTTON_MIDDLE, modifier_state); |
| 249 | -+ generate_button_event (window, event_type, x, y, GDK_BUTTON_MIDDLE, modifier_state, event_time); |
| 250 | - button_state = event->button_state; |
| 251 | - break; |
| 252 | - case mir_motion_action_scroll: |
| 253 | +- button_state = event->button_state; |
| 254 | +- break; |
| 255 | +- case mir_motion_action_scroll: |
| 256 | - generate_scroll_event (window, x, y, event->pointer_coordinates[0].hscroll, event->pointer_coordinates[0].vscroll, modifier_state); |
| 257 | -+ generate_scroll_event (window, x, y, event->pointer_coordinates[0].hscroll, event->pointer_coordinates[0].vscroll, modifier_state, event_time); |
| 258 | - break; |
| 259 | - case mir_motion_action_move: // move with button |
| 260 | - case mir_motion_action_hover_move: // move without button |
| 261 | +- break; |
| 262 | +- case mir_motion_action_move: // move with button |
| 263 | +- case mir_motion_action_hover_move: // move without button |
| 264 | - generate_motion_event (window, x, y, modifier_state); |
| 265 | -+ generate_motion_event (window, x, y, modifier_state, event_time); |
| 266 | - break; |
| 267 | - case mir_motion_action_hover_exit: |
| 268 | - cursor_inside = FALSE; |
| 269 | +- break; |
| 270 | +- case mir_motion_action_hover_exit: |
| 271 | +- cursor_inside = FALSE; |
| 272 | - generate_crossing_event (window, GDK_LEAVE_NOTIFY, x, y); |
| 273 | -+ generate_crossing_event (window, GDK_LEAVE_NOTIFY, x, y, event_time); |
| 274 | - break; |
| 275 | +- break; |
| 276 | ++ LeaveInfo info; |
| 277 | ++ |
| 278 | ++ info.x = x; |
| 279 | ++ info.y = y; |
| 280 | ++ info.time = event_time; |
| 281 | ++ info.except = _gdk_mir_window_get_visible_transient_child (window, x, y, &x, &y); |
| 282 | ++ |
| 283 | ++ /* Leave all transient children from leaf to root, except the pointer window since we enter it. */ |
| 284 | ++ _gdk_mir_window_transient_children_foreach (window, leave_windows_except, &info); |
| 285 | ++ |
| 286 | ++ window = info.except; |
| 287 | ++ |
| 288 | ++ if (window) |
| 289 | ++ { |
| 290 | ++ /* Enter the pointer window. */ |
| 291 | ++ gboolean cursor_inside_pointer_window; |
| 292 | ++ |
| 293 | ++ impl = GDK_MIR_WINDOW_IMPL (window->impl); |
| 294 | ++ _gdk_mir_window_impl_get_cursor_state (impl, NULL, NULL, &cursor_inside_pointer_window, NULL); |
| 295 | ++ |
| 296 | ++ if (!cursor_inside_pointer_window) |
| 297 | ++ { |
| 298 | ++ generate_crossing_event (window, GDK_ENTER_NOTIFY, x, y, event_time); |
| 299 | ++ _gdk_mir_window_impl_set_cursor_state (impl, x, y, TRUE, event->button_state); |
| 300 | ++ } |
| 301 | ++ } |
| 302 | } |
| 303 | |
| 304 | -@@ -396,9 +414,6 @@ gdk_mir_event_source_queue_event (GdkDisplay *display, |
| 305 | +- _gdk_mir_window_impl_set_cursor_state (impl, x, y, cursor_inside, button_state); |
| 306 | ++ if (window) |
| 307 | ++ { |
| 308 | ++ /* Update which window has focus */ |
| 309 | ++ _gdk_mir_pointer_set_location (get_pointer (window), x, y, window, modifier_state); |
| 310 | ++ switch (event->action) |
| 311 | ++ { |
| 312 | ++ case mir_motion_action_down: |
| 313 | ++ case mir_motion_action_up: |
| 314 | ++ event_type = event->action == mir_motion_action_down ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE; |
| 315 | ++ changed_button_state = button_state ^ event->button_state; |
| 316 | ++ if (changed_button_state == 0 || (changed_button_state & mir_motion_button_primary) != 0) |
| 317 | ++ generate_button_event (window, event_type, x, y, GDK_BUTTON_PRIMARY, modifier_state, event_time); |
| 318 | ++ if ((changed_button_state & mir_motion_button_secondary) != 0) |
| 319 | ++ generate_button_event (window, event_type, x, y, GDK_BUTTON_SECONDARY, modifier_state, event_time); |
| 320 | ++ if ((changed_button_state & mir_motion_button_tertiary) != 0) |
| 321 | ++ generate_button_event (window, event_type, x, y, GDK_BUTTON_MIDDLE, modifier_state, event_time); |
| 322 | ++ button_state = event->button_state; |
| 323 | ++ break; |
| 324 | ++ case mir_motion_action_scroll: |
| 325 | ++ generate_scroll_event (window, x, y, event->pointer_coordinates[0].hscroll, event->pointer_coordinates[0].vscroll, modifier_state, event_time); |
| 326 | ++ break; |
| 327 | ++ case mir_motion_action_move: // move with button |
| 328 | ++ case mir_motion_action_hover_move: // move without button |
| 329 | ++ generate_motion_event (window, x, y, modifier_state, event_time); |
| 330 | ++ break; |
| 331 | ++ case mir_motion_action_hover_exit: |
| 332 | ++ if (cursor_inside) |
| 333 | ++ { |
| 334 | ++ cursor_inside = FALSE; |
| 335 | ++ generate_crossing_event (window, GDK_LEAVE_NOTIFY, x, y, event_time); |
| 336 | ++ } |
| 337 | ++ break; |
| 338 | ++ } |
| 339 | ++ |
| 340 | ++ _gdk_mir_window_impl_set_cursor_state (impl, x, y, cursor_inside, button_state); |
| 341 | ++ } |
| 342 | + } |
| 343 | + |
| 344 | + static void |
| 345 | +@@ -396,9 +496,6 @@ gdk_mir_event_source_queue_event (GdkDisplay *display, |
| 346 | GdkWindow *window, |
| 347 | const MirEvent *event) |
| 348 | { |
| 349 | @@ -323,34 +455,12 @@ |
| 350 | // FIXME: Only generate events if the window wanted them? |
| 351 | switch (event->type) |
| 352 | { |
| 353 | -@@ -459,7 +474,34 @@ gdk_mir_event_source_convert_events (GdkMirEventSource *source) |
| 354 | +@@ -459,7 +556,12 @@ gdk_mir_event_source_convert_events (GdkMirEventSource *source) |
| 355 | * event was being dispatched... |
| 356 | */ |
| 357 | if (window != NULL) |
| 358 | - gdk_mir_event_source_queue_event (source->display, window, &event->event); |
| 359 | + { |
| 360 | -+ /* TODO: Remove once we have proper transient window support. */ |
| 361 | -+ if (event->event.type == mir_event_type_motion) |
| 362 | -+ { |
| 363 | -+ GdkWindow *child; |
| 364 | -+ gint x; |
| 365 | -+ gint y; |
| 366 | -+ |
| 367 | -+ x = event->event.motion.pointer_coordinates[0].x; |
| 368 | -+ y = event->event.motion.pointer_coordinates[0].y; |
| 369 | -+ |
| 370 | -+ child = _gdk_mir_window_get_visible_transient_child (window, x, y, &x, &y); |
| 371 | -+ |
| 372 | -+ if (child && child != window) |
| 373 | -+ { |
| 374 | -+ window = child; |
| 375 | -+ |
| 376 | -+ event->event.motion.pointer_count = MAX (event->event.motion.pointer_count, 1); |
| 377 | -+ event->event.motion.pointer_coordinates[0].x = x; |
| 378 | -+ event->event.motion.pointer_coordinates[0].y = y; |
| 379 | -+ } |
| 380 | -+ } |
| 381 | -+ |
| 382 | + if (source->log_events) |
| 383 | + _gdk_mir_print_event (&event->event); |
| 384 | + |
| 385 | @@ -359,7 +469,7 @@ |
| 386 | else |
| 387 | g_warning ("window was destroyed before event arrived..."); |
| 388 | |
| 389 | -@@ -554,6 +596,7 @@ _gdk_mir_event_source_new (GdkDisplay *display) |
| 390 | +@@ -554,6 +656,7 @@ _gdk_mir_event_source_new (GdkDisplay *display) |
| 391 | source = (GdkMirEventSource *) g_source; |
| 392 | g_mutex_init (&source->mir_event_lock); |
| 393 | source->display = display; |
| 394 | @@ -473,14 +583,14 @@ |
| 395 | } |
| 396 | |
| 397 | diff --git a/gdk/mir/gdkmirwindowimpl.c b/gdk/mir/gdkmirwindowimpl.c |
| 398 | -index 418724b..92521c9 100644 |
| 399 | +index 6431ed4..37f96dc 100644 |
| 400 | --- a/gdk/mir/gdkmirwindowimpl.c |
| 401 | +++ b/gdk/mir/gdkmirwindowimpl.c |
| 402 | -@@ -259,13 +259,22 @@ redraw_transient (GdkWindow *window) |
| 403 | +@@ -288,13 +288,22 @@ redraw_transient (GdkWindow *window) |
| 404 | gdk_window_invalidate_rect (GDK_MIR_WINDOW_IMPL (window->impl)->transient_for, &r, FALSE); |
| 405 | } |
| 406 | |
| 407 | -+/* Remove once we have proper transient window support. */ |
| 408 | ++/* TODO: Remove once we have proper transient window support. */ |
| 409 | +static gboolean |
| 410 | +should_render_in_parent (GdkWindow *window) |
| 411 | +{ |
| 412 | @@ -500,7 +610,7 @@ |
| 413 | { |
| 414 | redraw_transient (window); |
| 415 | return; |
| 416 | -@@ -327,7 +336,7 @@ gdk_mir_window_impl_ref_cairo_surface (GdkWindow *window) |
| 417 | +@@ -352,7 +361,7 @@ gdk_mir_window_impl_ref_cairo_surface (GdkWindow *window) |
| 418 | } |
| 419 | |
| 420 | /* Transient windows get rendered into a buffer and copied onto their parent */ |
| 421 | @@ -509,7 +619,7 @@ |
| 422 | { |
| 423 | cairo_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, window->width, window->height); |
| 424 | } |
| 425 | -@@ -363,13 +372,13 @@ gdk_mir_window_impl_ref_cairo_surface (GdkWindow *window) |
| 426 | +@@ -373,13 +382,13 @@ gdk_mir_window_impl_ref_cairo_surface (GdkWindow *window) |
| 427 | impl->cairo_surface = cairo_surface_reference (cairo_surface); |
| 428 | |
| 429 | /* Draw background */ |
| 430 | @@ -529,7 +639,7 @@ |
| 431 | |
| 432 | return cairo_surface; |
| 433 | } |
| 434 | -@@ -433,10 +442,11 @@ gdk_mir_window_impl_hide (GdkWindow *window) |
| 435 | +@@ -446,10 +455,11 @@ gdk_mir_window_impl_hide (GdkWindow *window) |
| 436 | //g_printerr ("gdk_mir_window_impl_hide window=%p\n", window); |
| 437 | GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); |
| 438 | |
| 439 | @@ -542,7 +652,7 @@ |
| 440 | redraw_transient (window); |
| 441 | } |
| 442 | |
| 443 | -@@ -446,10 +456,11 @@ gdk_mir_window_impl_withdraw (GdkWindow *window) |
| 444 | +@@ -459,10 +469,11 @@ gdk_mir_window_impl_withdraw (GdkWindow *window) |
| 445 | //g_printerr ("gdk_mir_window_impl_withdraw window=%p\n", window); |
| 446 | GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); |
| 447 | |
| 448 | @@ -555,7 +665,7 @@ |
| 449 | redraw_transient (window); |
| 450 | } |
| 451 | |
| 452 | -@@ -492,6 +503,7 @@ gdk_mir_window_impl_move_resize (GdkWindow *window, |
| 453 | +@@ -505,6 +516,7 @@ gdk_mir_window_impl_move_resize (GdkWindow *window, |
| 454 | gint width, |
| 455 | gint height) |
| 456 | { |
| 457 | @@ -563,7 +673,7 @@ |
| 458 | g_printerr ("gdk_mir_window_impl_move_resize"); |
| 459 | g_printerr (" window=%p", window); |
| 460 | if (with_move) |
| 461 | -@@ -499,16 +511,17 @@ gdk_mir_window_impl_move_resize (GdkWindow *window, |
| 462 | +@@ -512,16 +524,17 @@ gdk_mir_window_impl_move_resize (GdkWindow *window, |
| 463 | if (width > 0) |
| 464 | g_printerr (" size=%dx%dpx", width, height); |
| 465 | g_printerr ("\n"); |
| 466 | @@ -583,7 +693,7 @@ |
| 467 | { |
| 468 | window->x = x; |
| 469 | window->y = y; |
| 470 | -@@ -535,7 +548,7 @@ gdk_mir_window_impl_move_resize (GdkWindow *window, |
| 471 | +@@ -548,7 +561,7 @@ gdk_mir_window_impl_move_resize (GdkWindow *window, |
| 472 | } |
| 473 | |
| 474 | /* Redraw parent where we moved to */ |
| 475 | @@ -592,7 +702,7 @@ |
| 476 | redraw_transient (window); |
| 477 | } |
| 478 | |
| 479 | -@@ -699,7 +712,7 @@ gdk_mir_window_impl_input_shape_combine_region (GdkWindow *window, |
| 480 | +@@ -711,7 +724,7 @@ gdk_mir_window_impl_input_shape_combine_region (GdkWindow *window, |
| 481 | gint offset_x, |
| 482 | gint offset_y) |
| 483 | { |
| 484 | @@ -601,7 +711,7 @@ |
| 485 | } |
| 486 | |
| 487 | static void |
| 488 | -@@ -713,7 +726,7 @@ gdk_mir_window_impl_destroy (GdkWindow *window, |
| 489 | +@@ -725,7 +738,7 @@ gdk_mir_window_impl_destroy (GdkWindow *window, |
| 490 | impl->visible = FALSE; |
| 491 | ensure_no_surface (window); |
| 492 | |
| 493 | @@ -610,7 +720,7 @@ |
| 494 | { |
| 495 | /* Redraw parent */ |
| 496 | redraw_transient (window); |
| 497 | -@@ -850,7 +863,7 @@ static void |
| 498 | +@@ -862,7 +875,7 @@ static void |
| 499 | gdk_mir_window_impl_set_title (GdkWindow *window, |
| 500 | const gchar *title) |
| 501 | { |
| 502 | @@ -619,7 +729,7 @@ |
| 503 | } |
| 504 | |
| 505 | static void |
| 506 | -@@ -881,7 +894,7 @@ gdk_mir_window_impl_set_transient_for (GdkWindow *window, |
| 507 | +@@ -893,7 +906,7 @@ gdk_mir_window_impl_set_transient_for (GdkWindow *window, |
| 508 | |
| 509 | /* Link this window to the parent */ |
| 510 | impl->transient_for = parent; |
| 511 | @@ -628,7 +738,7 @@ |
| 512 | { |
| 513 | GdkMirWindowImpl *parent_impl = GDK_MIR_WINDOW_IMPL (parent->impl); |
| 514 | parent_impl->transient_children = g_list_append (parent_impl->transient_children, window); |
| 515 | -@@ -895,7 +908,42 @@ gdk_mir_window_impl_set_transient_for (GdkWindow *window, |
| 516 | +@@ -907,7 +920,51 @@ gdk_mir_window_impl_set_transient_for (GdkWindow *window, |
| 517 | } |
| 518 | |
| 519 | /* Remove surface if we had made one before this was set */ |
| 520 | @@ -640,22 +750,21 @@ |
| 521 | +/* TODO: Remove once we have proper transient window support. */ |
| 522 | +GdkWindow * |
| 523 | +_gdk_mir_window_get_visible_transient_child (GdkWindow *window, |
| 524 | -+ gint x, |
| 525 | -+ gint y, |
| 526 | -+ gint *out_x, |
| 527 | -+ gint *out_y) |
| 528 | ++ gdouble x, |
| 529 | ++ gdouble y, |
| 530 | ++ gdouble *out_x, |
| 531 | ++ gdouble *out_y) |
| 532 | +{ |
| 533 | + GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); |
| 534 | + GdkWindow *child = NULL; |
| 535 | + GList *i; |
| 536 | + |
| 537 | -+ if (x < window->x || x >= window->x + window->width || |
| 538 | -+ y < window->y || y >= window->y + window->height) |
| 539 | -+ return NULL; |
| 540 | -+ |
| 541 | + x -= window->x; |
| 542 | + y -= window->y; |
| 543 | + |
| 544 | ++ if (x < 0 || x >= window->width || y < 0 || y >= window->height) |
| 545 | ++ return NULL; |
| 546 | ++ |
| 547 | + for (i = impl->transient_children; i && !child; i = i->next) |
| 548 | + { |
| 549 | + if (GDK_MIR_WINDOW_IMPL (GDK_WINDOW (i->data)->impl)->visible) |
| 550 | @@ -669,10 +778,20 @@ |
| 551 | + *out_y = y; |
| 552 | + |
| 553 | + return window; |
| 554 | ++} |
| 555 | ++ |
| 556 | ++/* TODO: Remove once we have proper transient window support. */ |
| 557 | ++void |
| 558 | ++_gdk_mir_window_transient_children_foreach (GdkWindow *window, |
| 559 | ++ void (*func) (GdkWindow *, gpointer), |
| 560 | ++ gpointer user_data) |
| 561 | ++{ |
| 562 | ++ GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); |
| 563 | ++ g_list_foreach (impl->transient_children, (GFunc) func, user_data); |
| 564 | } |
| 565 | |
| 566 | static void |
| 567 | -@@ -1242,7 +1290,7 @@ gdk_mir_window_impl_set_shadow_width (GdkWindow *window, |
| 568 | +@@ -1254,7 +1311,7 @@ gdk_mir_window_impl_set_shadow_width (GdkWindow *window, |
| 569 | gint top, |
| 570 | gint bottom) |
| 571 | { |
| 572 | @@ -682,5 +801,5 @@ |
| 573 | |
| 574 | static void |
| 575 | -- |
| 576 | -2.1.3 |
| 577 | +2.1.4 |
| 578 |


Thanks, will be in the next upload