source: ldm/trunk/fuentes/wwm/events.c @ 516

Last change on this file since 516 was 516, checked in by mabarracus, 5 years ago

Copy trusty code

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    Client *c = find_client(e->window);
76
77    if (c)
78        set_shape(c);
79}
80
81void
82handle_configure_request(XConfigureRequestEvent *e)
83{
84    Client *c = find_client(e->window);
85    XWindowChanges wc;
86
87    wc.sibling = e->above;
88    wc.stack_mode = e->detail;
89
90    if (c) {
91        change_gravity(c, UNGRAVITATE);
92        if (e->value_mask & CWX)
93            c->x = e->x;
94        if (e->value_mask & CWY)
95            c->y = e->y;
96        if (e->value_mask & CWWidth)
97            c->width = e->width;
98        if (e->value_mask & CWHeight)
99            c->height = e->height;
100        if (c->x == 0 && c->width >= xmax())
101            c->x -= c->border;
102        if (c->y == 0 && c->height >= ymax())
103            c->y -= c->border;
104
105        change_gravity(c, GRAVITATE);
106
107        wc.x = c->x - c->border;
108        wc.y = c->y - c->border;
109        wc.width = c->width + (c->border * 2);
110        wc.height = c->height + (c->border * 2);
111        wc.border_width = 0;
112        XConfigureWindow(display, c->parent, e->value_mask, &wc);
113        send_config(c);
114    }
115
116    wc.x = c ? c->border : e->x;
117    wc.y = c ? c->border : e->y;
118    wc.width = e->width;
119    wc.height = e->height;
120    XConfigureWindow(display, e->window, e->value_mask, &wc);
121}
122
123void
124handle_map_request(XMapRequestEvent *e)
125{
126    Client *c = find_client(e->window);
127
128    if (c) {
129        if (c->vdesk != vdesk_get())
130            switch_vdesk(c->vdesk);
131        unhide(c, RAISE);
132    } else
133        make_new_client(e->window);
134}
135
136void
137handle_unmap_event(XUnmapEvent *e)
138{
139    Client *c = find_client(e->window);
140    Client *focus_to;
141
142    if (!c)
143        return;
144
145    if (c->ignore_unmap)
146        c->ignore_unmap--;
147    else {
148        /*
149         * Switch focus to next window on the screen, if there.
150         */
151        focus_to = next_client_on_vdesk(c);
152        remove_client(c, NOT_QUITTING);
153        if (focus_to)
154            focus_client(focus_to, NO_RAISE);
155    }
156}
157
158void
159handle_client_message(XClientMessageEvent *e)
160{
161    Client *c = find_client(e->window);
162
163    if (c &&                                        /* Client exists */
164        e->message_type == xa_wm_change_state &&    /* Changing state */
165        e->format == sz_xInternAtomReply &&         /* Data is long */
166        e->data.l[0] == IconicState)                /* We're now iconic */
167        hide(c);
168}
169
170void
171handle_property_change(XPropertyEvent *e)
172{
173    Client *c = find_client(e->window);
174    long dummy;
175
176    if (c)
177        if (e->atom == XA_WM_NORMAL_HINTS)
178            XGetWMNormalHints(display, c->window, c->size, &dummy);
179}
180
181void
182handle_enter_event(XCrossingEvent *e)
183{
184    Client *c = find_client(e->window);
185
186    if (nomousefocus || !c)           /* Ignore focus follows mouse */
187        return;
188
189    if (c->vdesk != vdesk_get() && c->vdesk != LOCKED)
190        return;
191
192    if (c != current)
193        focus_client(c, NO_RAISE);
194}
Note: See TracBrowser for help on using the repository browser.