1 module cboxapp; 2 3 import std.stdio; 4 import deimos.X11.X; 5 import deimos.X11.Xlib; 6 import deimos.X11.keysymdef; 7 import deimos.X11.Xutil; 8 import deimos.X11.Xatom; 9 import window; 10 import types; 11 import theme.layout; 12 import monitor; 13 14 alias DGC = core.memory.GC; 15 alias XGC = deimos.X11.Xlib.GC; 16 17 import core.sys.posix.signal; 18 import core.sys.posix.sys.wait; 19 import core.sys.posix.unistd; 20 21 /** 22 * Singleton to hold our main Display 23 **/ 24 class AppDisplay 25 { 26 27 Display *dpy; 28 bool running = true; 29 30 static AppDisplay instance() 31 { 32 if (!instantiated_) { 33 synchronized { 34 if (instance_ is null) { 35 instance_ = new AppDisplay; 36 instance_.dpy = XOpenDisplay(null); 37 } 38 instantiated_ = true; 39 } 40 } 41 return instance_; 42 } 43 44 private: 45 this() {} 46 static bool instantiated_; // Thread local 47 __gshared AppDisplay instance_; 48 49 } 50 51 struct Client 52 { 53 string name; 54 float mina, maxa; 55 int x, y, w, h; 56 int oldx, oldy, oldw, oldh; 57 int basew, baseh, incw, inch, maxw, maxh, minw, minh; 58 int bw, oldbw; 59 uint tags; 60 bool isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; 61 Client *next; 62 Client *snext; 63 Monitor *mon; 64 Window win; 65 66 /** 67 * A range to iterate over the client list via 'next' or 'snext', 68 * as specified by the template string. 69 * Example: 70 * --- 71 * auto r = ClientRange!"next"(clientPtr); 72 * auto sr = ClientRange!"snext"(clientPtr); 73 * --- 74 */ 75 struct ClientRange(string NextField) 76 { 77 Client* client; 78 @property bool empty() 79 { 80 return client is null; 81 } 82 83 @property auto front() 84 { 85 return client; 86 } 87 88 auto popFront() 89 { 90 mixin(`client = client.`~NextField~`;`); 91 } 92 } 93 }