keyboard handler cleanup, config.h tweaks
This commit is contained in:
20
config.h
20
config.h
@@ -48,14 +48,14 @@
|
|||||||
binding keys[] = {
|
binding keys[] = {
|
||||||
|
|
||||||
// Focus the top-most window in a spot.
|
// Focus the top-most window in a spot.
|
||||||
{ .mod = Mod4Mask, .key = XK_1, .act = ACTION_FOCUS_SPOT1 },
|
{ .mod = Mod4Mask, .key = XK_1, .act = ACTION_FOCUS, .num = SPOT1 },
|
||||||
{ .mod = Mod4Mask, .key = XK_2, .act = ACTION_FOCUS_SPOT2 },
|
{ .mod = Mod4Mask, .key = XK_2, .act = ACTION_FOCUS, .num = SPOT2 },
|
||||||
{ .mod = Mod4Mask, .key = XK_3, .act = ACTION_FOCUS_SPOT3 },
|
{ .mod = Mod4Mask, .key = XK_3, .act = ACTION_FOCUS, .num = SPOT3 },
|
||||||
|
|
||||||
// Move the current window to another spot.
|
// Move the current window to another spot.
|
||||||
{ .mod = ShiftMask|Mod4Mask, .key = XK_1, .act = ACTION_MOVE_SPOT1 },
|
{ .mod = ShiftMask|Mod4Mask, .key = XK_1, .act = ACTION_MOVE, .num = SPOT1 },
|
||||||
{ .mod = ShiftMask|Mod4Mask, .key = XK_2, .act = ACTION_MOVE_SPOT2 },
|
{ .mod = ShiftMask|Mod4Mask, .key = XK_2, .act = ACTION_MOVE, .num = SPOT2 },
|
||||||
{ .mod = ShiftMask|Mod4Mask, .key = XK_3, .act = ACTION_MOVE_SPOT3 },
|
{ .mod = ShiftMask|Mod4Mask, .key = XK_3, .act = ACTION_MOVE, .num = SPOT3 },
|
||||||
|
|
||||||
// Flip between the top two windows in the current spot.
|
// Flip between the top two windows in the current spot.
|
||||||
{ .mod = Mod4Mask, .key = XK_Tab, .act = ACTION_OTHER },
|
{ .mod = Mod4Mask, .key = XK_Tab, .act = ACTION_OTHER },
|
||||||
@@ -73,12 +73,12 @@ binding keys[] = {
|
|||||||
{ .mod = Mod4Mask, .key = XK_a, .act = ACTION_ABOVE_TOGGLE },
|
{ .mod = Mod4Mask, .key = XK_a, .act = ACTION_ABOVE_TOGGLE },
|
||||||
|
|
||||||
// Switch focus between monitors.
|
// Switch focus between monitors.
|
||||||
{ .mod = Mod4Mask, .key = XK_Right, .act = ACTION_FOCUS_MONITOR_INC },
|
{ .mod = Mod4Mask, .key = XK_Right, .act = ACTION_FOCUS_MONITOR, .num = 1 },
|
||||||
{ .mod = Mod4Mask, .key = XK_Left, .act = ACTION_FOCUS_MONITOR_DEC },
|
{ .mod = Mod4Mask, .key = XK_Left, .act = ACTION_FOCUS_MONITOR, .num = -1 },
|
||||||
|
|
||||||
// Move windows between monitors.
|
// Move windows between monitors.
|
||||||
{ .mod = ShiftMask|Mod4Mask, .key = XK_Right, .act = ACTION_MOVE_MONITOR_INC },
|
{ .mod = ShiftMask|Mod4Mask, .key = XK_Right, .act = ACTION_MOVE_MONITOR, .num = 1 },
|
||||||
{ .mod = ShiftMask|Mod4Mask, .key = XK_Left, .act = ACTION_MOVE_MONITOR_DEC },
|
{ .mod = ShiftMask|Mod4Mask, .key = XK_Left, .act = ACTION_MOVE_MONITOR, .num = -1 },
|
||||||
|
|
||||||
// Launcher
|
// Launcher
|
||||||
{ .mod = Mod4Mask, .key = XK_x, .act = ACTION_COMMAND, .data = "dmenu_run" },
|
{ .mod = Mod4Mask, .key = XK_x, .act = ACTION_COMMAND, .data = "dmenu_run" },
|
||||||
|
|||||||
14
proto.h
14
proto.h
@@ -31,6 +31,20 @@ void window_listen(Window win);
|
|||||||
void client_review(client *c);
|
void client_review(client *c);
|
||||||
void raise_tag(unsigned long tag);
|
void raise_tag(unsigned long tag);
|
||||||
void client_set_tags(client *c);
|
void client_set_tags(client *c);
|
||||||
|
void action_move(void *data, int num);
|
||||||
|
void action_focus(void *data, int num);
|
||||||
|
void action_close(void *data, int num);
|
||||||
|
void action_cycle(void *data, int num);
|
||||||
|
void action_other(void *data, int num);
|
||||||
|
void action_command(void *data, int num);
|
||||||
|
void action_find_or_start(void *data, int num);
|
||||||
|
void action_move_monitor(void *data, int num);
|
||||||
|
void action_focus_monitor(void *data, int num);
|
||||||
|
void action_raise_tag(void *data, int num);
|
||||||
|
void action_fullscreen(void *data, int num);
|
||||||
|
void action_above(void *data, int num);
|
||||||
|
void action_tag(void *data, int num);
|
||||||
|
void action_untag(void *data, int num);
|
||||||
void create_notify(XCreateWindowEvent *e);
|
void create_notify(XCreateWindowEvent *e);
|
||||||
void configure_request(XConfigureRequestEvent *e);
|
void configure_request(XConfigureRequestEvent *e);
|
||||||
void map_request(XMapEvent *e);
|
void map_request(XMapEvent *e);
|
||||||
|
|||||||
273
xoat.c
273
xoat.c
@@ -436,6 +436,8 @@ void client_spot(client *c, int spot, int force)
|
|||||||
// cycle through windows in a screen "spot"
|
// cycle through windows in a screen "spot"
|
||||||
void client_cycle(client *c)
|
void client_cycle(client *c)
|
||||||
{
|
{
|
||||||
|
if (!c) return;
|
||||||
|
|
||||||
spot_active(c->spot, c->monitor, c->window);
|
spot_active(c->spot, c->monitor, c->window);
|
||||||
|
|
||||||
stack lower, all;
|
stack lower, all;
|
||||||
@@ -612,6 +614,151 @@ void client_set_tags(client *c)
|
|||||||
window_set_cardinal_prop(c->window, atoms[_NET_WM_DESKTOP], &desktop, 1);
|
window_set_cardinal_prop(c->window, atoms[_NET_WM_DESKTOP], &desktop, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------- key actions -------
|
||||||
|
|
||||||
|
void action_move(void *data, int num)
|
||||||
|
{
|
||||||
|
client *c = window_client(current);
|
||||||
|
if (c)
|
||||||
|
{
|
||||||
|
client_raise(c);
|
||||||
|
client_spot(c, num, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void action_focus(void *data, int num)
|
||||||
|
{
|
||||||
|
spot_active(num, current_mon, None);
|
||||||
|
}
|
||||||
|
|
||||||
|
void action_close(void *data, int num)
|
||||||
|
{
|
||||||
|
client_close(window_client(current));
|
||||||
|
}
|
||||||
|
|
||||||
|
void action_cycle(void *data, int num)
|
||||||
|
{
|
||||||
|
client_cycle(window_client(current));
|
||||||
|
}
|
||||||
|
|
||||||
|
void action_other(void *data, int num)
|
||||||
|
{
|
||||||
|
client *c = window_client(current);
|
||||||
|
if (c) spot_active(c->spot, c->monitor, c->window);
|
||||||
|
}
|
||||||
|
|
||||||
|
void action_command(void *data, int num)
|
||||||
|
{
|
||||||
|
exec_cmd(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void action_find_or_start(void *data, int num)
|
||||||
|
{
|
||||||
|
find_or_start(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void action_move_monitor(void *data, int num)
|
||||||
|
{
|
||||||
|
int mon = MAX(0, MIN(current_mon+num, nmonitors-1));
|
||||||
|
client *c = window_client(current);
|
||||||
|
if (c)
|
||||||
|
{
|
||||||
|
client_raise(c);
|
||||||
|
c->monitor = mon;
|
||||||
|
client_spot(c, c->spot, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void action_focus_monitor(void *data, int num)
|
||||||
|
{
|
||||||
|
int mon = MAX(0, MIN(current_mon+num, nmonitors-1));
|
||||||
|
if (spot_active(current_spot, mon, None)) return;
|
||||||
|
if (spot_active(SPOT1, mon, None)) return;
|
||||||
|
if (spot_active(SPOT2, mon, None)) return;
|
||||||
|
if (spot_active(SPOT3, mon, None)) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void action_raise_tag(void *data, int num)
|
||||||
|
{
|
||||||
|
raise_tag(num);
|
||||||
|
}
|
||||||
|
|
||||||
|
void action_fullscreen(void *data, int num)
|
||||||
|
{
|
||||||
|
client *c = window_client(current);
|
||||||
|
if (!c) return;
|
||||||
|
|
||||||
|
unsigned long spot = c->spot;
|
||||||
|
client_raise(c);
|
||||||
|
if (client_state(c, atoms[_NET_WM_STATE_FULLSCREEN]))
|
||||||
|
{
|
||||||
|
client_drop_state(c, atoms[_NET_WM_STATE_FULLSCREEN]);
|
||||||
|
if (window_get_cardinal_prop(c->window, atoms[XOAT_SPOT], &spot, 1))
|
||||||
|
c->spot = spot;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
client_add_state(c, atoms[_NET_WM_STATE_FULLSCREEN]);
|
||||||
|
window_set_cardinal_prop(c->window, atoms[XOAT_SPOT], &spot, 1);
|
||||||
|
c->spot = SPOT1;
|
||||||
|
}
|
||||||
|
client_review(c);
|
||||||
|
client_spot(c, c->spot, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void action_above(void *data, int num)
|
||||||
|
{
|
||||||
|
client *c = window_client(current);
|
||||||
|
if (!c) return;
|
||||||
|
|
||||||
|
if (client_state(c, atoms[_NET_WM_STATE_ABOVE]))
|
||||||
|
client_drop_state(c, atoms[_NET_WM_STATE_ABOVE]);
|
||||||
|
else
|
||||||
|
client_add_state(c, atoms[_NET_WM_STATE_ABOVE]);
|
||||||
|
|
||||||
|
client_review(c);
|
||||||
|
client_raise(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void action_tag(void *data, int num)
|
||||||
|
{
|
||||||
|
client *c = window_client(current);
|
||||||
|
if (!c) return;
|
||||||
|
|
||||||
|
c->tags |= (unsigned int)num;
|
||||||
|
client_set_tags(c);
|
||||||
|
warnx("tags %d 0x%08lx %s", c->tags, (long)c->window, c->class);
|
||||||
|
}
|
||||||
|
|
||||||
|
void action_untag(void *data, int num)
|
||||||
|
{
|
||||||
|
client *c = window_client(current);
|
||||||
|
if (!c) return;
|
||||||
|
|
||||||
|
c->tags &= ~((unsigned int)num);
|
||||||
|
client_set_tags(c);
|
||||||
|
warnx("tags %d 0x%08lx %s", c->tags, (long)c->window, c->class);
|
||||||
|
}
|
||||||
|
|
||||||
|
// key actions
|
||||||
|
action actions[ACTIONS] = {
|
||||||
|
[ACTION_NONE] = NULL,
|
||||||
|
[ACTION_MOVE] = action_move,
|
||||||
|
[ACTION_FOCUS] = action_focus,
|
||||||
|
[ACTION_CYCLE] = action_cycle,
|
||||||
|
[ACTION_CLOSE] = action_close,
|
||||||
|
[ACTION_OTHER] = action_other,
|
||||||
|
[ACTION_COMMAND] = action_command,
|
||||||
|
[ACTION_FIND_OR_START] = action_find_or_start,
|
||||||
|
[ACTION_MOVE_MONITOR] = action_move_monitor,
|
||||||
|
[ACTION_FOCUS_MONITOR] = action_focus_monitor,
|
||||||
|
[ACTION_FULLSCREEN_TOGGLE] = action_fullscreen,
|
||||||
|
[ACTION_ABOVE_TOGGLE] = action_above,
|
||||||
|
[ACTION_TAG] = action_tag,
|
||||||
|
[ACTION_UNTAG] = action_untag,
|
||||||
|
[ACTION_RAISE_TAG] = action_raise_tag,
|
||||||
|
};
|
||||||
|
|
||||||
// ------- event handlers --------
|
// ------- event handlers --------
|
||||||
|
|
||||||
void create_notify(XCreateWindowEvent *e)
|
void create_notify(XCreateWindowEvent *e)
|
||||||
@@ -720,16 +867,12 @@ void unmap_notify(XUnmapEvent *e)
|
|||||||
|
|
||||||
void key_press(XKeyEvent *e)
|
void key_press(XKeyEvent *e)
|
||||||
{
|
{
|
||||||
int i; XEvent ev;
|
int i; XEvent ev; latest = e->time;
|
||||||
while (XCheckTypedEvent(display, KeyPress, &ev));
|
|
||||||
|
|
||||||
latest = e->time;
|
|
||||||
client *c = window_client(current);
|
|
||||||
|
|
||||||
short act = ACTION_NONE; void *data = NULL; int num = 0;
|
short act = ACTION_NONE; void *data = NULL; int num = 0;
|
||||||
KeySym key = XkbKeycodeToKeysym(display, e->keycode, 0, 0);
|
KeySym key = XkbKeycodeToKeysym(display, e->keycode, 0, 0);
|
||||||
unsigned int state = e->state & ~(LockMask|NumlockMask);
|
unsigned int state = e->state & ~(LockMask|NumlockMask);
|
||||||
unsigned long spot;
|
while (XCheckTypedEvent(display, KeyPress, &ev));
|
||||||
|
|
||||||
for (i = 0; i < sizeof(keys)/sizeof(binding); i++)
|
for (i = 0; i < sizeof(keys)/sizeof(binding); i++)
|
||||||
{
|
{
|
||||||
@@ -741,122 +884,8 @@ void key_press(XKeyEvent *e)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (c && c->visible)
|
if (actions[act])
|
||||||
{
|
actions[act](data, num);
|
||||||
switch (act)
|
|
||||||
{
|
|
||||||
case ACTION_MOVE_SPOT1:
|
|
||||||
client_raise(c);
|
|
||||||
client_spot(c, SPOT1, 1);
|
|
||||||
break;
|
|
||||||
case ACTION_MOVE_SPOT2:
|
|
||||||
client_raise(c);
|
|
||||||
client_spot(c, SPOT2, 1);
|
|
||||||
break;
|
|
||||||
case ACTION_MOVE_SPOT3:
|
|
||||||
client_raise(c);
|
|
||||||
client_spot(c, SPOT3, 1);
|
|
||||||
break;
|
|
||||||
case ACTION_CYCLE:
|
|
||||||
client_cycle(c);
|
|
||||||
break;
|
|
||||||
case ACTION_OTHER:
|
|
||||||
spot_active(c->spot, c->monitor, c->window);
|
|
||||||
break;
|
|
||||||
case ACTION_CLOSE:
|
|
||||||
client_close(c);
|
|
||||||
break;
|
|
||||||
case ACTION_MOVE_MONITOR_INC:
|
|
||||||
client_raise(c);
|
|
||||||
c->monitor = MIN(c->monitor+1, nmonitors-1);
|
|
||||||
client_spot(c, c->spot, 1);
|
|
||||||
break;
|
|
||||||
case ACTION_MOVE_MONITOR_DEC:
|
|
||||||
client_raise(c);
|
|
||||||
c->monitor = MAX(c->monitor-1, 0);
|
|
||||||
client_spot(c, c->spot, 1);
|
|
||||||
break;
|
|
||||||
case ACTION_FULLSCREEN_TOGGLE:
|
|
||||||
spot = c->spot;
|
|
||||||
client_raise(c);
|
|
||||||
if (client_state(c, atoms[_NET_WM_STATE_FULLSCREEN]))
|
|
||||||
{
|
|
||||||
client_drop_state(c, atoms[_NET_WM_STATE_FULLSCREEN]);
|
|
||||||
if (window_get_cardinal_prop(c->window, atoms[XOAT_SPOT], &spot, 1))
|
|
||||||
c->spot = spot;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
client_add_state(c, atoms[_NET_WM_STATE_FULLSCREEN]);
|
|
||||||
window_set_cardinal_prop(c->window, atoms[XOAT_SPOT], &spot, 1);
|
|
||||||
c->spot = SPOT1;
|
|
||||||
}
|
|
||||||
client_review(c);
|
|
||||||
client_spot(c, c->spot, 1);
|
|
||||||
break;
|
|
||||||
case ACTION_ABOVE_TOGGLE:
|
|
||||||
spot = c->spot;
|
|
||||||
client_raise(c);
|
|
||||||
if (client_state(c, atoms[_NET_WM_STATE_ABOVE]))
|
|
||||||
client_drop_state(c, atoms[_NET_WM_STATE_ABOVE]);
|
|
||||||
else
|
|
||||||
client_add_state(c, atoms[_NET_WM_STATE_ABOVE]);
|
|
||||||
client_review(c);
|
|
||||||
client_raise(c);
|
|
||||||
break;
|
|
||||||
case ACTION_TAG:
|
|
||||||
c->tags |= (unsigned int)num;
|
|
||||||
client_set_tags(c);
|
|
||||||
warnx("tags %d 0x%08lx %s", c->tags, (long)c->window, c->class);
|
|
||||||
break;
|
|
||||||
case ACTION_UNTAG:
|
|
||||||
c->tags &= ~((unsigned int)num);
|
|
||||||
client_set_tags(c);
|
|
||||||
warnx("tags %d 0x%08lx %s", c->tags, (long)c->window, c->class);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch (act)
|
|
||||||
{
|
|
||||||
case ACTION_FOCUS_SPOT1:
|
|
||||||
spot_active(SPOT1, current_mon, None);
|
|
||||||
break;
|
|
||||||
case ACTION_FOCUS_SPOT2:
|
|
||||||
spot_active(SPOT2, current_mon, None);
|
|
||||||
break;
|
|
||||||
case ACTION_FOCUS_SPOT3:
|
|
||||||
spot_active(SPOT3, current_mon, None);
|
|
||||||
break;
|
|
||||||
case ACTION_COMMAND:
|
|
||||||
exec_cmd(data);
|
|
||||||
break;
|
|
||||||
case ACTION_FIND_OR_START:
|
|
||||||
find_or_start(data);
|
|
||||||
break;
|
|
||||||
case ACTION_FOCUS_MONITOR_INC:
|
|
||||||
if (current_mon < nmonitors-1)
|
|
||||||
{
|
|
||||||
if (spot_active(current_spot, current_mon+1, None)) break;
|
|
||||||
if (spot_active(SPOT1, current_mon+1, None)) break;
|
|
||||||
if (spot_active(SPOT2, current_mon+1, None)) break;
|
|
||||||
if (spot_active(SPOT3, current_mon+1, None)) break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ACTION_FOCUS_MONITOR_DEC:
|
|
||||||
if (current_mon > 0)
|
|
||||||
{
|
|
||||||
if (spot_active(current_spot, current_mon-1, None)) break;
|
|
||||||
if (spot_active(SPOT1, current_mon-1, None)) break;
|
|
||||||
if (spot_active(SPOT2, current_mon-1, None)) break;
|
|
||||||
if (spot_active(SPOT3, current_mon-1, None)) break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ACTION_RAISE_TAG:
|
|
||||||
raise_tag(num);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
client_free(c);
|
|
||||||
ewmh_client_list();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void button_press(XButtonEvent *e)
|
void button_press(XButtonEvent *e)
|
||||||
|
|||||||
22
xoat.h
22
xoat.h
@@ -143,21 +143,15 @@ unsigned int NumlockMask = 0;
|
|||||||
|
|
||||||
enum {
|
enum {
|
||||||
ACTION_NONE,
|
ACTION_NONE,
|
||||||
ACTION_MOVE_SPOT1,
|
ACTION_MOVE,
|
||||||
ACTION_MOVE_SPOT2,
|
ACTION_FOCUS,
|
||||||
ACTION_MOVE_SPOT3,
|
|
||||||
ACTION_FOCUS_SPOT1,
|
|
||||||
ACTION_FOCUS_SPOT2,
|
|
||||||
ACTION_FOCUS_SPOT3,
|
|
||||||
ACTION_CYCLE,
|
ACTION_CYCLE,
|
||||||
ACTION_CLOSE,
|
ACTION_CLOSE,
|
||||||
ACTION_OTHER,
|
ACTION_OTHER,
|
||||||
ACTION_COMMAND,
|
ACTION_COMMAND,
|
||||||
ACTION_FIND_OR_START,
|
ACTION_FIND_OR_START,
|
||||||
ACTION_MOVE_MONITOR_INC,
|
ACTION_MOVE_MONITOR,
|
||||||
ACTION_MOVE_MONITOR_DEC,
|
ACTION_FOCUS_MONITOR,
|
||||||
ACTION_FOCUS_MONITOR_INC,
|
|
||||||
ACTION_FOCUS_MONITOR_DEC,
|
|
||||||
ACTION_FULLSCREEN_TOGGLE,
|
ACTION_FULLSCREEN_TOGGLE,
|
||||||
ACTION_ABOVE_TOGGLE,
|
ACTION_ABOVE_TOGGLE,
|
||||||
ACTION_TAG,
|
ACTION_TAG,
|
||||||
@@ -166,14 +160,14 @@ enum {
|
|||||||
ACTIONS
|
ACTIONS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef void (*action)(void*, int);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned int mod;
|
unsigned int mod;
|
||||||
KeySym key;
|
KeySym key;
|
||||||
short act;
|
short act;
|
||||||
union {
|
void *data;
|
||||||
void *data;
|
int num;
|
||||||
int num;
|
|
||||||
};
|
|
||||||
} binding;
|
} binding;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
|||||||
Reference in New Issue
Block a user