source: ldm/trunk/fuentes/wwm/screen.c @ 855

Last change on this file since 855 was 855, checked in by mabarracus, 5 years ago
  • Updated sources to 2.2.18
  • Ported code from patches to apply in 2.2.18
File size: 7.6 KB
Line 
1#include <X11/Xlib.h>
2#include <X11/Xutil.h>
3#include <X11/keysym.h>
4#include <X11/Xproto.h>
5#include <X11/cursorfont.h>
6#include <stdlib.h>
7#include "wwm.h"
8
9void
10draw_outline(Client * c)
11{
12    Window root = ROOTWINDOW;
13    static int gc_initialized = 0;
14    static GC invert_gc;
15
16    if (!gc_initialized) {
17        XGCValues gv;
18
19        gc_initialized++;
20        gv.function = GXinvert;
21        gv.subwindow_mode = IncludeInferiors;
22        gv.line_width = DEF_BW;                  /* opt_bw */
23
24        invert_gc = XCreateGC(display, root,
25                              GCFunction | GCSubwindowMode | GCLineWidth,
26                              &gv);
27    }
28
29    XDrawRectangle(display, root, invert_gc, c->x - c->border,
30                   c->y - c->border, c->width + c->border,
31                   c->height + c->border);
32}
33
34void
35get_mouse_position(int *x, int *y)
36{
37    Window root = ROOTWINDOW;
38    Window dw1, dw2;
39    int t1, t2;
40    unsigned int t3;
41
42    XQueryPointer(display, root, &dw1, &dw2, x, y, &t1, &t2, &t3);
43}
44
45void
46recalculate_sweep(Client * c, int x1, int y1, int x2, int y2)
47{
48    int basex, basey;
49
50    c->width = (int) abs(x1 - x2);
51    c->height = (int) abs(y1 - y2);
52
53    if (c->size->flags & PResizeInc) {
54        basex = (c->size->flags & PBaseSize) ? c->size->base_width :
55            (c->size->flags & PMinSize) ? c->size->min_width : 0;
56        basey = (c->size->flags & PBaseSize) ? c->size->base_height :
57            (c->size->flags & PMinSize) ? c->size->min_height : 0;
58        c->width -= (c->width - basex) % c->size->width_inc;
59        c->height -= (c->height - basey) % c->size->height_inc;
60    }
61
62    if (c->size->flags & PMinSize) {
63        if (c->width < c->size->min_width)
64            c->width = c->size->min_width;
65        if (c->height < c->size->min_height)
66            c->height = c->size->min_height;
67    }
68
69    if (c->size->flags & PMaxSize) {
70        if (c->width > c->size->max_width)
71            c->width = c->size->max_width;
72        if (c->height > c->size->max_height)
73            c->height = c->size->max_height;
74    }
75
76    c->x = (x1 <= x2) ? x1 : x1 - c->width;
77    c->y = (y1 <= y2) ? y1 : y1 - c->height;
78}
79
80void
81sweep(Client * c)
82{
83    Window root = ROOTWINDOW;
84    static int resize_cursor_initialized = 0;
85    static Cursor resize_curs;
86    XEvent ev;
87    int old_cx = c->x;
88    int old_cy = c->y;
89
90    if (!resize_cursor_initialized) {
91        resize_cursor_initialized++;
92        resize_curs = XCreateFontCursor(display, XC_plus);
93    }
94
95    if (!grab(root, MouseMask, resize_curs))
96        return;
97
98    XGrabServer(display);
99
100    draw_outline(c);
101
102    XWarpPointer(display, None, c->window, 0, 0, 0, 0, c->width,
103                 c->height);
104
105    for (;;) {
106        XMaskEvent(display, MouseMask, &ev);
107        switch (ev.type) {
108        case MotionNotify:
109            draw_outline(c);                     /* clear */
110            XUngrabServer(display);
111            recalculate_sweep(c, old_cx, old_cy,
112                              ev.xmotion.x, ev.xmotion.y);
113            XSync(display, False);
114            XGrabServer(display);
115            draw_outline(c);
116            break;
117        case ButtonRelease:
118            draw_outline(c);                     /* clear */
119            XUngrabServer(display);
120            XUngrabPointer(display, CurrentTime);
121            return;
122        }
123    }
124}
125
126void
127drag(Client * c)
128{
129    Window root = ROOTWINDOW;
130    static int drag_cursor_initialized = 0;
131    static Cursor drag_curs;
132    XEvent ev;
133    int x1, y1;
134    int old_cx = c->x;
135    int old_cy = c->y;
136
137    if (!drag_cursor_initialized) {
138        drag_cursor_initialized++;
139        drag_curs = XCreateFontCursor(display, XC_fleur);
140    }
141
142    if (!grab(root, MouseMask, drag_curs))
143        return;
144    get_mouse_position(&x1, &y1);
145    XGrabServer(display);
146    draw_outline(c);
147    for (;;) {
148        XMaskEvent(display, MouseMask, &ev);
149        switch (ev.type) {
150        case MotionNotify:
151            draw_outline(c);                     /* clear */
152            XUngrabServer(display);
153            c->x = old_cx + (ev.xmotion.x - x1);
154            c->y = old_cy + (ev.xmotion.y - y1);
155            XSync(display, False);
156            XGrabServer(display);
157            draw_outline(c);
158            break;
159        case ButtonRelease:
160            draw_outline(c);                     /* clear */
161            XUngrabServer(display);
162            XUngrabPointer(display, CurrentTime);
163            return;
164        default:
165            break;
166        }
167    }
168}
169
170void
171move(Client * c, int set)
172{
173    if (!set)
174        drag(c);
175
176    XMoveWindow(display, c->parent, c->x - c->border, c->y - c->border);
177    send_config(c);
178    XRaiseWindow(display, c->parent);
179}
180
181void
182resize(Client * c, int set)
183{
184    if (!set)
185        sweep(c);
186
187    XMoveResizeWindow(display, c->parent, c->x - c->border,
188                      c->y - c->border, c->width + (c->border * 2),
189                      c->height + (c->border * 2));
190    XMoveResizeWindow(display, c->window, c->border, c->border,
191                      c->width, c->height);
192    send_config(c);
193    XRaiseWindow(display, c->parent);
194}
195
196void
197maximise_horiz(Client * c)
198{
199    if (c->oldw) {
200        c->x = c->oldx;
201        c->width = c->oldw;
202        c->oldw = 0;
203    } else {
204        c->oldx = c->x;
205        c->oldw = c->width;
206        recalculate_sweep(c, c->border, c->y,
207                          (xmax() - c->border), c->y + c->height);
208    }
209}
210
211void
212maximise_vert(Client * c)
213{
214    if (c->oldh) {
215        c->y = c->oldy;
216        c->height = c->oldh;
217        c->oldh = 0;
218    } else {
219        c->oldy = c->y;
220        c->oldh = c->height;
221        recalculate_sweep(c, c->x, c->border, c->x + c->width,
222                          (ymax() - c->border));
223    }
224}
225
226void
227hide(Client * c)
228{
229    c->ignore_unmap = 2;
230    XUnmapWindow(display, c->parent);
231    XUnmapWindow(display, c->window);
232    set_wm_state(c, IconicState);
233}
234
235void
236unhide(Client * c, int raiseit)
237{
238    c->ignore_unmap = 0;
239    XMapWindow(display, c->window);
240    raiseit ? XMapRaised(display, c->parent) : XMapWindow(display,
241                                                          c->parent);
242    set_wm_state(c, NormalState);
243}
244
245/*
246 * Next focuses the next client on this vdesk
247 */
248
249void
250next(Client * c)
251{
252    Client *newc;
253
254    newc = next_client_on_vdesk((c ? c : head_client));
255
256    if (!newc)
257        return;                                  /* couldn't find a next on this screen */
258
259    focus_client(newc, RAISE);
260}
261
262
263/*
264 * switch_vdesk changes to a different vdesk
265 */
266
267void
268switch_vdesk(int v)
269{
270    Client *c;
271    int vcurr = vdesk_get();
272
273    if (v == vcurr)
274        return;
275
276    for (c = head_client; c; c = c->next) {
277        if (c->vdesk == vcurr) {
278            hide(c);
279        } else if (c->vdesk == v) {
280            unhide(c, NO_RAISE);
281            if (c->focus)
282                focus_client(c, RAISE);
283        }
284    }
285
286    vdesk(VDESK_SET, v);
287}
288
289void
290focus_client(Client * c, int raiseit)
291{
292    Client *cp;
293
294    for (cp = head_client; cp; cp = cp->next)
295        if ((cp->vdesk == vdesk_get() || cp->vdesk == LOCKED) && cp->focus)
296            unfocus_client(cp);
297    unhide(c, raiseit);
298    XSetInputFocus(display, c->window, RevertToPointerRoot, CurrentTime);
299    XSetWindowBackground(display, c->parent,
300                         (c->vdesk == LOCKED) ? fc.pixel : fg.pixel);
301    XClearWindow(display, c->parent);
302    XGrabButton(display, AnyButton, WMMODMASK, c->parent, False,
303                ButtonMask, GrabModeAsync, GrabModeSync, None, None);
304    c->focus = 1;
305    current = c;
306}
307
308
309void
310unfocus_client(Client * c)
311{
312    XSetInputFocus(display, PointerRoot, RevertToPointerRoot, CurrentTime);
313    XSetWindowBackground(display, c->parent, bg.pixel);
314    XClearWindow(display, c->parent);
315    c->focus = 0;
316    current = NULL;
317}
Note: See TracBrowser for help on using the repository browser.