2005-11-18 18:54:58 +03:00
|
|
|
/*
|
2006-01-20 17:20:24 +03:00
|
|
|
* (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
|
2005-11-18 18:54:58 +03:00
|
|
|
* See LICENSE file for license details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
2006-05-30 20:28:05 +04:00
|
|
|
#include <regex.h>
|
2006-01-21 14:57:20 +03:00
|
|
|
#include <X11/Xlib.h>
|
2005-11-18 18:54:58 +03:00
|
|
|
#include <X11/Xutil.h>
|
|
|
|
|
2006-04-03 17:52:05 +04:00
|
|
|
#include <ixp.h>
|
|
|
|
#include <blitz.h>
|
2005-11-18 18:54:58 +03:00
|
|
|
|
2006-03-05 15:22:42 +03:00
|
|
|
/* WM atoms */
|
2005-12-27 23:13:50 +03:00
|
|
|
enum {
|
2006-03-05 02:11:08 +03:00
|
|
|
WMState,
|
|
|
|
WMProtocols,
|
|
|
|
WMDelete,
|
|
|
|
WMLast
|
|
|
|
};
|
|
|
|
|
2006-05-10 15:38:01 +04:00
|
|
|
/* NET atoms */
|
|
|
|
enum {
|
|
|
|
NetSupported,
|
|
|
|
NetWMName,
|
|
|
|
NetLast
|
|
|
|
};
|
|
|
|
|
2006-03-05 15:22:42 +03:00
|
|
|
/* Column modes */
|
2006-03-05 02:11:08 +03:00
|
|
|
enum {
|
2006-04-07 18:08:17 +04:00
|
|
|
Coldefault,
|
2006-03-05 02:11:08 +03:00
|
|
|
Colstack,
|
|
|
|
Colmax
|
2005-12-27 23:13:50 +03:00
|
|
|
};
|
|
|
|
|
2006-03-05 15:22:42 +03:00
|
|
|
/* Cursor */
|
|
|
|
enum {
|
|
|
|
CurNormal,
|
|
|
|
CurResize,
|
|
|
|
CurMove,
|
|
|
|
CurLast
|
|
|
|
};
|
|
|
|
|
2006-02-02 16:50:04 +03:00
|
|
|
/* 8-bit qid.path.type */
|
|
|
|
enum {
|
2006-03-23 16:22:43 +03:00
|
|
|
FsDroot,
|
2006-03-05 16:16:48 +03:00
|
|
|
FsDdef,
|
2006-05-24 11:26:08 +04:00
|
|
|
FsDtag,
|
2006-03-23 11:54:20 +03:00
|
|
|
FsDview,
|
2006-03-05 16:16:48 +03:00
|
|
|
FsDarea,
|
2006-03-07 19:22:36 +03:00
|
|
|
FsDclients,
|
2006-03-05 16:16:48 +03:00
|
|
|
FsDclient,
|
2006-03-07 19:22:36 +03:00
|
|
|
FsDGclient,
|
2006-04-12 16:14:34 +04:00
|
|
|
FsDbars,
|
2006-03-05 16:16:48 +03:00
|
|
|
FsDbar,
|
2006-03-23 16:22:43 +03:00
|
|
|
FsFdata,
|
|
|
|
FsFcolors,
|
|
|
|
FsFfont,
|
|
|
|
FsFselcolors,
|
|
|
|
FsFnormcolors,
|
2006-03-10 18:21:20 +03:00
|
|
|
FsFkeys,
|
2006-04-12 13:08:31 +04:00
|
|
|
FsFgrabmod,
|
2006-03-05 16:16:48 +03:00
|
|
|
FsFborder,
|
|
|
|
FsFbar,
|
|
|
|
FsFgeom,
|
|
|
|
FsFevent,
|
|
|
|
FsFctl,
|
|
|
|
FsFname,
|
2006-05-31 21:48:44 +04:00
|
|
|
FsFtagrules,
|
|
|
|
FsFcolrules,
|
2006-05-30 18:32:28 +04:00
|
|
|
FsFprops,
|
2006-04-12 16:14:34 +04:00
|
|
|
FsFmode,
|
2006-04-14 14:03:44 +04:00
|
|
|
FsFtags,
|
2006-04-26 10:59:55 +04:00
|
|
|
FsFindex,
|
2006-04-29 20:51:45 +04:00
|
|
|
FsLast
|
2006-02-02 16:50:04 +03:00
|
|
|
};
|
|
|
|
|
2006-04-06 09:55:33 +04:00
|
|
|
enum { MIN_COLWIDTH = 64 };
|
|
|
|
enum { WM_PROTOCOL_DELWIN = 1 };
|
2005-11-18 18:54:58 +03:00
|
|
|
|
2006-03-23 12:36:51 +03:00
|
|
|
typedef struct View View;
|
2006-03-05 03:55:45 +03:00
|
|
|
typedef struct Area Area;
|
|
|
|
typedef struct Frame Frame;
|
2005-11-18 18:54:58 +03:00
|
|
|
typedef struct Client Client;
|
|
|
|
|
2006-04-06 12:39:49 +04:00
|
|
|
VECTOR(AreaVector, Area *);
|
2006-03-23 12:36:51 +03:00
|
|
|
struct View {
|
2006-04-06 13:31:54 +04:00
|
|
|
char name[256];
|
2006-03-06 18:35:07 +03:00
|
|
|
unsigned short id;
|
2006-04-03 15:40:34 +04:00
|
|
|
AreaVector area;
|
2006-03-06 18:35:07 +03:00
|
|
|
unsigned int sel;
|
2006-03-11 22:50:53 +03:00
|
|
|
unsigned int revert;
|
2006-03-06 18:35:07 +03:00
|
|
|
};
|
|
|
|
|
2006-04-06 12:39:49 +04:00
|
|
|
VECTOR(FrameVector, Frame *);
|
2006-02-01 18:27:53 +03:00
|
|
|
struct Area {
|
2006-02-03 18:15:36 +03:00
|
|
|
unsigned short id;
|
2006-04-03 15:40:34 +04:00
|
|
|
FrameVector frame;
|
2006-03-23 12:36:51 +03:00
|
|
|
View *view;
|
2006-03-01 13:55:46 +03:00
|
|
|
unsigned int sel;
|
2006-03-05 02:11:08 +03:00
|
|
|
int mode;
|
2006-01-26 17:24:34 +03:00
|
|
|
XRectangle rect;
|
2005-11-18 18:54:58 +03:00
|
|
|
};
|
|
|
|
|
2006-03-05 03:55:45 +03:00
|
|
|
struct Frame {
|
|
|
|
Area *area;
|
2006-02-03 18:15:36 +03:00
|
|
|
unsigned short id;
|
2006-03-05 03:55:45 +03:00
|
|
|
XRectangle rect;
|
|
|
|
Client *client;
|
|
|
|
};
|
|
|
|
|
2006-04-10 19:43:13 +04:00
|
|
|
VECTOR(ViewVector, View *);
|
2006-03-05 03:55:45 +03:00
|
|
|
struct Client {
|
2006-03-07 19:22:36 +03:00
|
|
|
unsigned short id;
|
2006-01-25 20:39:08 +03:00
|
|
|
char name[256];
|
2006-04-06 13:31:54 +04:00
|
|
|
char tags[256];
|
2006-04-10 19:43:13 +04:00
|
|
|
ViewVector view;
|
2006-05-30 18:32:28 +04:00
|
|
|
char props[512];
|
2006-03-23 16:22:43 +03:00
|
|
|
int proto;
|
|
|
|
unsigned int border;
|
2006-03-31 09:57:33 +04:00
|
|
|
Bool floating;
|
2006-05-23 00:35:20 +04:00
|
|
|
Bool fixedsize;
|
2006-03-23 16:22:43 +03:00
|
|
|
Window win;
|
|
|
|
Window trans;
|
|
|
|
XRectangle rect;
|
|
|
|
XSizeHints size;
|
2006-03-05 02:25:49 +03:00
|
|
|
Window framewin;
|
2006-03-23 16:22:43 +03:00
|
|
|
GC gc;
|
2006-04-03 15:40:34 +04:00
|
|
|
FrameVector frame;
|
2006-03-07 01:55:47 +03:00
|
|
|
unsigned int sel;
|
2006-03-11 22:50:53 +03:00
|
|
|
Area *revert;
|
2005-11-18 18:54:58 +03:00
|
|
|
};
|
|
|
|
|
2006-02-09 21:40:12 +03:00
|
|
|
typedef struct Key Key;
|
|
|
|
struct Key {
|
|
|
|
unsigned short id;
|
2006-03-23 16:22:43 +03:00
|
|
|
char name[128];
|
|
|
|
unsigned long mod;
|
|
|
|
KeyCode key;
|
|
|
|
Key *next;
|
2006-02-09 21:40:12 +03:00
|
|
|
};
|
|
|
|
|
2006-02-10 00:48:01 +03:00
|
|
|
typedef struct {
|
2006-03-23 16:22:43 +03:00
|
|
|
char name[256];
|
2006-02-10 00:48:01 +03:00
|
|
|
unsigned short id;
|
2006-03-23 16:22:43 +03:00
|
|
|
char data[256];
|
2006-02-10 00:48:01 +03:00
|
|
|
char colstr[24];
|
2006-04-23 22:00:47 +04:00
|
|
|
BlitzColor color;
|
2006-02-10 00:48:01 +03:00
|
|
|
XRectangle rect;
|
2006-03-24 15:36:35 +03:00
|
|
|
Bool intern;
|
2006-04-12 12:44:07 +04:00
|
|
|
} Bar;
|
2006-02-10 00:48:01 +03:00
|
|
|
|
|
|
|
/* default values */
|
|
|
|
typedef struct {
|
|
|
|
char selcolor[24];
|
|
|
|
char normcolor[24];
|
|
|
|
char *font;
|
2006-04-23 22:00:47 +04:00
|
|
|
BlitzColor sel;
|
|
|
|
BlitzColor norm;
|
2006-02-10 00:48:01 +03:00
|
|
|
unsigned int border;
|
|
|
|
unsigned int snap;
|
2006-03-10 18:21:20 +03:00
|
|
|
char *keys;
|
|
|
|
unsigned int keyssz;
|
2006-05-31 21:48:44 +04:00
|
|
|
char *tagrules;
|
|
|
|
unsigned int tagrulessz;
|
|
|
|
char *colrules;
|
|
|
|
unsigned int colrulessz;
|
2006-04-12 13:08:31 +04:00
|
|
|
char grabmod[5];
|
|
|
|
unsigned long mod;
|
2006-04-14 14:03:44 +04:00
|
|
|
int colmode;
|
2006-02-10 00:48:01 +03:00
|
|
|
} Default;
|
|
|
|
|
2005-11-18 18:54:58 +03:00
|
|
|
/* global variables */
|
2006-04-06 12:39:49 +04:00
|
|
|
VECTOR(ClientVector, Client *);
|
|
|
|
VECTOR(KeyVector, Key *);
|
2006-04-12 12:44:07 +04:00
|
|
|
VECTOR(BarVector, Bar *);
|
2005-12-16 04:59:27 +03:00
|
|
|
|
2006-05-30 20:28:05 +04:00
|
|
|
typedef struct {
|
|
|
|
regex_t regex;
|
2006-05-31 11:51:40 +04:00
|
|
|
char value[256];
|
2006-05-30 20:28:05 +04:00
|
|
|
} Rule;
|
|
|
|
VECTOR(RuleVector, Rule *);
|
|
|
|
|
2006-04-06 10:09:22 +04:00
|
|
|
/* global variables */
|
|
|
|
ViewVector view;
|
|
|
|
unsigned int sel;
|
|
|
|
ClientVector client;
|
|
|
|
KeyVector key;
|
2006-04-13 18:52:33 +04:00
|
|
|
BarVector bar;
|
2005-12-05 01:45:59 +03:00
|
|
|
Display *dpy;
|
2006-01-25 20:39:08 +03:00
|
|
|
int screen;
|
2005-12-05 01:45:59 +03:00
|
|
|
Window root;
|
|
|
|
XRectangle rect;
|
2006-04-23 22:00:47 +04:00
|
|
|
BlitzFont blitzfont;
|
2006-02-02 00:24:07 +03:00
|
|
|
IXPServer srv;
|
2006-03-10 20:35:00 +03:00
|
|
|
Pixmap barpmap;
|
|
|
|
Window barwin;
|
|
|
|
GC bargc;
|
2006-05-29 16:15:16 +04:00
|
|
|
GC xorgc;
|
2006-02-10 00:48:01 +03:00
|
|
|
XRectangle brect;
|
|
|
|
Qid root_qid;
|
2006-01-31 15:25:23 +03:00
|
|
|
Default def;
|
2006-03-05 02:11:08 +03:00
|
|
|
Atom wm_atom[WMLast];
|
2006-05-10 15:38:01 +04:00
|
|
|
Atom net_atom[NetLast];
|
2006-03-05 15:22:42 +03:00
|
|
|
Cursor cursor[CurLast];
|
2006-04-06 10:09:22 +04:00
|
|
|
unsigned int valid_mask;
|
|
|
|
unsigned int num_lock_mask;
|
2006-05-29 13:04:29 +04:00
|
|
|
void (*handler[LASTEvent]) (XEvent *);
|
2006-05-31 21:48:44 +04:00
|
|
|
RuleVector trule;
|
2006-05-30 20:28:05 +04:00
|
|
|
RuleVector vrule;
|
|
|
|
|
2005-11-18 18:54:58 +03:00
|
|
|
|
2006-02-03 18:15:36 +03:00
|
|
|
/* area.c */
|
2006-05-31 21:13:21 +04:00
|
|
|
Area *create_area(View *v, unsigned int pos, unsigned int w);
|
2006-02-03 18:15:36 +03:00
|
|
|
void destroy_area(Area *a);
|
2006-04-12 12:44:07 +04:00
|
|
|
int idx_of_area(Area *a);
|
|
|
|
int idx_of_area_id(View *t, unsigned short id);
|
2006-02-19 18:21:01 +03:00
|
|
|
void select_area(Area *a, char *arg);
|
2006-04-12 12:44:07 +04:00
|
|
|
void send_to_area(Area *to, Area *from, Client *c);
|
2006-05-31 18:34:48 +04:00
|
|
|
void attach_to_area(Area *a, Client *c, Bool send);
|
2006-04-12 12:44:07 +04:00
|
|
|
void detach_from_area(Area *a, Client *c);
|
|
|
|
Bool is_of_area(Area *a, Client *c);
|
2006-05-08 23:44:56 +04:00
|
|
|
Client *sel_client_of_area(Area *a);
|
2005-11-18 18:54:58 +03:00
|
|
|
|
2006-02-10 00:48:01 +03:00
|
|
|
/* bar.c */
|
2006-04-12 12:44:07 +04:00
|
|
|
Bar *create_bar(char *name, Bool intern);
|
|
|
|
void destroy_bar(Bar *b);
|
2006-02-10 00:48:01 +03:00
|
|
|
void draw_bar();
|
2006-04-12 12:44:07 +04:00
|
|
|
int idx_of_bar_id(unsigned short id);
|
|
|
|
void resize_bar();
|
|
|
|
unsigned int height_of_bar();
|
|
|
|
Bar *bar_of_name(const char *name);
|
2006-05-01 22:53:30 +04:00
|
|
|
int idx_of_bar(Bar *b);
|
2006-04-12 12:44:07 +04:00
|
|
|
void update_view_bars();
|
2006-02-10 00:48:01 +03:00
|
|
|
|
2005-11-18 18:54:58 +03:00
|
|
|
/* client.c */
|
2006-04-12 12:44:07 +04:00
|
|
|
Client *create_client(Window w, XWindowAttributes *wa);
|
|
|
|
void destroy_client(Client *c);
|
2006-02-24 19:13:58 +03:00
|
|
|
void configure_client(Client *c);
|
2006-04-12 12:44:07 +04:00
|
|
|
void prop_client(Client *c, XPropertyEvent *e);
|
2006-02-24 19:13:58 +03:00
|
|
|
void kill_client(Client *c);
|
|
|
|
void draw_client(Client *client);
|
2006-04-12 12:44:07 +04:00
|
|
|
void gravitate_client(Client *c, Bool invert);
|
2006-02-24 19:13:58 +03:00
|
|
|
void unmap_client(Client *c);
|
|
|
|
void map_client(Client *c);
|
|
|
|
void reparent_client(Client *c, Window w, int x, int y);
|
2006-03-09 01:53:52 +03:00
|
|
|
void manage_client(Client *c);
|
2006-04-26 10:59:55 +04:00
|
|
|
void focus_client(Client *c, Bool restack);
|
|
|
|
void focus(Client *c, Bool restack);
|
2006-06-05 07:47:09 +04:00
|
|
|
void match_sizehints(Client *c, XRectangle *r, int aidx, BlitzAlign sticky);
|
2006-03-15 18:00:39 +03:00
|
|
|
void resize_client(Client *c, XRectangle *r, Bool ignore_xcall);
|
2006-02-14 14:06:16 +03:00
|
|
|
void select_client(Client *c, char *arg);
|
2006-05-26 16:16:19 +04:00
|
|
|
void send_client(Client *c, char *arg);
|
2006-05-21 21:21:37 +04:00
|
|
|
void move_client(Client *c, char *arg);
|
2006-05-26 16:16:19 +04:00
|
|
|
void size_client(Client *c, char *arg);
|
2006-05-21 21:21:37 +04:00
|
|
|
void newcol_client(Client *c, char *arg);
|
2006-02-24 12:38:48 +03:00
|
|
|
void resize_all_clients();
|
2006-04-12 12:44:07 +04:00
|
|
|
Client *sel_client();
|
|
|
|
int idx_of_client_id(unsigned short id);
|
|
|
|
Client *client_of_win(Window w);
|
2006-04-13 17:35:10 +04:00
|
|
|
void draw_clients();
|
2006-04-27 20:32:37 +04:00
|
|
|
void update_client_grab(Client *c, Bool is_sel);
|
2006-05-30 20:42:42 +04:00
|
|
|
void apply_rules(Client *c);
|
|
|
|
void apply_tags(Client *c, const char *tags);
|
2006-04-12 12:44:07 +04:00
|
|
|
|
|
|
|
/* column.c */
|
|
|
|
void arrange_column(Area *a, Bool dirty);
|
2006-04-24 18:03:37 +04:00
|
|
|
void scale_column(Area *a, float h);
|
2006-04-12 12:44:07 +04:00
|
|
|
void resize_column(Client *c, XRectangle *r, XPoint *pt);
|
|
|
|
int column_mode_of_str(char *arg);
|
|
|
|
char *str_of_column_mode(int mode);
|
2006-05-31 21:13:21 +04:00
|
|
|
Area *new_column(View *v, unsigned int pos, unsigned int w);
|
2005-11-18 18:54:58 +03:00
|
|
|
|
|
|
|
/* event.c */
|
2006-02-02 18:44:45 +03:00
|
|
|
void init_x_event_handler();
|
2006-02-03 20:11:22 +03:00
|
|
|
void check_x_event(IXPConn *c);
|
2006-05-01 23:15:24 +04:00
|
|
|
unsigned int flush_masked_events(long even_mask);
|
2005-11-18 18:54:58 +03:00
|
|
|
|
2006-03-08 15:00:10 +03:00
|
|
|
/* frame.c */
|
2006-05-08 22:06:36 +04:00
|
|
|
Vector *vector_of_frames(FrameVector *fv);
|
2006-04-12 12:44:07 +04:00
|
|
|
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);
|
2006-03-08 15:00:10 +03:00
|
|
|
|
2006-02-02 00:24:07 +03:00
|
|
|
/* fs.c */
|
2006-05-01 21:39:26 +04:00
|
|
|
unsigned long long pack_qpath(unsigned char type, unsigned short i1,
|
|
|
|
unsigned short i2, unsigned short i3);
|
2006-03-23 20:08:55 +03:00
|
|
|
void write_event(char *event);
|
2006-02-03 20:11:22 +03:00
|
|
|
void new_ixp_conn(IXPConn *c);
|
2006-02-02 00:24:07 +03:00
|
|
|
|
2006-04-12 12:44:07 +04:00
|
|
|
/* key.c */
|
2006-02-09 21:40:12 +03:00
|
|
|
void handle_key(Window w, unsigned long mod, KeyCode keycode);
|
2006-03-10 18:21:20 +03:00
|
|
|
void update_keys();
|
2006-04-12 12:44:07 +04:00
|
|
|
void init_lock_keys();
|
2006-04-12 13:08:31 +04:00
|
|
|
unsigned long mod_key_of_str(char *val);
|
2006-02-09 21:40:12 +03:00
|
|
|
|
2005-11-18 18:54:58 +03:00
|
|
|
/* mouse.c */
|
2006-05-12 23:17:03 +04:00
|
|
|
void do_mouse_resize(Client *c,BlitzAlign align);
|
2006-02-09 21:40:12 +03:00
|
|
|
void grab_mouse(Window w, unsigned long mod, unsigned int button);
|
|
|
|
void ungrab_mouse(Window w, unsigned long mod, unsigned int button);
|
2006-06-05 07:47:09 +04:00
|
|
|
BlitzAlign snap_rect(XRectangle *rects, int num, XRectangle *current,
|
|
|
|
BlitzAlign *mask, int snap);
|
2005-11-18 18:54:58 +03:00
|
|
|
|
2006-03-10 13:50:52 +03:00
|
|
|
/* rule.c */
|
2006-05-30 20:28:05 +04:00
|
|
|
void update_rules(RuleVector *rule, const char *data);
|
2006-03-10 13:50:52 +03:00
|
|
|
|
2006-03-23 12:43:57 +03:00
|
|
|
/* view.c */
|
2006-04-24 19:19:50 +04:00
|
|
|
void arrange_view(View *v);
|
2006-04-24 19:39:58 +04:00
|
|
|
void scale_view(View *v, float w);
|
2006-05-24 11:26:08 +04:00
|
|
|
View *create_view(const char *name);
|
2006-03-23 12:43:57 +03:00
|
|
|
void focus_view(View *v);
|
2006-05-29 11:50:11 +04:00
|
|
|
XRectangle *rects_of_view(View *v, unsigned int *num);
|
2006-04-12 12:44:07 +04:00
|
|
|
int idx_of_view_id(unsigned short id);
|
2006-05-24 11:26:08 +04:00
|
|
|
void select_view(const char *arg);
|
2006-04-12 12:44:07 +04:00
|
|
|
int idx_of_view(View *v);
|
|
|
|
void detach_from_view(View *v, Client *c);
|
|
|
|
void attach_to_view(View *v, Client *c);
|
2006-03-23 12:43:57 +03:00
|
|
|
Client *sel_client_of_view(View *v);
|
|
|
|
void restack_view(View *v);
|
2006-05-24 11:26:08 +04:00
|
|
|
View *view_of_name(const char *name);
|
2006-03-29 11:45:54 +04:00
|
|
|
void destroy_view(View *v);
|
2006-04-11 12:16:01 +04:00
|
|
|
void update_views();
|
2006-05-31 21:48:44 +04:00
|
|
|
unsigned int newcolw_of_view(View *v);
|
2005-11-18 18:54:58 +03:00
|
|
|
|
2005-12-05 04:15:25 +03:00
|
|
|
/* wm.c */
|
|
|
|
void scan_wins();
|
|
|
|
int win_proto(Window w);
|
|
|
|
int win_state(Window w);
|
2006-03-09 22:25:50 +03:00
|
|
|
int wmii_error_handler(Display *dpy, XErrorEvent *error);
|