/* * (C)opyright MMIV-MMVI Anselm R. Garbe * See LICENSE file for license details. */ #include #include #include #include #include #include /* WM atoms */ enum { WMState, WMProtocols, WMDelete, WMLast }; /* NET atoms */ enum { NetSupported, NetWMName, NetLast }; /* Column modes */ enum { Coldefault, Colstack, Colmax }; /* Cursor */ enum { CurNormal, CurResize, CurMove, CurLast }; /* 8-bit qid.path.type */ enum { FsDroot, FsDdef, FsDtag, FsDview, FsDarea, FsDclients, FsDclient, FsDGclient, FsDbars, FsDbar, FsFdata, FsFcolors, FsFfont, FsFselcolors, FsFnormcolors, FsFkeys, FsFgrabmod, FsFborder, FsFbar, FsFgeom, FsFevent, FsFctl, FsFname, FsFtagrules, FsFcolrules, FsFprops, FsFmode, FsFtags, FsFindex, FsLast }; enum { MIN_COLWIDTH = 64 }; enum { WM_PROTOCOL_DELWIN = 1 }; typedef struct View View; typedef struct Area Area; typedef struct Frame Frame; typedef struct Client Client; VECTOR(AreaVector, Area *); struct View { char name[256]; unsigned short id; AreaVector area; unsigned int sel; unsigned int revert; }; VECTOR(FrameVector, Frame *); struct Area { unsigned short id; FrameVector frame; View *view; unsigned int sel; int mode; XRectangle rect; }; struct Frame { Area *area; unsigned short id; XRectangle rect; Client *client; }; VECTOR(ViewVector, View *); struct Client { unsigned short id; char name[256]; char tags[256]; ViewVector view; char props[512]; int proto; unsigned int border; Bool floating; Bool fixedsize; Window win; Window trans; XRectangle rect; XSizeHints size; Window framewin; GC gc; FrameVector frame; unsigned int sel; Area *revert; }; typedef struct Key Key; struct Key { unsigned short id; char name[128]; unsigned long mod; KeyCode key; Key *next; }; typedef struct { char name[256]; unsigned short id; char data[256]; char colstr[24]; BlitzColor color; XRectangle rect; } Bar; /* default values */ typedef struct { char selcolor[24]; char normcolor[24]; char *font; BlitzColor sel; BlitzColor norm; unsigned int border; unsigned int snap; char *keys; unsigned int keyssz; char *tagrules; unsigned int tagrulessz; char *colrules; unsigned int colrulessz; char grabmod[5]; unsigned long mod; int colmode; } Default; /* global variables */ VECTOR(ClientVector, Client *); VECTOR(KeyVector, Key *); VECTOR(BarVector, Bar *); typedef struct { regex_t regex; char value[256]; } Rule; VECTOR(RuleVector, Rule *); /* global variables */ ViewVector view; unsigned int sel; ClientVector client; KeyVector key; BarVector bar; Display *dpy; int screen; Window root; XRectangle rect; BlitzFont blitzfont; IXPServer srv; Pixmap barpmap; Window barwin; GC bargc; GC xorgc; XRectangle brect; Qid root_qid; Default def; Atom wm_atom[WMLast]; Atom net_atom[NetLast]; Cursor cursor[CurLast]; unsigned int valid_mask; unsigned int num_lock_mask; void (*handler[LASTEvent]) (XEvent *); RuleVector trule; RuleVector vrule; /* area.c */ Area *create_area(View *v, unsigned int pos, unsigned int w); void destroy_area(Area *a); int idx_of_area(Area *a); int idx_of_area_id(View *t, unsigned short id); void select_area(Area *a, char *arg); void send_to_area(Area *to, Area *from, Client *c); void attach_to_area(Area *a, Client *c, Bool send); void detach_from_area(Area *a, Client *c); Bool is_of_area(Area *a, Client *c); Client *sel_client_of_area(Area *a); /* bar.c */ Bar *create_bar(char *name, Bool intern); void destroy_bar(Bar *b); void draw_bar(); int idx_of_bar_id(unsigned short id); void resize_bar(); unsigned int height_of_bar(); Bar *bar_of_name(const char *name); int idx_of_bar(Bar *b); /* client.c */ Client *create_client(Window w, XWindowAttributes *wa); void destroy_client(Client *c); void configure_client(Client *c); void prop_client(Client *c, XPropertyEvent *e); void kill_client(Client *c); void draw_client(Client *client); void gravitate_client(Client *c, Bool invert); void unmap_client(Client *c); void map_client(Client *c); void reparent_client(Client *c, Window w, int x, int y); void manage_client(Client *c); void focus_client(Client *c, Bool restack); void focus(Client *c, Bool restack); void match_sizehints(Client *c, XRectangle *r, int aidx, BlitzAlign sticky); void resize_client(Client *c, XRectangle *r, Bool ignore_xcall); void select_client(Client *c, char *arg); void send_client(Client *c, char *arg); void move_client(Client *c, char *arg); void size_client(Client *c, char *arg); void newcol_client(Client *c, char *arg); void resize_all_clients(); Client *sel_client(); int idx_of_client_id(unsigned short id); Client *client_of_win(Window w); void draw_clients(); void update_client_grab(Client *c, Bool is_sel); void apply_rules(Client *c); void apply_tags(Client *c, const char *tags); /* column.c */ void arrange_column(Area *a, Bool dirty); void scale_column(Area *a, float h); void resize_column(Client *c, XRectangle *r, XPoint *pt); int column_mode_of_str(char *arg); char *str_of_column_mode(int mode); Area *new_column(View *v, unsigned int pos, unsigned int w); /* event.c */ void init_x_event_handler(); void check_x_event(IXPConn *c); unsigned int flush_masked_events(long even_mask); /* frame.c */ Vector *vector_of_frames(FrameVector *fv); Frame *create_frame(Area *a, Client *c); void destroy_frame(Frame *f); int idx_of_frame_id(Area *a, unsigned short id); int idx_of_frame(Frame *f); Client *frame_of_win(Window w); /* fs.c */ unsigned long long pack_qpath(unsigned char type, unsigned short i1, unsigned short i2, unsigned short i3); void write_event(char *event); void new_ixp_conn(IXPConn *c); /* key.c */ void handle_key(Window w, unsigned long mod, KeyCode keycode); void update_keys(); void init_lock_keys(); unsigned long mod_key_of_str(char *val); /* mouse.c */ void do_mouse_resize(Client *c,BlitzAlign align); void grab_mouse(Window w, unsigned long mod, unsigned int button); void ungrab_mouse(Window w, unsigned long mod, unsigned int button); BlitzAlign snap_rect(XRectangle *rects, int num, XRectangle *current, BlitzAlign *mask, int snap); /* rule.c */ void update_rules(RuleVector *rule, const char *data); /* view.c */ void arrange_view(View *v); void scale_view(View *v, float w); View *create_view(const char *name); void focus_view(View *v); XRectangle *rects_of_view(View *v, unsigned int *num); int idx_of_view_id(unsigned short id); void select_view(const char *arg); int idx_of_view(View *v); void detach_from_view(View *v, Client *c); void attach_to_view(View *v, Client *c); Client *sel_client_of_view(View *v); void restack_view(View *v); View *view_of_name(const char *name); void destroy_view(View *v); void update_views(); unsigned int newcolw_of_view(View *v); /* wm.c */ void scan_wins(); int win_proto(Window w); int win_state(Window w); int wmii_error_handler(Display *dpy, XErrorEvent *error);