xref: /OK3568_Linux_fs/debian/packages-patches/openbox/3.6.1-8/0002-Support-outline-moving.patch (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593SmuzhiyunFrom 116130994b622a6f02f237d95493afb0f4b28a18 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Mon, 8 Jul 2019 14:50:37 +0800
4*4882a593SmuzhiyunSubject: [PATCH 2/3] Support outline moving
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunSet "drawContents" to no in the rc.xml's resize section, eg.
7*4882a593Smuzhiyun<drawContents>no</drawContents> to enable outline moving.
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
10*4882a593Smuzhiyun---
11*4882a593Smuzhiyun openbox/client.c            |   2 +-
12*4882a593Smuzhiyun openbox/config.c            |   8 ++-
13*4882a593Smuzhiyun openbox/focus_cycle_popup.c |   4 ++
14*4882a593Smuzhiyun openbox/moveresize.c        | 109 ++++++++++++++++++++++++++++++++----
15*4882a593Smuzhiyun openbox/moveresize.h        |   2 +
16*4882a593Smuzhiyun openbox/popup.c             |   5 ++
17*4882a593Smuzhiyun 6 files changed, 116 insertions(+), 14 deletions(-)
18*4882a593Smuzhiyun
19*4882a593Smuzhiyundiff --git a/openbox/client.c b/openbox/client.c
20*4882a593Smuzhiyunindex f110a66e..8b405d1b 100644
21*4882a593Smuzhiyun--- a/openbox/client.c
22*4882a593Smuzhiyun+++ b/openbox/client.c
23*4882a593Smuzhiyun@@ -3220,7 +3220,7 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
24*4882a593Smuzhiyun     }
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun     /* adjust the frame */
27*4882a593Smuzhiyun-    if (fmoved || fresized) {
28*4882a593Smuzhiyun+    if (final || fmoved || fresized) {
29*4882a593Smuzhiyun         gulong ignore_start;
30*4882a593Smuzhiyun         if (!user)
31*4882a593Smuzhiyun             ignore_start = event_start_ignore_all_enters();
32*4882a593Smuzhiyundiff --git a/openbox/config.c b/openbox/config.c
33*4882a593Smuzhiyunindex d5129bc6..5f126258 100644
34*4882a593Smuzhiyun--- a/openbox/config.c
35*4882a593Smuzhiyun+++ b/openbox/config.c
36*4882a593Smuzhiyun@@ -834,7 +834,13 @@ static void parse_resize(xmlNodePtr node, gpointer d)
37*4882a593Smuzhiyun         else if (obt_xml_node_contains(n, "Nonpixel"))
38*4882a593Smuzhiyun             config_resize_popup_show = 1;
39*4882a593Smuzhiyun     }
40*4882a593Smuzhiyun-    if ((n = obt_xml_find_node(node, "popupPosition"))) {
41*4882a593Smuzhiyun+
42*4882a593Smuzhiyun+    if (!config_resize_redraw) {
43*4882a593Smuzhiyun+        /* Put popup center in outline moving mode */
44*4882a593Smuzhiyun+        config_resize_popup_pos = OB_RESIZE_POS_FIXED;
45*4882a593Smuzhiyun+        config_resize_popup_fixed.x.center = TRUE;
46*4882a593Smuzhiyun+        config_resize_popup_fixed.y.center = TRUE;
47*4882a593Smuzhiyun+    } else if ((n = obt_xml_find_node(node, "popupPosition"))) {
48*4882a593Smuzhiyun         if (obt_xml_node_contains(n, "Top"))
49*4882a593Smuzhiyun             config_resize_popup_pos = OB_RESIZE_POS_TOP;
50*4882a593Smuzhiyun         else if (obt_xml_node_contains(n, "Center"))
51*4882a593Smuzhiyundiff --git a/openbox/focus_cycle_popup.c b/openbox/focus_cycle_popup.c
52*4882a593Smuzhiyunindex e1ea8488..de6c3082 100644
53*4882a593Smuzhiyun--- a/openbox/focus_cycle_popup.c
54*4882a593Smuzhiyun+++ b/openbox/focus_cycle_popup.c
55*4882a593Smuzhiyun@@ -421,6 +421,8 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
56*4882a593Smuzhiyun     g_assert(mode == OB_FOCUS_CYCLE_POPUP_MODE_ICONS ||
57*4882a593Smuzhiyun              mode == OB_FOCUS_CYCLE_POPUP_MODE_LIST);
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun+    moveresize_clear_outline();
60*4882a593Smuzhiyun+
61*4882a593Smuzhiyun     screen_area = screen_physical_area_primary(FALSE);
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun     /* get the outside margins */
64*4882a593Smuzhiyun@@ -737,6 +739,8 @@ void focus_cycle_popup_hide(void)
65*4882a593Smuzhiyun {
66*4882a593Smuzhiyun     gulong ignore_start;
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun+    moveresize_clear_outline();
69*4882a593Smuzhiyun+
70*4882a593Smuzhiyun     ignore_start = event_start_ignore_all_enters();
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun     XUnmapWindow(obt_display, popup.bg);
73*4882a593Smuzhiyundiff --git a/openbox/moveresize.c b/openbox/moveresize.c
74*4882a593Smuzhiyunindex 0a301caf..1db4726c 100644
75*4882a593Smuzhiyun--- a/openbox/moveresize.c
76*4882a593Smuzhiyun+++ b/openbox/moveresize.c
77*4882a593Smuzhiyun@@ -71,6 +71,12 @@ static guint sync_timer = 0;
78*4882a593Smuzhiyun static glong last_move_time = 0;
79*4882a593Smuzhiyun static guint move_timer = 0;
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun+static GC outline_gc = NULL;
82*4882a593Smuzhiyun+static gint outline_x = 0;
83*4882a593Smuzhiyun+static gint outline_y = 0;
84*4882a593Smuzhiyun+static gint outline_w = 0;
85*4882a593Smuzhiyun+static gint outline_h = 0;
86*4882a593Smuzhiyun+
87*4882a593Smuzhiyun static ObPopup *popup = NULL;
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun static void do_move(gboolean keyboard, gint keydist);
90*4882a593Smuzhiyun@@ -333,6 +339,8 @@ void moveresize_end(gboolean cancel)
91*4882a593Smuzhiyun     } else {
92*4882a593Smuzhiyun         if (move_timer) g_source_remove(move_timer);
93*4882a593Smuzhiyun         move_timer = 0;
94*4882a593Smuzhiyun+
95*4882a593Smuzhiyun+        moveresize_clear_outline();
96*4882a593Smuzhiyun     }
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun     /* don't use client_move() here, use the same width/height as
99*4882a593Smuzhiyun@@ -375,11 +383,94 @@ void moveresize_end(gboolean cancel)
100*4882a593Smuzhiyun     moveresize_client = NULL;
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun-static gboolean move_func(gpointer data)
104*4882a593Smuzhiyun+static void draw_outline(gint x, gint y, gint w, gint h)
105*4882a593Smuzhiyun+{
106*4882a593Smuzhiyun+    if (!outline_gc) {
107*4882a593Smuzhiyun+        /* Start outline moving */
108*4882a593Smuzhiyun+        XGCValues gcv;
109*4882a593Smuzhiyun+
110*4882a593Smuzhiyun+        gcv.function = GXinvert;
111*4882a593Smuzhiyun+        gcv.line_width = 2;
112*4882a593Smuzhiyun+        gcv.subwindow_mode = IncludeInferiors;
113*4882a593Smuzhiyun+
114*4882a593Smuzhiyun+        outline_gc = XCreateGC(obt_display, obt_root(ob_screen),
115*4882a593Smuzhiyun+                               GCFunction | GCLineWidth | GCSubwindowMode,
116*4882a593Smuzhiyun+                               &gcv);
117*4882a593Smuzhiyun+
118*4882a593Smuzhiyun+        grab_server(TRUE);
119*4882a593Smuzhiyun+    }
120*4882a593Smuzhiyun+
121*4882a593Smuzhiyun+    if (outline_w || outline_h)
122*4882a593Smuzhiyun+        XDrawRectangle(obt_display, obt_root(ob_screen), outline_gc,
123*4882a593Smuzhiyun+                       outline_x, outline_y, outline_w, outline_h);
124*4882a593Smuzhiyun+
125*4882a593Smuzhiyun+    outline_x = x;
126*4882a593Smuzhiyun+    outline_y = y;
127*4882a593Smuzhiyun+    outline_w = w;
128*4882a593Smuzhiyun+    outline_h = h;
129*4882a593Smuzhiyun+
130*4882a593Smuzhiyun+    if (outline_w || outline_h)
131*4882a593Smuzhiyun+        XDrawRectangle(obt_display, obt_root(ob_screen), outline_gc,
132*4882a593Smuzhiyun+                       outline_x, outline_y, outline_w, outline_h);
133*4882a593Smuzhiyun+}
134*4882a593Smuzhiyun+
135*4882a593Smuzhiyun+void moveresize_clear_outline(void)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun-    client_configure(moveresize_client, cur_x, cur_y, cur_w, cur_h,
138*4882a593Smuzhiyun-                     TRUE, FALSE, FALSE);
139*4882a593Smuzhiyun+    if (!outline_gc)
140*4882a593Smuzhiyun+        return;
141*4882a593Smuzhiyun+
142*4882a593Smuzhiyun+    XDrawRectangle(obt_display, obt_root(ob_screen), outline_gc,
143*4882a593Smuzhiyun+                   outline_x, outline_y, outline_w, outline_h);
144*4882a593Smuzhiyun+
145*4882a593Smuzhiyun+    outline_x = outline_y = outline_w = outline_h = 0;
146*4882a593Smuzhiyun+
147*4882a593Smuzhiyun+    /* Finish outline moving */
148*4882a593Smuzhiyun+    grab_server(FALSE);
149*4882a593Smuzhiyun+    XFreeGC(obt_display, outline_gc);
150*4882a593Smuzhiyun+    outline_gc = NULL;
151*4882a593Smuzhiyun+}
152*4882a593Smuzhiyun+
153*4882a593Smuzhiyun+static void do_move_func(void)
154*4882a593Smuzhiyun+{
155*4882a593Smuzhiyun+    gint x, y, w, h, lw, lh;
156*4882a593Smuzhiyun+
157*4882a593Smuzhiyun+    /* The opaque moving mode */
158*4882a593Smuzhiyun+    if (config_resize_redraw) {
159*4882a593Smuzhiyun+        client_configure(moveresize_client, cur_x, cur_y, cur_w, cur_h,
160*4882a593Smuzhiyun+                         TRUE, FALSE, FALSE);
161*4882a593Smuzhiyun+
162*4882a593Smuzhiyun+        if (config_resize_popup_show == 2) /* == "Always" */
163*4882a593Smuzhiyun+            popup_coords(moveresize_client, "%d x %d",
164*4882a593Smuzhiyun+                         moveresize_client->frame->area.x,
165*4882a593Smuzhiyun+                         moveresize_client->frame->area.y);
166*4882a593Smuzhiyun+
167*4882a593Smuzhiyun+        return;
168*4882a593Smuzhiyun+    }
169*4882a593Smuzhiyun+
170*4882a593Smuzhiyun+    /* Draw outline at new frame area */
171*4882a593Smuzhiyun+    x = cur_x;
172*4882a593Smuzhiyun+    y = cur_y;
173*4882a593Smuzhiyun+    w = cur_w;
174*4882a593Smuzhiyun+    h = cur_h;
175*4882a593Smuzhiyun+    client_try_configure(moveresize_client, &x, &y, &w, &h,
176*4882a593Smuzhiyun+                         &lw, &lh, TRUE);
177*4882a593Smuzhiyun+
178*4882a593Smuzhiyun+    draw_outline(x, y, moveresize_client->frame->area.width,
179*4882a593Smuzhiyun+                 moveresize_client->frame->area.height);
180*4882a593Smuzhiyun+
181*4882a593Smuzhiyun+    /* Draw popup above outline */
182*4882a593Smuzhiyun+    if (config_resize_popup_show == 2) /* == "Always" */ {
183*4882a593Smuzhiyun+        /* Hacky way to avoid outline clear */
184*4882a593Smuzhiyun+        GC gc = outline_gc;
185*4882a593Smuzhiyun+        outline_gc = NULL;
186*4882a593Smuzhiyun+        popup_coords(moveresize_client, "%d x %d", x, y);
187*4882a593Smuzhiyun+        outline_gc = gc;
188*4882a593Smuzhiyun+    }
189*4882a593Smuzhiyun+}
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun+static gboolean move_func(gpointer data)
192*4882a593Smuzhiyun+{
193*4882a593Smuzhiyun+    do_move_func();
194*4882a593Smuzhiyun     move_timer = 0;
195*4882a593Smuzhiyun     return FALSE; /* don't repeat */
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun@@ -394,9 +485,9 @@ static void do_move(gboolean keyboard, gint keydist)
198*4882a593Smuzhiyun     if (!keyboard) resist = config_resist_edge;
199*4882a593Smuzhiyun     resist_move_monitors(moveresize_client, resist, &cur_x, &cur_y);
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun+    config_move_interval = 16;
202*4882a593Smuzhiyun     if (!config_move_interval) {
203*4882a593Smuzhiyun-        client_configure(moveresize_client, cur_x, cur_y, cur_w, cur_h,
204*4882a593Smuzhiyun-                         TRUE, FALSE, FALSE);
205*4882a593Smuzhiyun+        do_move_func();
206*4882a593Smuzhiyun     } else if (!move_timer) {
207*4882a593Smuzhiyun         GTimeVal curr_tm;
208*4882a593Smuzhiyun         glong now_ms, next_ms;
209*4882a593Smuzhiyun@@ -406,19 +497,13 @@ static void do_move(gboolean keyboard, gint keydist)
210*4882a593Smuzhiyun         next_ms = last_move_time + config_move_interval;
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun         if (next_ms <= now_ms) {
213*4882a593Smuzhiyun-            client_configure(moveresize_client, cur_x, cur_y, cur_w, cur_h,
214*4882a593Smuzhiyun-                             TRUE, FALSE, FALSE);
215*4882a593Smuzhiyun+            do_move_func();
216*4882a593Smuzhiyun             last_move_time = now_ms;
217*4882a593Smuzhiyun         } else {
218*4882a593Smuzhiyun             move_timer = g_timeout_add(config_move_interval, move_func, NULL);
219*4882a593Smuzhiyun             last_move_time = next_ms;
220*4882a593Smuzhiyun         }
221*4882a593Smuzhiyun     }
222*4882a593Smuzhiyun-
223*4882a593Smuzhiyun-    if (config_resize_popup_show == 2) /* == "Always" */
224*4882a593Smuzhiyun-        popup_coords(moveresize_client, "%d x %d",
225*4882a593Smuzhiyun-                     moveresize_client->frame->area.x,
226*4882a593Smuzhiyun-                     moveresize_client->frame->area.y);
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun static void do_resize(void)
230*4882a593Smuzhiyundiff --git a/openbox/moveresize.h b/openbox/moveresize.h
231*4882a593Smuzhiyunindex 2d0f7dce..87b4b7c8 100644
232*4882a593Smuzhiyun--- a/openbox/moveresize.h
233*4882a593Smuzhiyun+++ b/openbox/moveresize.h
234*4882a593Smuzhiyun@@ -49,4 +49,6 @@ void moveresize_end(gboolean cancel);
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun gboolean moveresize_event(XEvent *e);
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun+void moveresize_clear_outline(void);
239*4882a593Smuzhiyun+
240*4882a593Smuzhiyun #endif
241*4882a593Smuzhiyundiff --git a/openbox/popup.c b/openbox/popup.c
242*4882a593Smuzhiyunindex 5ecf2fa5..fc219ead 100644
243*4882a593Smuzhiyun--- a/openbox/popup.c
244*4882a593Smuzhiyun+++ b/openbox/popup.c
245*4882a593Smuzhiyun@@ -25,6 +25,7 @@
246*4882a593Smuzhiyun #include "stacking.h"
247*4882a593Smuzhiyun #include "event.h"
248*4882a593Smuzhiyun #include "screen.h"
249*4882a593Smuzhiyun+#include "moveresize.h"
250*4882a593Smuzhiyun #include "obrender/render.h"
251*4882a593Smuzhiyun #include "obrender/theme.h"
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun@@ -163,6 +164,8 @@ void popup_delay_show(ObPopup *self, gulong msec, gchar *text)
254*4882a593Smuzhiyun     Rect mon;
255*4882a593Smuzhiyun     gboolean hasicon = self->hasicon;
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun+    moveresize_clear_outline();
258*4882a593Smuzhiyun+
259*4882a593Smuzhiyun     /* when there is no icon and the text is not parent relative, then
260*4882a593Smuzhiyun        fill the whole dialog with the text appearance, don't use the bg at all
261*4882a593Smuzhiyun     */
262*4882a593Smuzhiyun@@ -317,6 +320,8 @@ void popup_hide(ObPopup *self)
263*4882a593Smuzhiyun     if (self->mapped) {
264*4882a593Smuzhiyun         gulong ignore_start;
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun+        moveresize_clear_outline();
267*4882a593Smuzhiyun+
268*4882a593Smuzhiyun         /* kill enter events cause by this unmapping */
269*4882a593Smuzhiyun         ignore_start = event_start_ignore_all_enters();
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun--
272*4882a593Smuzhiyun2.17.1
273*4882a593Smuzhiyun
274