source: ldm/trunk/fuentes/wwm/events.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: 4.5 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/Xatom.h>
6#include <X11/XKBlib.h>
7#include <X11/extensions/shape.h>
8
9#include "wwm.h"
10
11void
12handle_key_event(XKeyEvent * e)
13{
14    int i;
15    Client *c = find_client(e->window);
16    KeySym key = XkbKeycodeToKeysym(display, e->keycode, 0, 0);
17
18    if (!c)
19        c = current;
20
21    /*
22     * If we're currently in passthrough mode, just pass through whatever
23     * key is typed and return.
24     */
25
26    if (passthrough) {
27        send_key_event(key);
28        return;
29    }
30
31    /*
32     * Search through our keytab for the right key
33     */
34
35    for (i = 0; keytab[i].key != 0; i++)
36        if (keytab[i].key == key) {
37            keytab[i].f(c);                      /* dispatch the function */
38            break;
39        }
40}
41
42void
43handle_button_event(XButtonEvent * e)
44{
45    // We want a minimal WM, so no mouse actions
46    return;
47
48    Window root = ROOTWINDOW;
49    Client *c = find_client(e->window);
50
51    if (e->window == root) {
52        return;
53        switch (e->button) {
54        case Button4:                           /* Scrolly wheel up in root */
55            prev_vdesk((Client *) NULL);
56            return;
57        case Button5:                           /* Scrolly wheel down in root */
58            next_vdesk((Client *) NULL);
59            return;
60        }
61    } else if (c) {
62        switch (e->button) {
63        case Button1:                           /* Left mouse = move */
64            move(c, 0);
65            return;
66        case Button3:                           /* Right mouse = resize */
67            resize(c, 0);
68            return;
69        }
70    }
71}
72
73void
74handle_shape_event(XShapeEvent * e)
75{
76    Client *c = find_client(e->window);
77
78    if (c)
79        set_shape(c);
80}
81
82void
83handle_configure_request(XConfigureRequestEvent * e)
84{
85    Client *c = find_client(e->window);
86    XWindowChanges wc;
87
88    wc.sibling = e->above;
89    wc.stack_mode = e->detail;
90
91    if (c) {
92        change_gravity(c, UNGRAVITATE);
93        if (e->value_mask & CWX)
94            c->x = e->x;
95        if (e->value_mask & CWY)
96            c->y = e->y;
97        if (e->value_mask & CWWidth)
98            c->width = e->width;
99        if (e->value_mask & CWHeight)
100            c->height = e->height;
101        if (c->x == 0 && c->width >= xmax())
102            c->x -= c->border;
103        if (c->y == 0 && c->height >= ymax())
104            c->y -= c->border;
105
106        change_gravity(c, GRAVITATE);
107
108        wc.x = c->x - c->border;
109        wc.y = c->y - c->border;
110        wc.width = c->width + (c->border * 2);
111        wc.height = c->height + (c->border * 2);
112        wc.border_width = 0;
113        XConfigureWindow(display, c->parent, e->value_mask, &wc);
114        send_config(c);
115    }
116
117    wc.x = c ? c->border : e->x;
118    wc.y = c ? c->border : e->y;
119    wc.width = e->width;
120    wc.height = e->height;
121    XConfigureWindow(display, e->window, e->value_mask, &wc);
122}
123
124void
125handle_map_request(XMapRequestEvent * e)
126{
127    Client *c = find_client(e->window);
128
129    if (c) {
130        if (c->vdesk != vdesk_get())
131            switch_vdesk(c->vdesk);
132        unhide(c, RAISE);
133    } else
134        make_new_client(e->window);
135}
136
137void
138handle_unmap_event(XUnmapEvent * e)
139{
140    Client *c = find_client(e->window);
141    Client *focus_to;
142
143    if (!c)
144        return;
145
146    if (c->ignore_unmap)
147        c->ignore_unmap--;
148    else {
149        /*
150         * Switch focus to next window on the screen, if there.
151         */
152        focus_to = next_client_on_vdesk(c);
153        remove_client(c, NOT_QUITTING);
154        if (focus_to)
155            focus_client(focus_to, NO_RAISE);
156    }
157}
158
159void
160handle_client_message(XClientMessageEvent * e)
161{
162    Client *c = find_client(e->window);
163
164    if (c &&                                     /* Client exists */
165        e->message_type == xa_wm_change_state && /* Changing state */
166        e->format == sz_xInternAtomReply &&      /* Data is long */
167        e->data.l[0] == IconicState)             /* We're now iconic */
168        hide(c);
169}
170
171void
172handle_property_change(XPropertyEvent * e)
173{
174    Client *c = find_client(e->window);
175    long dummy;
176
177    if (c)
178        if (e->atom == XA_WM_NORMAL_HINTS)
179            XGetWMNormalHints(display, c->window, c->size, &dummy);
180}
181
182void
183handle_enter_event(XCrossingEvent * e)
184{
185    Client *c = find_client(e->window);
186
187    if (nomousefocus || !c)                      /* Ignore focus follows mouse */
188        return;
189
190    if (c->vdesk != vdesk_get() && c->vdesk != LOCKED)
191        return;
192
193    if (c != current)
194        focus_client(c, NO_RAISE);
195}
Note: See TracBrowser for help on using the repository browser.