cvsimport

This commit is contained in:
okan
2011-05-07 17:15:37 +00:00
9 changed files with 386 additions and 369 deletions

665
calmwm.h
View File

@@ -39,13 +39,15 @@ size_t strlcat(char *, const char *, size_t);
#include <X11/extensions/Xrandr.h> #include <X11/extensions/Xrandr.h>
#include <X11/keysym.h> #include <X11/keysym.h>
#define CALMWM_MAXNAMELEN 256
#undef MIN #undef MIN
#undef MAX #undef MAX
#define MIN(x, y) ((x) < (y) ? (x) : (y)) #define MIN(x, y) ((x) < (y) ? (x) : (y))
#define MAX(x, y) ((x) > (y) ? (x) : (y)) #define MAX(x, y) ((x) > (y) ? (x) : (y))
#ifndef nitems
#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
#endif
#define CONFFILE ".cwmrc" #define CONFFILE ".cwmrc"
#define WMNAME "CWM" #define WMNAME "CWM"
@@ -59,9 +61,34 @@ size_t strlcat(char *, const char *, size_t);
PointerMotionMask) PointerMotionMask)
#define SearchMask (KeyPressMask|ExposureMask) #define SearchMask (KeyPressMask|ExposureMask)
#ifndef nitems /* kb movement */
#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) #define CWM_MOVE 0x0001
#endif #define CWM_RESIZE 0x0002
#define CWM_PTRMOVE 0x0004
#define CWM_BIGMOVE 0x0008
#define CWM_UP 0x0010
#define CWM_DOWN 0x0020
#define CWM_LEFT 0x0040
#define CWM_RIGHT 0x0080
/* exec */
#define CWM_EXEC_PROGRAM 0x0001
#define CWM_EXEC_WM 0x0002
/* client cycle */
#define CWM_CYCLE 0x0001
#define CWM_RCYCLE 0x0002
/* group cycle */
#define CWM_CYCLEGROUP 0x0001
#define CWM_RCYCLEGROUP 0x0002
#define KBTOGROUP(X) ((X) - 1)
union arg {
char *c;
int i;
};
enum cwmcolor { enum cwmcolor {
CWM_COLOR_BORDOR_ACTIVE, CWM_COLOR_BORDOR_ACTIVE,
@@ -77,6 +104,7 @@ struct color {
unsigned long pixel; unsigned long pixel;
char *name; char *name;
}; };
struct gap { struct gap {
int top; int top;
int bottom; int bottom;
@@ -84,13 +112,80 @@ struct gap {
int right; int right;
}; };
struct client_ctx; struct winname {
TAILQ_ENTRY(winname) entry;
char *name;
};
TAILQ_HEAD(winname_q, winname);
TAILQ_HEAD(cycle_entry_q, client_ctx); struct client_ctx {
TAILQ_HEAD(group_ctx_q, group_ctx); TAILQ_ENTRY(client_ctx) entry;
TAILQ_ENTRY(client_ctx) group_entry;
TAILQ_ENTRY(client_ctx) mru_entry;
struct screen_ctx *sc;
Window win;
XSizeHints *size;
Colormap cmap;
u_int bwidth; /* border width */
struct {
int x; /* x position */
int y; /* y position */
int width; /* width */
int height;/* height */
int basew; /* desired width */
int baseh; /* desired height */
int minw; /* minimum width */
int minh; /* minimum height */
int maxw; /* maximum width */
int maxh; /* maximum height */
int incw; /* width increment progression */
int inch; /* height increment progression */
float mina; /* minimum aspect ratio */
float maxa; /* maximum aspect ratio */
} geom, savegeom;
struct {
int x; /* x position */
int y; /* y position */
} ptr;
#define CLIENT_PROTO_DELETE 0x0001
#define CLIENT_PROTO_TAKEFOCUS 0x0002
int xproto;
#define CLIENT_HIDDEN 0x0001
#define CLIENT_IGNORE 0x0002
#define CLIENT_DOMAXIMIZE 0x0004
#define CLIENT_MAXIMIZED 0x0008
#define CLIENT_DOVMAXIMIZE 0x0010
#define CLIENT_VMAXIMIZED 0x0020
#define CLIENT_DOHMAXIMIZE 0x0040
#define CLIENT_HMAXIMIZED 0x0080
#define CLIENT_FREEZE 0x0100
int flags;
int state;
int active;
int stackingorder;
#define CLIENT_HIGHLIGHT_GROUP 0x0001
#define CLIENT_HIGHLIGHT_UNGROUP 0x0002
int highlight;
struct winname_q nameq;
#define CLIENT_MAXNAMEQLEN 5
int nameqlen;
char *name;
char *label;
char *matchname;
struct group_ctx *group;
char *app_class;
char *app_name;
};
TAILQ_HEAD(client_ctx_q, client_ctx); TAILQ_HEAD(client_ctx_q, client_ctx);
TAILQ_HEAD(cycle_entry_q, client_ctx);
struct winmatch {
TAILQ_ENTRY(winmatch) entry;
#define WIN_MAXTITLELEN 256
char title[WIN_MAXTITLELEN];
};
TAILQ_HEAD(winmatch_q, winmatch);
#define CALMWM_NGROUPS 9
struct group_ctx { struct group_ctx {
TAILQ_ENTRY(group_ctx) entry; TAILQ_ENTRY(group_ctx) entry;
struct client_ctx_q clients; struct client_ctx_q clients;
@@ -99,160 +194,43 @@ struct group_ctx {
int nhidden; int nhidden;
int highstack; int highstack;
}; };
TAILQ_HEAD(group_ctx_q, group_ctx);
struct screen_ctx {
TAILQ_ENTRY(screen_ctx) entry;
u_int which;
Window rootwin;
Window menuwin;
struct color color[CWM_COLOR_MAX];
GC gc;
int altpersist;
int xmax;
int ymax;
struct gap gap;
struct cycle_entry_q mruq;
XftDraw *xftdraw;
XftColor xftcolor;
XftFont *font;
u_int fontheight;
int xinerama_no;
XineramaScreenInfo *xinerama;
struct group_ctx *group_active;
struct group_ctx groups[CALMWM_NGROUPS];
int group_hideall;
struct group_ctx_q groupq;
char **group_names;
int group_nonames;
};
TAILQ_HEAD(screen_ctx_q, screen_ctx);
#define CLIENT_PROTO_DELETE 0x01
#define CLIENT_PROTO_TAKEFOCUS 0x02
#define CLIENT_MAXNAMEQLEN 5
#define CLIENT_HIDDEN 0x01
#define CLIENT_IGNORE 0x02
#define CLIENT_DOMAXIMIZE 0x04
#define CLIENT_MAXIMIZED 0x08
#define CLIENT_DOVMAXIMIZE 0x10
#define CLIENT_VMAXIMIZED 0x20
#define CLIENT_DOHMAXIMIZE 0x40
#define CLIENT_HMAXIMIZED 0x80
#define CLIENT_HIGHLIGHT_GROUP 1
#define CLIENT_HIGHLIGHT_UNGROUP 2
struct winname {
TAILQ_ENTRY(winname) entry;
char *name;
};
TAILQ_HEAD(winname_q, winname);
struct client_ctx {
TAILQ_ENTRY(client_ctx) entry;
TAILQ_ENTRY(client_ctx) searchentry;
TAILQ_ENTRY(client_ctx) group_entry;
TAILQ_ENTRY(client_ctx) mru_entry;
struct screen_ctx *sc;
Window win;
XSizeHints *size;
Colormap cmap;
u_int bwidth;
struct {
int x, y, width, height, basew, baseh,
minw, minh, maxw, maxh, incw, inch;
float mina, maxa;
} geom, savegeom;
struct {
int x,y;
} ptr;
int xproto;
int flags;
int state;
char *name;
struct winname_q nameq;
size_t nameqlen;
char *label;
int active;
int highlight;
char *matchname;
struct group_ctx *group;
int stackingorder;
char *app_class;
char *app_name;
};
extern const char *shortcut_to_name[];
/* Autogroups */
struct autogroupwin { struct autogroupwin {
TAILQ_ENTRY(autogroupwin) entry; TAILQ_ENTRY(autogroupwin) entry;
char *class; char *class;
char *name; char *name;
int num; int num;
}; };
TAILQ_HEAD(autogroupwin_q, autogroupwin); TAILQ_HEAD(autogroupwin_q, autogroupwin);
#define CWM_MOVE 0x01 struct screen_ctx {
#define CWM_RESIZE 0x02 TAILQ_ENTRY(screen_ctx) entry;
#define CWM_PTRMOVE 0x04 u_int which;
#define CWM_BIGMOVE 0x08 Window rootwin;
#define CWM_UP 0x10 Window menuwin;
#define CWM_DOWN 0x20 struct color color[CWM_COLOR_MAX];
#define CWM_LEFT 0x40 GC gc;
#define CWM_RIGHT 0x80 int altpersist;
int xmax;
/* int ymax;
* Match a window. struct gap gap;
*/ struct cycle_entry_q mruq;
#define CONF_MAX_WINTITLE 256 XftColor xftcolor;
struct winmatch { XftDraw *xftdraw;
TAILQ_ENTRY(winmatch) entry; XftFont *font;
char title[CONF_MAX_WINTITLE]; u_int fontheight;
}; int xinerama_no;
XineramaScreenInfo *xinerama;
TAILQ_HEAD(winmatch_q, winmatch); #define CALMWM_NGROUPS 9
struct group_ctx groups[CALMWM_NGROUPS];
/* for cwm_exec */ struct group_ctx_q groupq;
#define CWM_EXEC_PROGRAM 0x1 int group_hideall;
#define CWM_EXEC_WM 0x2 int group_nonames;
/* for alt-tab */ struct group_ctx *group_active;
#define CWM_CYCLE 0x0 char **group_names;
#define CWM_RCYCLE 0x1
/* for group cycle */
#define CWM_CYCLEGROUP 0x0
#define CWM_RCYCLEGROUP 0x1
#define KBFLAG_NEEDCLIENT 0x01
#define KBTOGROUP(X) ((X) - 1)
union arg {
char *c;
int i;
}; };
TAILQ_HEAD(screen_ctx_q, screen_ctx);
struct keybinding { struct keybinding {
TAILQ_ENTRY(keybinding) entry; TAILQ_ENTRY(keybinding) entry;
@@ -261,33 +239,43 @@ struct keybinding {
int modmask; int modmask;
int keysym; int keysym;
int keycode; int keycode;
#define KBFLAG_NEEDCLIENT 0x0001
int flags; int flags;
}; };
TAILQ_HEAD(keybinding_q, keybinding);
struct mousebinding {
TAILQ_ENTRY(mousebinding) entry;
void (*callback)(struct client_ctx *, void *);
int modmask;
int button;
#define MOUSEBIND_CTX_ROOT 0x0001
#define MOUSEBIND_CTX_WIN 0x0002
int context;
};
TAILQ_HEAD(mousebinding_q, mousebinding);
struct cmd { struct cmd {
TAILQ_ENTRY(cmd) entry; TAILQ_ENTRY(cmd) entry;
int flags; int flags;
char image[MAXPATHLEN]; char image[MAXPATHLEN];
char label[256]; #define CMD_MAXLABELLEN 256
/* (argv) */ char label[CMD_MAXLABELLEN];
}; };
struct mousebinding {
int modmask;
int button;
int context;
void (*callback)(struct client_ctx *, void *);
TAILQ_ENTRY(mousebinding) entry;
};
#define MOUSEBIND_CTX_ROOT 1
#define MOUSEBIND_CTX_WIN 2
TAILQ_HEAD(keybinding_q, keybinding);
TAILQ_HEAD(cmd_q, cmd); TAILQ_HEAD(cmd_q, cmd);
TAILQ_HEAD(mousebinding_q, mousebinding);
/* Global configuration */ struct menu {
TAILQ_ENTRY(menu) entry;
TAILQ_ENTRY(menu) resultentry;
#define MENU_MAXENTRY 50
char text[MENU_MAXENTRY + 1];
char print[MENU_MAXENTRY + 1];
void *ctx;
short dummy;
short abort;
};
TAILQ_HEAD(menu_q, menu);
struct conf { struct conf {
struct keybinding_q keybindingq; struct keybinding_q keybindingq;
struct autogroupwin_q autogroupq; struct autogroupwin_q autogroupq;
@@ -295,15 +283,13 @@ struct conf {
char conf_path[MAXPATHLEN]; char conf_path[MAXPATHLEN];
struct cmd_q cmdq; struct cmd_q cmdq;
struct mousebinding_q mousebindingq; struct mousebinding_q mousebindingq;
#define CONF_STICKY_GROUPS 0x0001
#define CONF_STICKY_GROUPS 0x0001
int flags; int flags;
#define CONF_BWIDTH 1 #define CONF_BWIDTH 1
int bwidth; int bwidth;
#define CONF_MAMOUNT 1 #define CONF_MAMOUNT 1
int mamount; int mamount;
struct gap gap; struct gap gap;
#define CONF_COLOR_ACTIVEBORDER "#CCCCCC" #define CONF_COLOR_ACTIVEBORDER "#CCCCCC"
#define CONF_COLOR_INACTIVEBORDER "#666666" #define CONF_COLOR_INACTIVEBORDER "#666666"
#define CONF_COLOR_GROUPBORDER "blue" #define CONF_COLOR_GROUPBORDER "blue"
@@ -311,74 +297,128 @@ struct conf {
#define CONF_COLOR_MENUFG "black" #define CONF_COLOR_MENUFG "black"
#define CONF_COLOR_MENUBG "white" #define CONF_COLOR_MENUBG "white"
struct color color[CWM_COLOR_MAX]; struct color color[CWM_COLOR_MAX];
char termpath[MAXPATHLEN]; char termpath[MAXPATHLEN];
char lockpath[MAXPATHLEN]; char lockpath[MAXPATHLEN];
#define DEFAULTFONTNAME "sans-serif:pixelsize=14:bold"
#define DEFAULTFONTNAME "sans-serif:pixelsize=14:bold"
char *DefaultFontName; char *DefaultFontName;
}; };
/* Menu stuff */
#define MENU_MAXENTRY 50
struct menu {
TAILQ_ENTRY(menu) entry;
TAILQ_ENTRY(menu) resultentry;
char text[MENU_MAXENTRY + 1];
char print[MENU_MAXENTRY + 1];
void *ctx;
short dummy;
short abort;
};
TAILQ_HEAD(menu_q, menu);
/* MWM hints */ /* MWM hints */
struct mwm_hints { struct mwm_hints {
u_long flags; u_long flags;
u_long functions; u_long functions;
u_long decorations; u_long decorations;
}; };
#define MWM_NUMHINTS 3
#define MWM_NUMHINTS 3
#define PROP_MWM_HINTS_ELEMENTS 3 #define PROP_MWM_HINTS_ELEMENTS 3
#define MWM_HINTS_DECORATIONS (1 << 1) #define MWM_HINTS_DECORATIONS (1<<1)
#define MWM_DECOR_ALL (1 << 0) #define MWM_DECOR_ALL (1<<0)
#define MWM_DECOR_BORDER (1 << 1) #define MWM_DECOR_BORDER (1<<1)
__dead void usage(void); __dead void usage(void);
struct client_ctx *client_find(Window);
struct client_ctx *client_new(Window, struct screen_ctx *, int);
int client_delete(struct client_ctx *);
void client_setactive(struct client_ctx *, int);
void client_resize(struct client_ctx *);
void client_lower(struct client_ctx *);
void client_raise(struct client_ctx *);
void client_move(struct client_ctx *);
void client_leave(struct client_ctx *);
void client_send_delete(struct client_ctx *);
struct client_ctx *client_current(void);
void client_hide(struct client_ctx *);
void client_unhide(struct client_ctx *);
void client_setname(struct client_ctx *);
void client_warp(struct client_ctx *);
void client_ptrwarp(struct client_ctx *);
void client_ptrsave(struct client_ctx *);
void client_draw_border(struct client_ctx *);
void client_maximize(struct client_ctx *);
void client_vertmaximize(struct client_ctx *);
void client_horizmaximize(struct client_ctx *);
void client_map(struct client_ctx *);
void client_mtf(struct client_ctx *);
struct client_ctx *client_cycle(struct screen_ctx *, int);
void client_getsizehints(struct client_ctx *);
void client_applysizehints(struct client_ctx *); void client_applysizehints(struct client_ctx *);
struct client_ctx *client_current(void);
struct client_ctx *client_cycle(struct screen_ctx *, int);
int client_delete(struct client_ctx *);
void client_draw_border(struct client_ctx *);
struct client_ctx *client_find(Window);
void client_freeze(struct client_ctx *);
void client_getsizehints(struct client_ctx *);
void client_hide(struct client_ctx *);
void client_horizmaximize(struct client_ctx *);
void client_leave(struct client_ctx *);
void client_lower(struct client_ctx *);
void client_map(struct client_ctx *);
void client_maximize(struct client_ctx *);
void client_move(struct client_ctx *);
void client_mtf(struct client_ctx *);
struct client_ctx *client_new(Window, struct screen_ctx *, int);
void client_ptrsave(struct client_ctx *);
void client_ptrwarp(struct client_ctx *);
void client_raise(struct client_ctx *);
void client_resize(struct client_ctx *);
void client_send_delete(struct client_ctx *);
void client_setactive(struct client_ctx *, int);
void client_setname(struct client_ctx *);
void client_unhide(struct client_ctx *);
void client_vertmaximize(struct client_ctx *);
void client_warp(struct client_ctx *);
void group_alltoggle(struct screen_ctx *);
void group_autogroup(struct client_ctx *);
void group_client_delete(struct client_ctx *);
void group_cycle(struct screen_ctx *, int);
void group_hidetoggle(struct screen_ctx *, int);
void group_init(struct screen_ctx *);
void group_make_autogroup(struct conf *, char *, int);
void group_menu(XButtonEvent *);
void group_movetogroup(struct client_ctx *, int);
void group_only(struct screen_ctx *, int);
void group_sticky(struct client_ctx *);
void group_sticky_toggle_enter(struct client_ctx *);
void group_sticky_toggle_exit(struct client_ctx *);
void group_update_names(struct screen_ctx *);
void search_match_client(struct menu_q *, struct menu_q *,
char *);
void search_match_exec(struct menu_q *, struct menu_q *,
char *);
void search_match_text(struct menu_q *, struct menu_q *,
char *);
void search_print_client(struct menu *, int);
XineramaScreenInfo *screen_find_xinerama(struct screen_ctx *, int, int);
struct screen_ctx *screen_fromroot(Window);
void screen_init_xinerama(struct screen_ctx *);
void screen_update_geometry(struct screen_ctx *, int, int);
void screen_updatestackingorder(struct screen_ctx *);
void kbfunc_client_cycle(struct client_ctx *, union arg *);
void kbfunc_client_cyclegroup(struct client_ctx *,
union arg *);
void kbfunc_client_delete(struct client_ctx *, union arg *);
void kbfunc_client_freeze(struct client_ctx *, union arg *);
void kbfunc_client_group(struct client_ctx *, union arg *);
void kbfunc_client_grouponly(struct client_ctx *,
union arg *);
void kbfunc_client_grouptoggle(struct client_ctx *,
union arg *);
void kbfunc_client_hide(struct client_ctx *, union arg *);
void kbfunc_client_hmaximize(struct client_ctx *,
union arg *);
void kbfunc_client_label(struct client_ctx *, union arg *);
void kbfunc_client_lower(struct client_ctx *, union arg *);
void kbfunc_client_maximize(struct client_ctx *,
union arg *);
void kbfunc_client_movetogroup(struct client_ctx *,
union arg *);
void kbfunc_client_nogroup(struct client_ctx *,
union arg *);
void kbfunc_client_raise(struct client_ctx *, union arg *);
void kbfunc_client_rcycle(struct client_ctx *, union arg *);
void kbfunc_client_search(struct client_ctx *, union arg *);
void kbfunc_client_vmaximize(struct client_ctx *,
union arg *);
void kbfunc_cmdexec(struct client_ctx *, union arg *);
void kbfunc_exec(struct client_ctx *, union arg *);
void kbfunc_lock(struct client_ctx *, union arg *);
void kbfunc_menu_search(struct client_ctx *, union arg *);
void kbfunc_moveresize(struct client_ctx *, union arg *);
void kbfunc_quit_wm(struct client_ctx *, union arg *);
void kbfunc_reload(struct client_ctx *, union arg *);
void kbfunc_ssh(struct client_ctx *, union arg *);
void kbfunc_term(struct client_ctx *, union arg *);
void mousefunc_menu_cmd(struct client_ctx *, void *);
void mousefunc_menu_group(struct client_ctx *, void *);
void mousefunc_menu_unhide(struct client_ctx *, void *);
void mousefunc_window_grouptoggle(struct client_ctx *,
void *);
void mousefunc_window_hide(struct client_ctx *, void *);
void mousefunc_window_lower(struct client_ctx *, void *);
void mousefunc_window_move(struct client_ctx *, void *);
void mousefunc_window_resize(struct client_ctx *, void *);
struct menu *menu_filter(struct screen_ctx *, struct menu_q *, struct menu *menu_filter(struct screen_ctx *, struct menu_q *,
char *, char *, int, char *, char *, int,
@@ -386,138 +426,63 @@ struct menu *menu_filter(struct screen_ctx *, struct menu_q *,
void (*)(struct menu *, int)); void (*)(struct menu *, int));
void menu_init(struct screen_ctx *); void menu_init(struct screen_ctx *);
void xev_loop(void);
void xu_getatoms(void);
int xu_ptr_grab(Window, int, Cursor);
void xu_btn_grab(Window, int, u_int);
int xu_ptr_regrab(int, Cursor);
void xu_btn_ungrab(Window, int, u_int);
void xu_ptr_ungrab(void);
void xu_ptr_setpos(Window, int, int);
void xu_ptr_getpos(Window, int *, int *);
void xu_key_grab(Window, int, int);
void xu_key_ungrab(Window, int, int);
void xu_configure(struct client_ctx *);
void xu_sendmsg(Window, Atom, long);
int xu_getprop(Window, Atom, Atom, long, u_char **);
int xu_getstrprop(Window, Atom, char **);
void xu_setstate(struct client_ctx *, int);
int xu_getstate(struct client_ctx *, int *);
unsigned long xu_getcolor(struct screen_ctx *, char *);
void xu_freecolor(struct screen_ctx *, unsigned long);
void xu_setwmname(struct screen_ctx *);
int u_spawn(char *);
void u_exec(char *);
void xfree(void *);
void *xmalloc(size_t);
void *xcalloc(size_t, size_t);
char *xstrdup(const char *);
struct screen_ctx *screen_fromroot(Window);
void screen_updatestackingorder(struct screen_ctx *);
void screen_update_geometry(struct screen_ctx *, int, int);
void screen_init_xinerama(struct screen_ctx *);
XineramaScreenInfo *screen_find_xinerama(struct screen_ctx *, int, int);
void conf_setup(struct conf *, const char *);
void conf_client(struct client_ctx *);
void conf_grab(struct conf *, struct keybinding *);
void conf_ungrab(struct conf *, struct keybinding *);
void conf_bindname(struct conf *, char *, char *);
void conf_mousebind(struct conf *, char *, char *);
void conf_grab_mouse(struct client_ctx *);
void conf_reload(struct conf *);
void conf_gap(struct conf *, struct screen_ctx *);
void conf_font(struct conf *, struct screen_ctx *);
void conf_color(struct conf *, struct screen_ctx *);
void conf_init(struct conf *);
void conf_clear(struct conf *);
void conf_cmd_add(struct conf *, char *, char *, int);
int parse_config(const char *, struct conf *); int parse_config(const char *, struct conf *);
void kbfunc_client_lower(struct client_ctx *, union arg *); void conf_bindname(struct conf *, char *, char *);
void kbfunc_client_raise(struct client_ctx *, union arg *); void conf_clear(struct conf *);
void kbfunc_client_search(struct client_ctx *, union arg *); void conf_client(struct client_ctx *);
void kbfunc_client_hide(struct client_ctx *, union arg *); void conf_cmd_add(struct conf *, char *, char *, int);
void kbfunc_client_cycle(struct client_ctx *, union arg *); void conf_color(struct conf *, struct screen_ctx *);
void kbfunc_client_rcycle(struct client_ctx *, union arg *); void conf_font(struct conf *, struct screen_ctx *);
void kbfunc_cmdexec(struct client_ctx *, union arg *); void conf_gap(struct conf *, struct screen_ctx *);
void kbfunc_client_label(struct client_ctx *, union arg *); void conf_grab(struct conf *, struct keybinding *);
void kbfunc_client_delete(struct client_ctx *, union arg *); void conf_grab_mouse(struct client_ctx *);
void kbfunc_client_group(struct client_ctx *, union arg *); void conf_init(struct conf *);
void kbfunc_client_grouponly(struct client_ctx *, void conf_mousebind(struct conf *, char *, char *);
union arg *); void conf_reload(struct conf *);
void kbfunc_client_cyclegroup(struct client_ctx *, void conf_setup(struct conf *, const char *);
union arg *); void conf_ungrab(struct conf *, struct keybinding *);
void kbfunc_client_nogroup(struct client_ctx *,
union arg *);
void kbfunc_client_grouptoggle(struct client_ctx *,
union arg *);
void kbfunc_client_movetogroup(struct client_ctx *,
union arg *);
void kbfunc_client_maximize(struct client_ctx *,
union arg *);
void kbfunc_client_vmaximize(struct client_ctx *,
union arg *);
void kbfunc_client_hmaximize(struct client_ctx *,
union arg *);
void kbfunc_reload(struct client_ctx *, union arg *);
void kbfunc_quit_wm(struct client_ctx *, union arg *);
void kbfunc_moveresize(struct client_ctx *, union arg *);
void kbfunc_menu_search(struct client_ctx *, union arg *);
void kbfunc_exec(struct client_ctx *, union arg *);
void kbfunc_ssh(struct client_ctx *, union arg *);
void kbfunc_term(struct client_ctx *, union arg *);
void kbfunc_lock(struct client_ctx *, union arg *);
void mousefunc_window_resize(struct client_ctx *, void *);
void mousefunc_window_move(struct client_ctx *, void *);
void mousefunc_window_grouptoggle(struct client_ctx *,
void *);
void mousefunc_window_lower(struct client_ctx *, void *);
void mousefunc_window_hide(struct client_ctx *, void *);
void mousefunc_menu_group(struct client_ctx *, void *);
void mousefunc_menu_unhide(struct client_ctx *, void *);
void mousefunc_menu_cmd(struct client_ctx *, void *);
void search_match_client(struct menu_q *, struct menu_q *,
char *);
void search_print_client(struct menu *, int);
void search_match_text(struct menu_q *, struct menu_q *,
char *);
void search_match_exec(struct menu_q *, struct menu_q *,
char *);
void group_init(struct screen_ctx *);
void group_make_autogroup(struct conf *, char *, int);
void group_update_names(struct screen_ctx *);
void group_hidetoggle(struct screen_ctx *, int);
void group_only(struct screen_ctx *, int);
void group_cycle(struct screen_ctx *, int);
void group_sticky(struct client_ctx *);
void group_client_delete(struct client_ctx *);
void group_menu(XButtonEvent *);
void group_alltoggle(struct screen_ctx *);
void group_sticky_toggle_enter(struct client_ctx *);
void group_sticky_toggle_exit(struct client_ctx *);
void group_autogroup(struct client_ctx *);
void group_movetogroup(struct client_ctx *, int);
int font_ascent(struct screen_ctx *); int font_ascent(struct screen_ctx *);
int font_descent(struct screen_ctx *); int font_descent(struct screen_ctx *);
void font_draw(struct screen_ctx *, const char *, int,
Drawable, int, int);
u_int font_height(struct screen_ctx *); u_int font_height(struct screen_ctx *);
void font_init(struct screen_ctx *); void font_init(struct screen_ctx *);
int font_width(struct screen_ctx *, const char *, int); int font_width(struct screen_ctx *, const char *, int);
void font_draw(struct screen_ctx *, const char *, int,
Drawable, int, int);
XftFont *font_make(struct screen_ctx *, const char *); XftFont *font_make(struct screen_ctx *, const char *);
/* Externs */ void xev_loop(void);
void xu_btn_grab(Window, int, u_int);
void xu_btn_ungrab(Window, int, u_int);
void xu_configure(struct client_ctx *);
void xu_freecolor(struct screen_ctx *, unsigned long);
void xu_getatoms(void);
unsigned long xu_getcolor(struct screen_ctx *, char *);
int xu_getprop(Window, Atom, Atom, long, u_char **);
int xu_getstate(struct client_ctx *, int *);
int xu_getstrprop(Window, Atom, char **);
void xu_key_grab(Window, int, int);
void xu_key_ungrab(Window, int, int);
void xu_ptr_getpos(Window, int *, int *);
int xu_ptr_grab(Window, int, Cursor);
int xu_ptr_regrab(int, Cursor);
void xu_ptr_setpos(Window, int, int);
void xu_ptr_ungrab(void);
void xu_sendmsg(Window, Atom, long);
void xu_setstate(struct client_ctx *, int);
void xu_setwmname(struct screen_ctx *);
void u_exec(char *);
int u_spawn(char *);
void *xcalloc(size_t, size_t);
void xfree(void *);
void *xmalloc(size_t);
char *xstrdup(const char *);
/* Externs */
extern Display *X_Dpy; extern Display *X_Dpy;
extern Cursor Cursor_move; extern Cursor Cursor_move;
@@ -527,12 +492,10 @@ extern Cursor Cursor_default;
extern Cursor Cursor_question; extern Cursor Cursor_question;
extern struct screen_ctx_q Screenq; extern struct screen_ctx_q Screenq;
extern struct screen_ctx *curscreen;
extern struct client_ctx_q Clientq; extern struct client_ctx_q Clientq;
extern struct conf Conf;
extern int HasXinerama, HasRandr, Randr_ev; extern int HasXinerama, HasRandr, Randr_ev;
extern struct conf Conf;
#define WM_STATE cwm_atoms[0] #define WM_STATE cwm_atoms[0]
#define WM_DELETE_WINDOW cwm_atoms[1] #define WM_DELETE_WINDOW cwm_atoms[1]

View File

@@ -264,6 +264,15 @@ client_current(void)
return (_curcc); return (_curcc);
} }
void
client_freeze(struct client_ctx *cc)
{
if (cc->flags & CLIENT_FREEZE)
cc->flags &= ~CLIENT_FREEZE;
else
cc->flags |= CLIENT_FREEZE;
}
void void
client_maximize(struct client_ctx *cc) client_maximize(struct client_ctx *cc)
{ {
@@ -271,6 +280,9 @@ client_maximize(struct client_ctx *cc)
int xmax = sc->xmax, ymax = sc->ymax; int xmax = sc->xmax, ymax = sc->ymax;
int x_org = 0, y_org = 0; int x_org = 0, y_org = 0;
if (cc->flags & CLIENT_FREEZE)
return;
if (cc->flags & CLIENT_MAXIMIZED) { if (cc->flags & CLIENT_MAXIMIZED) {
cc->geom = cc->savegeom; cc->geom = cc->savegeom;
} else { } else {
@@ -310,6 +322,9 @@ client_vertmaximize(struct client_ctx *cc)
struct screen_ctx *sc = cc->sc; struct screen_ctx *sc = cc->sc;
int y_org = 0, ymax = sc->ymax; int y_org = 0, ymax = sc->ymax;
if (cc->flags & CLIENT_FREEZE)
return;
if (cc->flags & CLIENT_VMAXIMIZED) { if (cc->flags & CLIENT_VMAXIMIZED) {
cc->geom = cc->savegeom; cc->geom = cc->savegeom;
} else { } else {
@@ -341,6 +356,9 @@ client_horizmaximize(struct client_ctx *cc)
struct screen_ctx *sc = cc->sc; struct screen_ctx *sc = cc->sc;
int x_org = 0, xmax = sc->xmax; int x_org = 0, xmax = sc->xmax;
if (cc->flags & CLIENT_FREEZE)
return;
if (cc->flags & CLIENT_HMAXIMIZED) { if (cc->flags & CLIENT_HMAXIMIZED) {
cc->geom = cc->savegeom; cc->geom = cc->savegeom;
} else { } else {

2
conf.c
View File

@@ -138,6 +138,7 @@ static struct {
{ "CM-f", "maximize" }, { "CM-f", "maximize" },
{ "CM-equal", "vmaximize" }, { "CM-equal", "vmaximize" },
{ "CMS-equal", "hmaximize" }, { "CMS-equal", "hmaximize" },
{ "CMS-f", "freeze" },
{ "CMS-r", "reload" }, { "CMS-r", "reload" },
{ "CMS-q", "quit" }, { "CMS-q", "quit" },
{ "M-h", "moveleft" }, { "M-h", "moveleft" },
@@ -361,6 +362,7 @@ static struct {
{ "maximize", kbfunc_client_maximize, KBFLAG_NEEDCLIENT, {0} }, { "maximize", kbfunc_client_maximize, KBFLAG_NEEDCLIENT, {0} },
{ "vmaximize", kbfunc_client_vmaximize, KBFLAG_NEEDCLIENT, {0} }, { "vmaximize", kbfunc_client_vmaximize, KBFLAG_NEEDCLIENT, {0} },
{ "hmaximize", kbfunc_client_hmaximize, KBFLAG_NEEDCLIENT, {0} }, { "hmaximize", kbfunc_client_hmaximize, KBFLAG_NEEDCLIENT, {0} },
{ "freeze", kbfunc_client_freeze, KBFLAG_NEEDCLIENT, {0} },
{ "reload", kbfunc_reload, 0, {0} }, { "reload", kbfunc_reload, 0, {0} },
{ "quit", kbfunc_quit_wm, 0, {0} }, { "quit", kbfunc_quit_wm, 0, {0} },
{ "exec", kbfunc_exec, 0, {.i = CWM_EXEC_PROGRAM} }, { "exec", kbfunc_exec, 0, {.i = CWM_EXEC_PROGRAM} },

4
cwm.1
View File

@@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\" .\"
.Dd $Mdocdate: August 24 2009 $ .Dd $Mdocdate: September 25 2010 $
.Dt CWM 1 .Dt CWM 1
.Os .Os
.Sh NAME .Sh NAME
@@ -88,6 +88,8 @@ Toggle group membership of current window.
Cycle through active groups. Cycle through active groups.
.It Ic M-Left .It Ic M-Left
Reverse cycle through active groups. Reverse cycle through active groups.
.It Ic CMS-f
Toggle freezing geometry of current window.
.It Ic CM-f .It Ic CM-f
Toggle full-screen size of current window. Toggle full-screen size of current window.
.It Ic CM-= .It Ic CM-=

View File

@@ -287,6 +287,8 @@ Lower current window.
Raise current window. Raise current window.
.It label .It label
Label current window. Label current window.
.It freeze
Freeze current window geometry.
.It maximize .It maximize
Maximize current window full-screen. Maximize current window full-screen.
.It vmaximize .It vmaximize

View File

@@ -58,6 +58,9 @@ kbfunc_moveresize(struct client_ctx *cc, union arg *arg)
int x, y, flags, amt; int x, y, flags, amt;
u_int mx, my; u_int mx, my;
if (cc->flags & CLIENT_FREEZE)
return;
sc = cc->sc; sc = cc->sc;
mx = my = 0; mx = my = 0;
@@ -479,6 +482,12 @@ kbfunc_client_hmaximize(struct client_ctx *cc, union arg *arg)
client_horizmaximize(cc); client_horizmaximize(cc);
} }
void
kbfunc_client_freeze(struct client_ctx *cc, union arg *arg)
{
client_freeze(cc);
}
void void
kbfunc_quit_wm(struct client_ctx *cc, union arg *arg) kbfunc_quit_wm(struct client_ctx *cc, union arg *arg)
{ {

37
menu.c
View File

@@ -287,8 +287,10 @@ static void
menu_draw(struct screen_ctx *sc, struct menu_ctx *mc, struct menu_q *menuq, menu_draw(struct screen_ctx *sc, struct menu_ctx *mc, struct menu_q *menuq,
struct menu_q *resultq) struct menu_q *resultq)
{ {
struct menu *mi; struct menu *mi;
int n, dy, xsave, ysave; XineramaScreenInfo *xine;
int xmin, xmax, ymin, ymax;
int n, dy, xsave, ysave;
if (mc->list) { if (mc->list) {
if (TAILQ_EMPTY(resultq) && mc->list) { if (TAILQ_EMPTY(resultq) && mc->list) {
@@ -330,18 +332,33 @@ menu_draw(struct screen_ctx *sc, struct menu_ctx *mc, struct menu_q *menuq,
mc->num++; mc->num++;
} }
xine = screen_find_xinerama(sc, mc->x, mc->y);
if (xine) {
xmin = xine->x_org;
xmax = xine->x_org + xine->width;
ymin = xine->y_org;
ymax = xine->y_org + xine->height;
} else {
xmin = ymin = 0;
xmax = sc->xmax;
ymax = sc->ymax;
}
xsave = mc->x; xsave = mc->x;
ysave = mc->y; ysave = mc->y;
if (mc->x < 0)
mc->x = 0;
else if (mc->x + mc->width >= sc->xmax)
mc->x = sc->xmax - mc->width;
if (mc->y + dy >= sc->ymax) if (mc->x < xmin)
mc->y = sc->ymax - dy; mc->x = xmin;
else if (mc->x + mc->width >= xmax)
mc->x = xmax - mc->width;
if (mc->y + dy >= ymax)
mc->y = ymax - dy;
/* never hide the top of the menu */ /* never hide the top of the menu */
if (mc->y < 0) if (mc->y < ymin) {
mc->y = 0; mc->y = ymin;
dy = ymax - ymin;
}
if (mc->x != xsave || mc->y != ysave) if (mc->x != xsave || mc->y != ysave)
xu_ptr_setpos(sc->rootwin, mc->x, mc->y); xu_ptr_setpos(sc->rootwin, mc->x, mc->y);

View File

@@ -84,6 +84,9 @@ mousefunc_window_resize(struct client_ctx *cc, void *arg)
struct screen_ctx *sc = cc->sc; struct screen_ctx *sc = cc->sc;
int x = cc->geom.x, y = cc->geom.y; int x = cc->geom.x, y = cc->geom.y;
if (cc->flags & CLIENT_FREEZE)
return;
client_raise(cc); client_raise(cc);
client_ptrsave(cc); client_ptrsave(cc);
@@ -106,10 +109,9 @@ mousefunc_window_resize(struct client_ctx *cc, void *arg)
/* Recompute window output */ /* Recompute window output */
mousefunc_sweep_draw(cc); mousefunc_sweep_draw(cc);
/* don't sync more than 10 times / second */ /* don't resize more than 60 times / second */
if ((ev.xmotion.time - time) > (1000 / 10)) { if ((ev.xmotion.time - time) > (1000 / 60)) {
time = ev.xmotion.time; time = ev.xmotion.time;
XSync(X_Dpy, False);
client_resize(cc); client_resize(cc);
} }
break; break;
@@ -143,6 +145,9 @@ mousefunc_window_move(struct client_ctx *cc, void *arg)
client_raise(cc); client_raise(cc);
if (cc->flags & CLIENT_FREEZE)
return;
if (xu_ptr_grab(cc->win, MouseMask, Cursor_move) < 0) if (xu_ptr_grab(cc->win, MouseMask, Cursor_move) < 0)
return; return;
@@ -159,10 +164,9 @@ mousefunc_window_move(struct client_ctx *cc, void *arg)
cc->geom.x = ev.xmotion.x_root - px - cc->bwidth; cc->geom.x = ev.xmotion.x_root - px - cc->bwidth;
cc->geom.y = ev.xmotion.y_root - py - cc->bwidth; cc->geom.y = ev.xmotion.y_root - py - cc->bwidth;
/* don't sync more than 60 times / second */ /* don't move more than 60 times / second */
if ((ev.xmotion.time - time) > (1000 / 60)) { if ((ev.xmotion.time - time) > (1000 / 60)) {
time = ev.xmotion.time; time = ev.xmotion.time;
XSync(X_Dpy, False);
client_move(cc); client_move(cc);
} }
break; break;

View File

@@ -91,8 +91,8 @@ xev_handle_maprequest(XEvent *ee)
if (strncasecmp(wm->title, cc->name, strlen(wm->title)) == 0) if (strncasecmp(wm->title, cc->name, strlen(wm->title)) == 0)
return; return;
} }
if ((cc->flags & CLIENT_IGNORE) == 0)
client_ptrwarp(cc); client_ptrwarp(cc);
} }
static void static void