add ewmh, compile now

This commit is contained in:
Martin Duquesnoy 2011-08-06 11:07:44 +02:00
parent 6886a6902a
commit 3da9117a8b
16 changed files with 421 additions and 97 deletions

View File

@ -25,11 +25,12 @@ client_configure(Client *c)
ev.border_width = 0;
ev.override_redirect = 0;
XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ev);
XSendEvent(W->dpy, c->win, False, StructureNotifyMask, (XEvent *)&ev);
XSync(W->dpy, False);
}
Client*
client_gb_win(Window *w)
client_gb_win(Window w)
{
Client *c = SLIST_FIRST(&W->h.client);
@ -63,6 +64,27 @@ client_focus(Client *c)
}
/** Get a client name
* \param c Client pointer
*/
void
client_get_name(Client *c)
{
Atom rt;
int rf;
unsigned long ir, il;
/* This one instead XFetchName for utf8 name support */
if(XGetWindowProperty(W->dpy, c->win, ATOM("_NET_WM_NAME"), 0, 4096,
False, ATOM("UTF8_STRING"), &rt, &rf, &ir, &il, (unsigned char**)&c->title) != Success)
XGetWindowProperty(W->dpy, c->win, ATOM("WM_NAME"), 0, 4096,
False, ATOM("UTF8_STRING"), &rt, &rf, &ir, &il, (unsigned char**)&c->title);
/* Still no title... */
if(!c->title)
XFetchName(W->dpy, c->win, &(c->title));
}
/** Close a client
* \param c Client pointer
*/
@ -124,10 +146,17 @@ client_new(Window w, XWindowAttributes *wa)
/* X window attributes */
at.event_mask = PropertyChangeMask;
XChangeWindowAttributes(dpy, w, CWEventMask, &at);
XChangeWindowAttributes(W->dpy, c->win, CWEventMask, &at);
/* Attach */
SLIST_INSERT(&W->h.client, c, Client, next);
SLIST_INSERT_HEAD(&W->h.client, c, next);
client_map(c);
XMoveResizeWindow(W->dpy, c->win, c->geo.x, c->geo.y, c->geo.w, c->geo.h);
XRaiseWindow(W->dpy, w);
client_configure(c);
return c;
}
@ -151,5 +180,5 @@ client_remove(Client *c)
void
client_free(void)
{
FREE_LIST(W->client);
FREE_LIST(Client, W->h.client);
}

View File

@ -7,21 +7,9 @@
#define CLIENT_H
#include "wmfs.h"
#include "tag.h"
#include "screen.h"
typedef struct Client
{
Tag *tag;
Screen *screen;
Geo *geo;
Flags flags;
Window win;
SLIST_ENTRY(Client) next;
} Client;
void client_configure(Client *c);
Client *client_gb_win(Window *w);
Client *client_gb_win(Window w);
void client_map(Client *c);
void client_unmap(Client *c);
void client_focus(Client *c);

0
wmfs2/src/config.c Normal file → Executable file
View File

9
wmfs2/src/config.h Normal file → Executable file
View File

@ -9,13 +9,4 @@
#include "wmfs.h"
typedef struct Keybind
{
unsigned int mod;
KeySym keysym;
void (*func)(Uicb);
Uicb cmd;
SLIST_ENTRY(Keybind) next;
} Keybind;
#endif /* CONFIG_H */

View File

@ -6,6 +6,7 @@
#include "event.h"
#include "util.h"
#include "wmfs.h"
#include "client.h"
#define EVDPY(e) (e)->xany.display
@ -24,6 +25,40 @@ event_enternotify(XEvent *e)
client_focus(c);
}
static void
event_configureevent(XEvent *e)
{
XConfigureRequestEvent *ev = &e->xconfigurerequest;
XWindowChanges wc;
Client *c;
if((c = client_gb_win(ev->window)))
{
if(ev->value_mask & CWX)
c->geo.x = ev->x;
if(ev->value_mask & CWY)
c->geo.y = ev->y;
if(ev->value_mask & CWWidth)
c->geo.w = ev->width;
if(ev->value_mask & CWHeight)
c->geo.h = ev->height;
client_configure(c);
}
else
{
wc.x = ev->x;
wc.y = ev->y;
wc.width = ev->width;
wc.height = ev->height;
wc.border_width = ev->border_width;
wc.sibling = ev->above;
wc.stack_mode = ev->detail;
XConfigureWindow(EVDPY(e), ev->window, ev->value_mask, &wc);
}
}
static void
event_destroynotify(XEvent *e)
{
@ -31,7 +66,7 @@ event_destroynotify(XEvent *e)
Client *c;
if((c = client_gb_win(ev->window)))
client_unmanage(c);
client_remove(c);
}
static void
@ -51,11 +86,11 @@ event_maprequest(XEvent *e)
/* Which windows to manage */
if(!XGetWindowAttributes(EVDPY(e), ev->window, &at)
|| at.overried_redirect
|| client_gb_win(ev->window))
|| at.override_redirect)
return;
(Client*)client_new(ev->window, at);
if(!client_gb_win(ev->window))
(Client*)client_new(ev->window, &at);
}
static void
@ -137,9 +172,9 @@ event_keypress(XEvent *e)
Keybind *k;
Flags m = ~(W->numlockmask | LockMask);
keysym = XKeycodeToKeysym(EVDPY, (KeyCode)ev->keycode, 0);
keysym = XKeycodeToKeysym(EVDPY(e), (KeyCode)ev->keycode, 0);
SLIST_FOREACH(k, W->h.keybind, next)
SLIST_FOREACH(k, &W->h.keybind, next)
if(k->keysym == keysym && (k->mod & m) == (ev->state & m))
if(k->func)
k->func(k->cmd);
@ -157,6 +192,7 @@ event_expose(XEvent *e)
static void
event_dummy(XEvent *e)
{
printf("%d\n", e->type);
(void)e;
}
@ -168,9 +204,9 @@ event_init(void)
while(i--)
event_handle[i] = event_dummy;
event_handle[ButtonPress] = event_buttonpress;
/*event_handle[ButtonPress] = event_buttonpress;*/
/*event_handle[ClientMessage] = event_clientmessageevent;*/
/*event_handle[ConfigureRequest] = event_configureevent;*/
event_handle[ConfigureRequest] = event_configureevent;
event_handle[DestroyNotify] = event_destroynotify;
event_handle[EnterNotify] = event_enternotify;
event_handle[Expose] = event_expose;

View File

@ -6,12 +6,14 @@
#ifndef EVENT_H
#define EVENT_H
#include "wmfs.h"
#define MAX_EV 256
#define HANDLE_EVENT(e) event_handle[(e)->type](e);
void event_init(void);
void (*event_handle)(XEvent*)[MAX_EV];
void (*event_handle[MAX_EV])(XEvent*);
#endif /* EVENT_H */

94
wmfs2/src/ewmh.c Executable file
View File

@ -0,0 +1,94 @@
/*
* wmfs2 by Martin Duquesnoy <xorg62@gmail.com> { for(i = 2011; i < 2111; ++i) ©(i); }
* For license, see COPYING.
*/
#include <X11/Xatom.h>
#include "ewmh.h"
#include "util.h"
void
ewmh_init(void)
{
int b = 1;
W->net_atom = xcalloc(net_last, sizeof(Atom));
/* EWMH hints */
W->net_atom[net_supported] = ATOM("_NET_SUPPORTED");
W->net_atom[net_client_list] = ATOM("_NET_CLIENT_LIST");
W->net_atom[net_frame_extents] = ATOM("_NET_FRAME_EXTENTS");
W->net_atom[net_number_of_desktops] = ATOM("_NET_NUMBER_OF_DESKTOPS");
W->net_atom[net_current_desktop] = ATOM("_NET_CURRENT_DESKTOP");
W->net_atom[net_desktop_names] = ATOM("_NET_DESKTOP_NAMES");
W->net_atom[net_desktop_geometry] = ATOM("_NET_DESKTOP_GEOMETRY");
W->net_atom[net_active_window] = ATOM("_NET_ACTIVE_WINDOW");
W->net_atom[net_close_window] = ATOM("_NET_CLOSE_WINDOW");
W->net_atom[net_wm_name] = ATOM("_NET_WM_NAME");
W->net_atom[net_wm_pid] = ATOM("_NET_WM_PID");
W->net_atom[net_wm_desktop] = ATOM("_NET_WM_DESKTOP");
W->net_atom[net_showing_desktop] = ATOM("_NET_SHOWING_DESKTOP");
W->net_atom[net_wm_icon_name] = ATOM("_NET_WM_ICON_NAME");
W->net_atom[net_wm_window_type] = ATOM("_NET_WM_WINDOW_TYPE");
W->net_atom[net_supporting_wm_check] = ATOM("_NET_SUPPORTING_WM_CHECK");
W->net_atom[net_wm_window_opacity] = ATOM("_NET_WM_WINDOW_OPACITY");
W->net_atom[net_wm_window_type_normal] = ATOM("_NET_WM_WINDOW_TYPE_NORMAL");
W->net_atom[net_wm_window_type_dock] = ATOM("_NET_WM_WINDOW_TYPE_DOCK");
W->net_atom[net_wm_window_type_splash] = ATOM("_NET_WM_WINDOW_TYPE_SPLASH");
W->net_atom[net_wm_window_type_dialog] = ATOM("_NET_WM_WINDOW_TYPE_DIALOG");
W->net_atom[net_wm_icon] = ATOM("_NET_WM_ICON");
W->net_atom[net_wm_state] = ATOM("_NET_WM_STATE");
W->net_atom[net_wm_state_fullscreen] = ATOM("_NET_WM_STATE_FULLSCREEN");
W->net_atom[net_wm_state_sticky] = ATOM("_NET_WM_STATE_STICKY");
W->net_atom[net_wm_state_demands_attention] = ATOM("_NET_WM_STATE_DEMANDS_ATTENTION");
W->net_atom[net_wm_system_tray_opcode] = ATOM("_NET_SYSTEM_TRAY_OPCODE");
W->net_atom[net_system_tray_message_data] = ATOM("_NET_SYSTEM_TRAY_MESSAGE_DATA");
W->net_atom[net_system_tray_visual] = ATOM("_NET_SYSTEM_TRAY_VISUAL");
W->net_atom[net_system_tray_orientation] = ATOM("_NET_SYSTEM_TRAY_ORIENTATION");
W->net_atom[xembed] = ATOM("_XEMBED");
W->net_atom[xembedinfo] = ATOM("_XEMBED_INFO");
W->net_atom[manager] = ATOM("MANAGER");
W->net_atom[utf8_string] = ATOM("UTF8_STRING");
/* WMFS hints */
W->net_atom[wmfs_running] = ATOM("_WMFS_RUNNING");
W->net_atom[wmfs_update_hints] = ATOM("_WMFS_UPDATE_HINTS");
W->net_atom[wmfs_set_screen] = ATOM("_WMFS_SET_SCREEN");
W->net_atom[wmfs_screen_count] = ATOM("_WMFS_SCREEN_COUNT");
W->net_atom[wmfs_current_tag] = ATOM("_WMFS_CURRENT_TAG");
W->net_atom[wmfs_tag_list] = ATOM("_WMFS_TAG_LIST");
W->net_atom[wmfs_current_screen] = ATOM("_WMFS_CURRENT_SCREEN");
W->net_atom[wmfs_current_layout] = ATOM("_WMFS_CURRENT_LAYOUT");
W->net_atom[wmfs_mwfact] = ATOM("_WMFS_MWFACT");
W->net_atom[wmfs_nmaster] = ATOM("_WMFS_NMASTER");
W->net_atom[wmfs_function] = ATOM("_WMFS_FUNCTION");
W->net_atom[wmfs_cmd] = ATOM("_WMFS_CMD");
W->net_atom[wmfs_font] = ATOM("_WMFS_FONT");
XChangeProperty(W->dpy, W->root, W->net_atom[net_supported], XA_ATOM, 32,
PropModeReplace, (unsigned char*)W->net_atom, net_last);
XChangeProperty(W->dpy, W->root, W->net_atom[wmfs_running], XA_CARDINAL, 32,
PropModeReplace, (unsigned char*)&b, 1);
/* Set _NET_SUPPORTING_WM_CHECK */
XChangeProperty(W->dpy, W->root, W->net_atom[net_supporting_wm_check], XA_WINDOW, 32,
PropModeReplace, (unsigned char*)&W->root, 1);
/*
XChangeProperty(W->dpy, W->root, W->net_atom[net_wm_name], W->net_atom[utf8_string], 8,
PropModeReplace, (unsigned char*)&rootn, strlen(rootn));
XChangeProperty(W->dpy, W->root, ATOM("WM_CLASS"), XA_STRING, 8,
PropModeReplace, (unsigned char*)&class, strlen(class));
* Set _NET_WM_PID
XChangeProperty(W->dpy, W->root, W->net_atom[net_wm_pid], XA_CARDINAL, 32,
PropModeReplace, (unsigned char*)&pid, 1);
* Set _NET_SHOWING_DESKTOP
XChangeProperty(W->dpy, W->root, W->net_atom[net_showing_desktop], XA_CARDINAL, 32,
PropModeReplace, (unsigned char*)&showing_desk, 1);
*/
}

70
wmfs2/src/ewmh.h Executable file
View File

@ -0,0 +1,70 @@
/*
* wmfs2 by Martin Duquesnoy <xorg62@gmail.com> { for(i = 2011; i < 2111; ++i) ©(i); }
* For license, see COPYING.
*/
#ifndef EWMH_H
#define EWMH_H
#include "wmfs.h"
/* Ewmh hints list */
enum
{
net_supported,
net_wm_name,
net_client_list,
net_frame_extents,
net_number_of_desktops,
net_current_desktop,
net_desktop_names,
net_desktop_geometry,
net_active_window,
net_close_window,
net_wm_icon_name,
net_wm_window_type,
net_wm_pid,
net_showing_desktop,
net_supporting_wm_check,
net_wm_window_opacity,
net_wm_window_type_normal,
net_wm_window_type_dock,
net_wm_window_type_splash,
net_wm_window_type_dialog,
net_wm_desktop,
net_wm_icon,
net_wm_state,
net_wm_state_fullscreen,
net_wm_state_sticky,
net_wm_state_demands_attention,
net_wm_system_tray_opcode,
net_system_tray_message_data,
net_system_tray_s,
net_system_tray_visual,
net_system_tray_orientation,
xembed,
xembedinfo,
manager,
utf8_string,
/* WMFS HINTS */
wmfs_running,
wmfs_update_hints,
wmfs_current_tag,
wmfs_current_screen,
wmfs_current_layout,
wmfs_tag_list,
wmfs_mwfact,
wmfs_nmaster,
wmfs_set_screen,
wmfs_screen_count,
wmfs_function,
wmfs_cmd,
wmfs_font,
wmfs_statustext,
net_last
};
void ewmh_init(void);
#endif /* EWMH_H */

View File

@ -6,17 +6,17 @@
#include "screen.h"
#include "util.h"
static Screen*
screen_new(Geo g)
static Scr33n*
screen_new(Geo *g)
{
Screen *s = xcalloc(1, sizeof(Screen));
Scr33n *s = xcalloc(1, sizeof(Scr33n));
s->geo = g;
s->geo = *g;
s->seltag = NULL;
SLIST_INIT(&s->tags);
SLIST_INSERT_HEAD(s, &W->h.screen, Screen, next);
SLIST_INSERT_HEAD(&W->h.screen, s, next);
W->screen = s;
@ -35,11 +35,11 @@ screen_init(void)
SLIST_INIT(&W->h.screen);
screen_new(g);
screen_new(&g);
}
void
screen_free(void)
{
FREE_LIST(Screen, W->h.screen);
FREE_LIST(Scr33n, W->h.screen);
}

View File

@ -3,19 +3,10 @@
* For license, see COPYING.
*/
#include "wmfs.h"
#include "tag.h"
#ifndef SCREEN_H
#define SCREEN_H
typedef struct Screen
{
Geo geo;
Tag *seltag;
SLIST_HEAD(, Tag) tags;
SLIST_ENTRY(Screen) next;
} Screen;
#include "wmfs.h"
void screen_init(void);
void screen_free(void);

View File

@ -7,7 +7,7 @@
#include "util.h"
Tag*
tag_new(Screen *s, const char *name)
tag_new(Scr33n *s, char *name)
{
Tag *t;
@ -18,13 +18,13 @@ tag_new(Screen *s, const char *name)
t->flags = 0;
t->sel = NULL;
SLIST_INSERT_HEAD(t, &s->tags, Tag, next);
SLIST_INSERT_HEAD(&s->tags, t, next);
return t;
}
void
tag_screen(Screen *s, Tag *t)
tag_screen(Scr33n *s, Tag *t)
{
s->seltag = t;
@ -32,7 +32,7 @@ tag_screen(Screen *s, Tag *t)
void
tag_free(Screen *s)
tag_free(Scr33n *s)
{
LIST_FREE(s->tags);
FREE_LIST(Tag, s->tags);
}

View File

@ -7,16 +7,10 @@
#define TAG_H
#include "wmfs.h"
#include "screen.h"
#include "client.h"
typedef struct Tag
{
char *name;
Screen *screen;
Flags flags;
Client *sel;
SLIST_ENTRY(Tag) next;
} Tag;
Tag *tag_new(Scr33n *s, char *name);
void tag_screen(Scr33n *s, Tag *t);
void tag_free(Scr33n *s);
#endif /* TAG_H */

View File

@ -3,7 +3,8 @@
* For license, see COPYING.
*/
#include "wmfs.h"
#include <stdint.h>
#include "util.h"
/** malloc with error support and size_t overflow protection

View File

@ -6,6 +6,8 @@
#ifndef UTIL_H
#define UTIL_H
#include "wmfs.h"
/* Todo FREE_LIST(type, head, function_remove) */
#define FREE_LIST(type, head) \
do { \
@ -17,6 +19,8 @@
} \
} while(/* CONSTCOND */ 0);
#define ATOM(a) XInternAtom(W->dpy, (a), False)
void *xmalloc(size_t nmemb, size_t size);
void *xcalloc(size_t nmemb, size_t size);
pid_t spawn(const char *format, ...);

View File

@ -3,6 +3,9 @@
* For license, see COPYING.
*/
#include <X11/keysym.h>
#include <X11/cursorfont.h>
#include "wmfs.h"
#include "event.h"
@ -68,11 +71,14 @@ wmfs_xinit(void)
W->gc = DefaultGC(W->dpy, W->xscreen);
/*
* Root window
* Root window/cursor
*/
W->root = RootWindow(dpy, W->xscreen);
W->root = RootWindow(W->dpy, W->xscreen);
at.event_mask = KeyMask | ButtonMask | MouseMask | PropertyChangeMask
| SubstructureRedirectMask | SubstructureNotifyMask | StructureNotifyMask;
at.cursor = XCreateFontCursor(W->dpy, XC_left_ptr);
XChangeWindowAttributes(W->dpy, W->root, CWEventMask | CWCursor, &at);
/*
@ -85,9 +91,9 @@ wmfs_xinit(void)
XExtentsOfFontSet(W->font.fontset);
XFontsOfFontSet(W->font.fontset, &xfs, &names);
font.as = xfs[0]->max_bounds.ascent;
font.de = xfs[0]->max_bounds.descent;
font.width = xfs[0]->max_bounds.width;
W->font.as = xfs[0]->max_bounds.ascent;
W->font.de = xfs[0]->max_bounds.descent;
W->font.width = xfs[0]->max_bounds.width;
W->font.height = W->font.as + W->font.de;
@ -116,16 +122,80 @@ wmfs_grab_keys(void)
XUngrabKey(W->dpy, AnyKey, AnyModifier, W->root);
FOREACH(k, &W->h.keybind, next)
if((c = XKeysymToKeycode(dpy, k->keysym)))
SLIST_FOREACH(k, &W->h.keybind, next)
if((c = XKeysymToKeycode(W->dpy, k->keysym)))
{
XGrabKey(W->dpy, c, k->mod, W->root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(W->dpy, c, k->mod | LockMask, W->root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(W->dpy, c, k->mod | numlockmask, W->root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(W->dpy, c, k->mod | LockMask | numlockmask, W->root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(W->dpy, c, k->mod | W->numlockmask, W->root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(W->dpy, c, k->mod | LockMask | W->numlockmask, W->root, True, GrabModeAsync, GrabModeAsync);
}
}
/** Scan if there are windows on X
* for manage it
*/
static void
wmfs_scan(void)
{
int i, n;
XWindowAttributes wa;
Window usl, usl2, *w = NULL;
Client *c;
/*
Atom rt;
int s, rf, tag = -1, screen = -1, flags = -1, i;
ulong ir, il;
uchar *ret;
*/
if(XQueryTree(W->dpy, W->root, &usl, &usl2, &w, &n))
for(i = n - 1; i != -1; --i)
{
XGetWindowAttributes(W->dpy, w[i], &wa);
if(!wa.override_redirect && wa.map_state == IsViewable)
{/*
if(XGetWindowProperty(dpy, w[i], ATOM("_WMFS_TAG"), 0, 32,
False, XA_CARDINAL, &rt, &rf, &ir, &il, &ret) == Success && ret)
{
tag = *ret;
XFree(ret);
}
if(XGetWindowProperty(dpy, w[i], ATOM("_WMFS_SCREEN"), 0, 32,
False, XA_CARDINAL, &rt, &rf, &ir, &il, &ret) == Success && ret)
{
screen = *ret;
XFree(ret);
}
if(XGetWindowProperty(dpy, w[i], ATOM("_WMFS_FLAGS"), 0, 32,
False, XA_CARDINAL, &rt, &rf, &ir, &il, &ret) == Success && ret)
{
flags = *ret;
XFree(ret);
}
*/
/*c = */ client_new(w[i], &wa);
/*
if(tag != -1)
c->tag = tag;
if(screen != -1)
c->screen = screen;
if(flags != -1)
c->flags = flags;
*/
}
}
XFree(w);
return;
}
static void
wmfs_loop(void)
{
@ -134,11 +204,10 @@ wmfs_loop(void)
W->running = true;
while(W->running)
while(XPending(W->dpy))
{
XNextEvent(W->dpy, &ev);
HANDLE_EVENT(&e);
}
{
XNextEvent(W->dpy, &ev);
HANDLE_EVENT(&ev);
}
}
static void
@ -147,6 +216,9 @@ wmfs_init(void)
/* X init */
wmfs_xinit();
/* EWMH init */
ewmh_init();
/* Event init */
event_init();
@ -161,12 +233,14 @@ wmfs_quit(void)
W->running = false;
/* X stuffs */
XCloseDisplay(W->dpy);
XFreeGC(W->gc);
XFreeFontSet(dpy, W->font.fontset);
XFreeGC(W->dpy, W->gc);
XFreeFontSet(W->dpy, W->font.fontset);
screen_free();
XCloseDisplay(W->dpy);
free(W->net_atom);
free(W);
}
@ -174,7 +248,7 @@ wmfs_quit(void)
int
main(int argc, char **argv)
{
W = xcalloc(1, sizeof(Wmfs));
W = (struct Wmfs*)xcalloc(1, sizeof(struct Wmfs));
/* Get X display */
if(!(W->dpy = XOpenDisplay(NULL)))
@ -187,6 +261,7 @@ main(int argc, char **argv)
/* Core */
wmfs_init();
wmfs_scan();
wmfs_loop();

View File

@ -22,9 +22,6 @@
#include <X11/Xatom.h>
/* Local */
#include "screen.h"
#include "client.h"
#include "config.h"
#define ButtonMask (ButtonPressMask | ButtonReleaseMask | ButtonMotionMask)
#define MouseMask (ButtonMask | PointerMotionMask)
@ -33,12 +30,63 @@
typedef unsigned int Flags;
typedef const char* Uicb;
typedef struct
/*
* Structures
*/
typedef struct Geo Geo;
typedef struct Scr33n Scr33n;
typedef struct Tag Tag;
typedef struct Client Client;
typedef struct Keybind Keybind;
struct Geo
{
int x, y, w, h;
} Geo;
};
typedef struct
/* Screen */
struct Scr33n
{
Geo geo;
Tag *seltag;
SLIST_HEAD(, Tag) tags;
SLIST_ENTRY(Scr33n) next;
};
/* Tag */
struct Tag
{
char *name;
Scr33n *screen;
Flags flags;
Client *sel;
SLIST_ENTRY(Tag) next;
};
/* Client */
struct Client
{
Tag *tag;
Scr33n *screen;
Geo geo;
Flags flags;
char *title;
Window win;
SLIST_ENTRY(Client) next;
};
/* Config */
struct Keybind
{
unsigned int mod;
KeySym keysym;
void (*func)(Uicb);
Uicb cmd;
SLIST_ENTRY(Keybind) next;
};
/* Global struct */
struct Wmfs
{
/* X11 stuffs */
bool running;
@ -47,6 +95,7 @@ typedef struct
int xscreen;
Flags numlockmask;
GC gc;
Atom *net_atom;
struct
{
@ -57,7 +106,7 @@ typedef struct
/* Lists heads */
struct
{
SLIST_HEAD(, Screen) screen;
SLIST_HEAD(, Scr33n) screen;
SLIST_HEAD(, Client) client;
SLIST_HEAD(, Keybind) keybind;
} h;
@ -66,9 +115,9 @@ typedef struct
* Selected screen, from what you go everywhere; selected tag,
* and then selected client.
*/
Screen *screen;
Scr33n *screen;
} Wmfs;
};
int wmfs_error_handler(Display *d, XErrorEvent *event);
int wmfs_error_handler_dummy(Display *d, XErrorEvent *event);
@ -76,6 +125,6 @@ void wmfs_grab_keys(void);
void wmfs_quit(void);
/* Single global variable */
Wmfs *W;
struct Wmfs *W;
#endif /* WMFS_H */