@@ -89,7 +89,7 @@ public class WingpanelInterface.FocusManager : Object {
89
89
}
90
90
}
91
91
92
- public bool begin_grab_focused_window (int x , int y , int button , uint time , uint state ) {
92
+ public bool begin_grab_focused_window (int x , int y ) {
93
93
unowned var display = Main . display;
94
94
unowned var window = display. get_focus_window ();
95
95
if (window == null || ! get_can_grab_window (window, x, y)) {
@@ -114,15 +114,34 @@ public class WingpanelInterface.FocusManager : Object {
114
114
}
115
115
116
116
if (window != null ) {
117
+ unowned var wm = Main . wm;
118
+ unowned var stage = wm. stage;
117
119
118
- #if HAS_MUTTER46
119
- Graphene . Point pos_hint = {x, y};
120
- window. begin_grab_op (Meta . GrabOp . MOVING , null , null , time, pos_hint);
121
- #elif HAS_MUTTER44
122
- window. begin_grab_op (Meta . GrabOp . MOVING , null , null , time);
123
- #else
124
- display. begin_grab_op (window, Meta . GrabOp . MOVING , false , true , button, state, time, x, y);
125
- #endif
120
+ var proxy = wm. push_modal (stage);
121
+
122
+ ulong handler = 0 ;
123
+ handler = stage. captured_event. connect ((event) = > {
124
+ if (event. get_type () == LEAVE ) {
125
+ /* We get leave emitted when beginning a grab op, so we have
126
+ to filter it in order to avoid disconnecting and popping twice */
127
+ return Clutter . EVENT_PROPAGATE ;
128
+ }
129
+
130
+ if (event. get_type () == MOTION || event. get_type () == TOUCH_UPDATE ) {
131
+ window. begin_grab_op (
132
+ Meta . GrabOp . MOVING ,
133
+ event. get_device (),
134
+ event. get_event_sequence (),
135
+ event. get_time (),
136
+ { x, y }
137
+ );
138
+ }
139
+
140
+ wm. pop_modal (proxy);
141
+ stage. disconnect (handler);
142
+
143
+ return Clutter . EVENT_PROPAGATE ;
144
+ });
126
145
return true ;
127
146
}
128
147
0 commit comments