~ubuntu-branches/ubuntu/trusty/gtk2-engines-oxygen/trusty-proposed

« back to all changes in this revision

Viewing changes to drag.patch

  • Committer: Package Import Robot
  • Author(s): Scarlett Clark
  • Date: 2014-02-12 06:35:44 UTC
  • mfrom: (1.3.2)
  • Revision ID: package-import@ubuntu.com-20140212063544-nnetktl56v0huubt
Tags: 1.4.3-0ubuntu1
* New upstream release
* One major issue was fixed (basically some dangling
  pointers being wrongly accessed). (LP: #1219844)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
diff --git a/src/oxygenwindowmanager.cpp b/src/oxygenwindowmanager.cpp
2
 
index 4986384..c4ecedb 100644
3
 
--- a/src/oxygenwindowmanager.cpp
4
 
+++ b/src/oxygenwindowmanager.cpp
5
 
@@ -30,10 +30,6 @@
6
 
 #include "oxygenstyle.h"
7
 
 #include "config.h"
8
 
 
9
 
-#ifdef GDK_WINDOWING_X11
10
 
-#include <gdk/gdkx.h>
11
 
-#endif
12
 
-
13
 
 namespace Oxygen
14
 
 {
15
 
 
16
 
@@ -48,7 +44,8 @@ namespace Oxygen
17
 
         _widget( 0L ),
18
 
         _lastRejectedEvent( 0L ),
19
 
         _x(-1),
20
 
-        _y(-1)
21
 
+        _y(-1),
22
 
+        _time(0)
23
 
     {
24
 
         #if OXYGEN_DEBUG
25
 
         std::cerr << "Oxygen::WindowManager::WindowManager" << std::endl;
26
 
@@ -179,6 +176,7 @@ namespace Oxygen
27
 
             _widget = 0L;
28
 
             _x = -1;
29
 
             _y = -1;
30
 
+            _time = 0;
31
 
             _drag = false;
32
 
         }
33
 
 
34
 
@@ -390,51 +388,22 @@ namespace Oxygen
35
 
         if( distance < _dragDistance ) return false;
36
 
 
37
 
         // start drag from current position
38
 
-        return startDrag( widget, int(event->x_root), int(event->y_root) );
39
 
+        return startDrag( widget, int(event->x_root), int(event->y_root), event->time );
40
 
 
41
 
     }
42
 
 
43
 
     //_________________________________________________________________
44
 
-    bool WindowManager::startDrag( GtkWidget* widget, int x, int y )
45
 
+    bool WindowManager::startDrag( GtkWidget* widget, int x, int y, guint32 time )
46
 
     {
47
 
 
48
 
-        #ifdef GDK_WINDOWING_X11
49
 
         // create xevent and send.
50
 
-        XEvent xev;
51
 
         GtkWindow* topLevel = GTK_WINDOW( gtk_widget_get_toplevel( widget ) );
52
 
-        GdkWindow* window = gtk_widget_get_window( GTK_WIDGET( topLevel ) );
53
 
-        GdkDisplay* display = gtk_widget_get_display( GTK_WIDGET( topLevel ) );
54
 
-        GdkWindow* root = gdk_screen_get_root_window( gtk_window_get_screen( topLevel ) );
55
 
-
56
 
-        xev.xclient.type = ClientMessage;
57
 
-        xev.xclient.message_type = gdk_x11_get_xatom_by_name_for_display(display, "_NET_WM_MOVERESIZE");
58
 
-        xev.xclient.display = GDK_DISPLAY_XDISPLAY(display);
59
 
-        xev.xclient.window = GDK_WINDOW_XID(window);
60
 
-        xev.xclient.format = 32;
61
 
-        xev.xclient.data.l[0] = x;
62
 
-        xev.xclient.data.l[1] = y;
63
 
-        xev.xclient.data.l[2] = 8; // NET::Move
64
 
-        xev.xclient.data.l[3] = Button1;
65
 
-        xev.xclient.data.l[4] = 0;
66
 
-        XUngrabPointer(GDK_DISPLAY_XDISPLAY(display), CurrentTime);
67
 
-
68
 
-        XSendEvent(
69
 
-            GDK_DISPLAY_XDISPLAY(display),
70
 
-            GDK_WINDOW_XID(root),
71
 
-            False,
72
 
-            SubstructureRedirectMask | SubstructureNotifyMask,
73
 
-            &xev);
74
 
+        gtk_window_begin_move_drag( topLevel, 1, x, y, time );
75
 
 
76
 
         // force a release as some widgets miss it...
77
 
         finishDrag();
78
 
         return true;
79
 
 
80
 
-        #else
81
 
-
82
 
-        return false;
83
 
-
84
 
-        #endif
85
 
-
86
 
     }
87
 
 
88
 
     //_________________________________________________
89
 
@@ -445,6 +414,7 @@ namespace Oxygen
90
 
         _lastRejectedEvent = 0L;
91
 
         _x = -1;
92
 
         _y = -1;
93
 
+        _time = 0;
94
 
 
95
 
         // stop timer
96
 
         if( _timer.isRunning() ) _timer.stop();
97
 
@@ -452,10 +422,6 @@ namespace Oxygen
98
 
         if( _drag )
99
 
         {
100
 
 
101
 
-            #ifdef GDK_WINDOWING_X11
102
 
-            gdk_pointer_ungrab( CurrentTime );
103
 
-            #endif
104
 
-
105
 
             _drag = false;
106
 
             return true;
107
 
 
108
 
@@ -475,6 +441,7 @@ namespace Oxygen
109
 
             _widget = widget;
110
 
             _x = int(event->x_root);
111
 
             _y = int(event->y_root);
112
 
+            _time = event->time;
113
 
 
114
 
             // start timer
115
 
             if( _timer.isRunning() ) _timer.stop();
116
 
diff --git a/src/oxygenwindowmanager.h b/src/oxygenwindowmanager.h
117
 
index f8a774e..0687646 100644
118
 
--- a/src/oxygenwindowmanager.h
119
 
+++ b/src/oxygenwindowmanager.h
120
 
@@ -124,11 +124,11 @@ namespace Oxygen
121
 
         bool startDrag( GtkWidget*, GdkEventMotion* );
122
 
 
123
 
         //! start dragging widget
124
 
-        bool startDrag( GtkWidget*, int, int );
125
 
+        bool startDrag( GtkWidget*, int, int, guint32 );
126
 
 
127
 
         //! start dragging widget
128
 
         void startDrag( void )
129
 
-        { if( _drag && _widget ) startDrag( _widget, _x, _y ); }
130
 
+        { if( _drag && _widget ) startDrag( _widget, _x, _y, _time ); }
131
 
 
132
 
         //! finish dragging widget
133
 
         bool finishDrag( void );
134
 
@@ -249,6 +249,9 @@ namespace Oxygen
135
 
         int _x;
136
 
         int _y;
137
 
 
138
 
+        //! drag time
139
 
+        guint32 _time;
140
 
+
141
 
         //! widget typenames black-list
142
 
         std::vector<std::string> _blackList;
143