From 3da9117a8b1ed56687a4b039d703e2a05aff02fc Mon Sep 17 00:00:00 2001 From: Martin Duquesnoy Date: Sat, 6 Aug 2011 11:07:44 +0200 Subject: [PATCH] add ewmh, compile now --- wmfs2/src/client.c | 39 ++++++++++++++-- wmfs2/src/client.h | 14 +----- wmfs2/src/config.c | 0 wmfs2/src/config.h | 9 ---- wmfs2/src/event.c | 52 +++++++++++++++++---- wmfs2/src/event.h | 4 +- wmfs2/src/ewmh.c | 94 ++++++++++++++++++++++++++++++++++++++ wmfs2/src/ewmh.h | 70 ++++++++++++++++++++++++++++ wmfs2/src/screen.c | 14 +++--- wmfs2/src/screen.h | 11 +---- wmfs2/src/tag.c | 10 ++-- wmfs2/src/tag.h | 14 ++---- wmfs2/src/util.c | 3 +- wmfs2/src/util.h | 4 ++ wmfs2/src/wmfs.c | 111 +++++++++++++++++++++++++++++++++++++-------- wmfs2/src/wmfs.h | 69 ++++++++++++++++++++++++---- 16 files changed, 421 insertions(+), 97 deletions(-) mode change 100644 => 100755 wmfs2/src/config.c mode change 100644 => 100755 wmfs2/src/config.h create mode 100755 wmfs2/src/ewmh.c create mode 100755 wmfs2/src/ewmh.h diff --git a/wmfs2/src/client.c b/wmfs2/src/client.c index 1d3d109..1dde094 100755 --- a/wmfs2/src/client.c +++ b/wmfs2/src/client.c @@ -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); } diff --git a/wmfs2/src/client.h b/wmfs2/src/client.h index 152d8c3..c1b2a52 100755 --- a/wmfs2/src/client.h +++ b/wmfs2/src/client.h @@ -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); diff --git a/wmfs2/src/config.c b/wmfs2/src/config.c old mode 100644 new mode 100755 diff --git a/wmfs2/src/config.h b/wmfs2/src/config.h old mode 100644 new mode 100755 index e2f1e35..8146690 --- a/wmfs2/src/config.h +++ b/wmfs2/src/config.h @@ -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 */ diff --git a/wmfs2/src/event.c b/wmfs2/src/event.c index aca6e2d..bc83b62 100755 --- a/wmfs2/src/event.c +++ b/wmfs2/src/event.c @@ -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; diff --git a/wmfs2/src/event.h b/wmfs2/src/event.h index 7cfb1d0..0db4ff6 100755 --- a/wmfs2/src/event.h +++ b/wmfs2/src/event.h @@ -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 */ diff --git a/wmfs2/src/ewmh.c b/wmfs2/src/ewmh.c new file mode 100755 index 0000000..a2d790f --- /dev/null +++ b/wmfs2/src/ewmh.c @@ -0,0 +1,94 @@ +/* + * wmfs2 by Martin Duquesnoy { for(i = 2011; i < 2111; ++i) ©(i); } + * For license, see COPYING. + */ + +#include + +#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); + */ + +} diff --git a/wmfs2/src/ewmh.h b/wmfs2/src/ewmh.h new file mode 100755 index 0000000..fe244fc --- /dev/null +++ b/wmfs2/src/ewmh.h @@ -0,0 +1,70 @@ +/* + * wmfs2 by Martin Duquesnoy { 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 */ diff --git a/wmfs2/src/screen.c b/wmfs2/src/screen.c index dd07bb1..c4b47fe 100755 --- a/wmfs2/src/screen.c +++ b/wmfs2/src/screen.c @@ -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); } diff --git a/wmfs2/src/screen.h b/wmfs2/src/screen.h index ad9901c..ebfc071 100755 --- a/wmfs2/src/screen.h +++ b/wmfs2/src/screen.h @@ -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); diff --git a/wmfs2/src/tag.c b/wmfs2/src/tag.c index b4d0f72..0a92e20 100755 --- a/wmfs2/src/tag.c +++ b/wmfs2/src/tag.c @@ -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); } diff --git a/wmfs2/src/tag.h b/wmfs2/src/tag.h index 1d92a5a..1128daa 100755 --- a/wmfs2/src/tag.h +++ b/wmfs2/src/tag.h @@ -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 */ diff --git a/wmfs2/src/util.c b/wmfs2/src/util.c index b24f0ff..c7777c2 100755 --- a/wmfs2/src/util.c +++ b/wmfs2/src/util.c @@ -3,7 +3,8 @@ * For license, see COPYING. */ -#include "wmfs.h" +#include + #include "util.h" /** malloc with error support and size_t overflow protection diff --git a/wmfs2/src/util.h b/wmfs2/src/util.h index bdc9bcd..09f2f10 100755 --- a/wmfs2/src/util.h +++ b/wmfs2/src/util.h @@ -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, ...); diff --git a/wmfs2/src/wmfs.c b/wmfs2/src/wmfs.c index d2507e0..863153a 100755 --- a/wmfs2/src/wmfs.c +++ b/wmfs2/src/wmfs.c @@ -3,6 +3,9 @@ * For license, see COPYING. */ +#include +#include + #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(); diff --git a/wmfs2/src/wmfs.h b/wmfs2/src/wmfs.h index 081c15f..3c9a394 100755 --- a/wmfs2/src/wmfs.h +++ b/wmfs2/src/wmfs.h @@ -22,9 +22,6 @@ #include /* 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 */