Browse Source

add ewmh, compile now

Martin Duquesnoy 13 years ago
parent
commit
3da9117a8b

+ 34 - 5
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);
 }

+ 1 - 13
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);

+ 0 - 0
wmfs2/src/config.c


+ 0 - 9
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 */

+ 44 - 8
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;

+ 3 - 1
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 */

+ 94 - 0
wmfs2/src/ewmh.c

@@ -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 - 0
wmfs2/src/ewmh.h

@@ -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 */

+ 7 - 7
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);
 }

+ 1 - 10
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);

+ 5 - 5
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);
 }

+ 4 - 10
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 */

+ 2 - 1
wmfs2/src/util.c

@@ -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

+ 4 - 0
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, ...);

+ 93 - 18
wmfs2/src/wmfs.c

@@ -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();
 

+ 59 - 10
wmfs2/src/wmfs.h

@@ -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;
+};
+
+/* 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;
+};
 
-typedef struct
+/* 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 */