source: ldm/trunk/fuentes/wwm/main.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: 5.9 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <signal.h>
5#include <X11/Xlib.h>
6#include <X11/Xutil.h>
7#include <X11/keysym.h>
8#include <X11/Xproto.h>
9#include <X11/Xatom.h>
10#include <X11/Xresource.h>
11#include <X11/Xlib.h>
12#include <X11/extensions/shape.h>
13
14#include "wwm.h"
15
16void handle_shape_event(XShapeEvent * e);
17
18/*
19 * Globals definitions
20 */
21
22Client *head_client = NULL;     /* First client */
23Client *current = NULL;         /* "current" client */
24Display *display;               /* Our display */
25Atom xa_wm_state;               /* atoms for window manager functions */
26Atom xa_wm_change_state;
27Atom xa_wm_protos;
28Atom xa_wm_delete;
29XColor fg, bg, fc;              /* Forground, Background, and locked colours */
30int nomousefocus = 0;           /* focus follows mouse status */
31int passthrough = 0;            /* current passthrough state */
32char *term = NULL;              /* terminal to launch */
33int have_shape = 0;             /* Do we support shaped windows? */
34int ignore_xerror = 0;          /* Ignore X errors */
35
36struct wmkeys keytab[] = {
37    {0, dummy_func}
38};
39
40int
41main(int argc, char *argv[])
42{
43    struct sigaction act;
44    static char *dpy;
45    XEvent ev;
46    int shape_event;
47
48    dpy = getenv("DISPLAY");                     /* manage the display in $DISPLAY */
49
50    if (!dpy)
51        dpy = strdup(DEF_DISPLAY);
52
53    act.sa_handler = handle_signal;
54    sigemptyset(&act.sa_mask);
55#ifdef SA_NOCLDSTOP
56    act.sa_flags = SA_NOCLDSTOP;                 /* don't care about STOP, CONT */
57#else
58    act.sa_flags = 0;
59#endif
60    sigaction(SIGTERM, &act, NULL);
61    sigaction(SIGINT, &act, NULL);
62    sigaction(SIGHUP, &act, NULL);
63    sigaction(SIGCHLD, &act, NULL);
64
65    setup_display(dpy);
66
67    term = strdup(DEF_TERM);
68
69    if (!DEF_DL)
70        scan_windows();
71
72    /*
73     * Scan for the shape extention if it exists.
74     */
75
76    {
77        int e_dummy;
78        have_shape = XShapeQueryExtension(display, &shape_event, &e_dummy);
79    }
80
81    int x = xmax() / 2;
82    int y = ymax() / 2;
83    XWarpPointer(display, None, ROOTWINDOW, 0, 0, 0, 0, x, y);
84
85    /*
86     * main event loop here
87     */
88
89    for (;;) {
90        XNextEvent(display, &ev);
91        switch (ev.type) {
92        case KeyPress:
93            handle_key_event(&ev.xkey);
94            break;
95        case ButtonPress:
96            handle_button_event(&ev.xbutton);
97            break;
98        case ConfigureRequest:
99            handle_configure_request(&ev.xconfigurerequest);
100            break;
101        case MapRequest:
102            handle_map_request(&ev.xmaprequest);
103            break;
104        case ClientMessage:
105            handle_client_message(&ev.xclient);
106            break;
107        case EnterNotify:
108            handle_enter_event(&ev.xcrossing);
109            break;
110        case PropertyNotify:
111            handle_property_change(&ev.xproperty);
112            break;
113        case UnmapNotify:
114            handle_unmap_event(&ev.xunmap);
115            break;
116        default:
117            if (have_shape && ev.type == shape_event) {
118                handle_shape_event((XShapeEvent *) & ev);
119            }
120        }
121    }
122
123    return (1);                                  /* ?!?  shouldn't get here */
124}
125
126void
127setup_display(char *dpy)
128{
129    XSetWindowAttributes attr;
130    XColor dummy;
131    XModifierKeymap *modmap;
132    int i, j, screen;
133    Window root;
134    Colormap colormap;
135    unsigned int numlockmask = 0;
136
137    /*
138     * Set some of the defaults
139     */
140
141
142    /*
143     * Open the display
144     */
145
146    display = XOpenDisplay(dpy);
147    if (!display)                                /* couldn't open display */
148        exit(1);
149
150    XSetErrorHandler(handle_xerror);
151    XSetIOErrorHandler(handle_xexit);
152
153    screen = DefaultScreen(display);
154    root = RootWindow(display, screen);
155    colormap = DefaultColormap(display, screen);
156
157    /*
158     * Set up our window management atoms.
159     */
160
161    xa_wm_state = XInternAtom(display, "WM_STATE", False);
162    xa_wm_change_state = XInternAtom(display, "WM_CHANGE_STATE", False);
163    xa_wm_protos = XInternAtom(display, "WM_PROTOCOLS", False);
164    xa_wm_delete = XInternAtom(display, "WM_DELETE_WINDOW", False);
165
166    XAllocNamedColor(display, colormap, DEF_FG, &fg, &dummy);
167    XAllocNamedColor(display, colormap, DEF_BG, &bg, &dummy);
168    XAllocNamedColor(display, colormap, DEF_FC, &fc, &dummy);
169
170    /*
171     * find out which modifier is NumLock - we'll use this when grabbing
172     * every combination of modifiers we can think ofi
173     */
174
175    modmap = XGetModifierMapping(display);
176
177    for (i = 0; i < 8; i++)
178        for (j = 0; j < modmap->max_keypermod; j++)
179            if (modmap->modifiermap[i * modmap->max_keypermod + j] ==
180                XKeysymToKeycode(display, XK_Num_Lock))
181                numlockmask = (1 << i);
182
183    XFreeModifiermap(modmap);
184
185    attr.event_mask = KeyPressMask | ChildMask | PropertyChangeMask |
186        EnterWindowMask | ButtonMask;
187    XChangeWindowAttributes(display, root, CWEventMask, &attr);
188
189    for (i = 0; keytab[i].key != 0; i++) {
190        my_grab_key(keytab[i].key, WMMODMASK);
191        my_grab_key(keytab[i].key, LockMask | WMMODMASK);
192        if (numlockmask) {
193            my_grab_key(keytab[i].key, numlockmask | WMMODMASK);
194            my_grab_key(keytab[i].key, numlockmask | LockMask | WMMODMASK);
195        }
196    }
197}
198
199void
200my_grab_key(int keycode, unsigned int modifiers)
201{
202    Window root = RootWindow(display, DefaultScreen(display));
203    XGrabKey(display, XKeysymToKeycode(display, keycode),
204             modifiers, root, True, GrabModeAsync, GrabModeAsync);
205}
206
207void
208scan_windows(void)
209{
210    unsigned int i, nwins;
211    Window dw1, dw2, *wins;
212    XWindowAttributes attr;
213    Window root = RootWindow(display, DefaultScreen(display));
214
215    XQueryTree(display, root, &dw1, &dw2, &wins, &nwins);
216    for (i = 0; i < nwins; i++) {
217        XGetWindowAttributes(display, wins[i], &attr);
218        if (!attr.override_redirect && attr.map_state == IsViewable)
219            make_new_client(wins[i]);
220    }
221    XFree(wins);
222}
Note: See TracBrowser for help on using the repository browser.