Allow different modifier keys for showing hidden i3bar.
This commit is contained in:
parent
f88c779457
commit
a3081c488a
|
@ -20,6 +20,7 @@ typedef enum {
|
||||||
|
|
||||||
typedef struct config_t {
|
typedef struct config_t {
|
||||||
int hide_on_modifier;
|
int hide_on_modifier;
|
||||||
|
int modifier;
|
||||||
position_t position;
|
position_t position;
|
||||||
int verbose;
|
int verbose;
|
||||||
struct xcb_color_strings_t colors;
|
struct xcb_color_strings_t colors;
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
#include <yajl/yajl_parse.h>
|
#include <yajl/yajl_parse.h>
|
||||||
#include <yajl/yajl_version.h>
|
#include <yajl/yajl_version.h>
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
static char *cur_key;
|
static char *cur_key;
|
||||||
|
@ -75,6 +77,41 @@ static int config_string_cb(void *params_, const unsigned char *val, unsigned in
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!strcmp(cur_key, "modifier")) {
|
||||||
|
DLOG("modifier = %.*s\n", len, val);
|
||||||
|
if (len == 5 && !strncmp((const char*)val, "shift", strlen("shift"))) {
|
||||||
|
config.modifier = ShiftMask;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (len == 4 && !strncmp((const char*)val, "ctrl", strlen("ctrl"))) {
|
||||||
|
config.modifier = ControlMask;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (len == 4 && !strncmp((const char*)val, "Mod", strlen("Mod"))) {
|
||||||
|
switch (val[3]) {
|
||||||
|
case '1':
|
||||||
|
config.modifier = Mod1Mask;
|
||||||
|
return 1;
|
||||||
|
case '2':
|
||||||
|
config.modifier = Mod2Mask;
|
||||||
|
return 1;
|
||||||
|
case '3':
|
||||||
|
config.modifier = Mod3Mask;
|
||||||
|
return 1;
|
||||||
|
/*
|
||||||
|
case '4':
|
||||||
|
config.modifier = Mod4Mask;
|
||||||
|
return 1;
|
||||||
|
*/
|
||||||
|
case '5':
|
||||||
|
config.modifier = Mod5Mask;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
config.modifier = Mod4Mask;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!strcmp(cur_key, "position")) {
|
if (!strcmp(cur_key, "position")) {
|
||||||
DLOG("position = %.*s\n", len, val);
|
DLOG("position = %.*s\n", len, val);
|
||||||
config.position = (len == 3 && !strncmp((const char*)val, "top", strlen("top")) ? POS_TOP : POS_BOT);
|
config.position = (len == 3 && !strncmp((const char*)val, "top", strlen("top")) ? POS_TOP : POS_BOT);
|
||||||
|
|
|
@ -684,19 +684,47 @@ void xkb_io_cb(struct ev_loop *loop, ev_io *watcher, int revents) {
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int mods = ev.state.mods;
|
unsigned int mods = ev.state.mods;
|
||||||
modstate = mods & Mod4Mask;
|
modstate = mods & config.modifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define DLOGMOD(modmask, status, barfunc) \
|
||||||
|
do { \
|
||||||
|
switch (modmask) { \
|
||||||
|
case ShiftMask: \
|
||||||
|
DLOG("ShiftMask got " #status "!\n"); \
|
||||||
|
break; \
|
||||||
|
case ControlMask: \
|
||||||
|
DLOG("ControlMask got " #status "!\n"); \
|
||||||
|
break; \
|
||||||
|
case Mod1Mask: \
|
||||||
|
DLOG("Mod1Mask got " #status "!\n"); \
|
||||||
|
break; \
|
||||||
|
case Mod2Mask: \
|
||||||
|
DLOG("Mod2Mask got " #status "!\n"); \
|
||||||
|
break; \
|
||||||
|
case Mod3Mask: \
|
||||||
|
DLOG("Mod3Mask got " #status "!\n"); \
|
||||||
|
break; \
|
||||||
|
case Mod4Mask: \
|
||||||
|
DLOG("Mod4Mask got " #status "!\n"); \
|
||||||
|
break; \
|
||||||
|
case Mod5Mask: \
|
||||||
|
DLOG("Mod5Mask got " #status "!\n"); \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
barfunc(); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
if (modstate != mod_pressed) {
|
if (modstate != mod_pressed) {
|
||||||
if (modstate == 0) {
|
if (modstate == 0) {
|
||||||
DLOG("Mod4 got released!\n");
|
DLOGMOD(config.modifier, released, hide_bars);
|
||||||
hide_bars();
|
|
||||||
} else {
|
} else {
|
||||||
DLOG("Mod4 got pressed!\n");
|
DLOGMOD(config.modifier, pressed, unhide_bars);
|
||||||
unhide_bars();
|
|
||||||
}
|
}
|
||||||
mod_pressed = modstate;
|
mod_pressed = modstate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef DLOGMOD
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -198,6 +198,18 @@ struct Barconfig {
|
||||||
/** Bar display mode (hide unless modifier is pressed or show in dock mode) */
|
/** Bar display mode (hide unless modifier is pressed or show in dock mode) */
|
||||||
enum { M_DOCK = 0, M_HIDE = 1 } mode;
|
enum { M_DOCK = 0, M_HIDE = 1 } mode;
|
||||||
|
|
||||||
|
/** Bar modifier (to show bar when in hide mode). */
|
||||||
|
enum {
|
||||||
|
M_NONE = 0,
|
||||||
|
M_CONTROL = 1,
|
||||||
|
M_SHIFT = 2,
|
||||||
|
M_MOD1 = 3,
|
||||||
|
M_MOD2 = 4,
|
||||||
|
M_MOD3 = 5,
|
||||||
|
M_MOD4 = 6,
|
||||||
|
M_MOD5 = 7
|
||||||
|
} modifier;
|
||||||
|
|
||||||
/** Bar position (bottom by default). */
|
/** Bar position (bottom by default). */
|
||||||
enum { P_BOTTOM = 0, P_TOP = 1 } position;
|
enum { P_BOTTOM = 0, P_TOP = 1 } position;
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,7 @@ EOL (\r?\n)
|
||||||
%x BUFFER_LINE
|
%x BUFFER_LINE
|
||||||
%x BAR
|
%x BAR
|
||||||
%x BAR_MODE
|
%x BAR_MODE
|
||||||
|
%x BAR_MODIFIER
|
||||||
%x BAR_POSITION
|
%x BAR_POSITION
|
||||||
%x BAR_COLORS
|
%x BAR_COLORS
|
||||||
%x BAR_COLOR
|
%x BAR_COLOR
|
||||||
|
@ -88,7 +89,7 @@ EOL (\r?\n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This part of the lexer handles the bar {} blocks */
|
/* This part of the lexer handles the bar {} blocks */
|
||||||
<BAR,BAR_MODE,BAR_POSITION,BAR_COLORS,BAR_COLOR>[ \t]+ { /* ignore whitespace */ ; }
|
<BAR,BAR_MODE,BAR_MODIFIER,BAR_POSITION,BAR_COLORS,BAR_COLOR>[ \t]+ { /* ignore whitespace */ ; }
|
||||||
<BAR>"{" { return '{'; }
|
<BAR>"{" { return '{'; }
|
||||||
<BAR>"}" { yy_pop_state(); return '}'; }
|
<BAR>"}" { yy_pop_state(); return '}'; }
|
||||||
<BAR>^[ \t]*#[^\n]* { return TOKCOMMENT; }
|
<BAR>^[ \t]*#[^\n]* { return TOKCOMMENT; }
|
||||||
|
@ -98,6 +99,15 @@ EOL (\r?\n)
|
||||||
<BAR>mode { yy_push_state(BAR_MODE); return TOK_BAR_MODE; }
|
<BAR>mode { yy_push_state(BAR_MODE); return TOK_BAR_MODE; }
|
||||||
<BAR_MODE>hide { yy_pop_state(); return TOK_BAR_HIDE; }
|
<BAR_MODE>hide { yy_pop_state(); return TOK_BAR_HIDE; }
|
||||||
<BAR_MODE>dock { yy_pop_state(); return TOK_BAR_DOCK; }
|
<BAR_MODE>dock { yy_pop_state(); return TOK_BAR_DOCK; }
|
||||||
|
<BAR>modifier { yy_push_state(BAR_MODIFIER); return TOK_BAR_MODIFIER; }
|
||||||
|
<BAR_MODIFIER>control { yy_pop_state(); return TOK_BAR_CONTROL; }
|
||||||
|
<BAR_MODIFIER>ctrl { yy_pop_state(); return TOK_BAR_CONTROL; }
|
||||||
|
<BAR_MODIFIER>shift { yy_pop_state(); return TOK_BAR_SHIFT; }
|
||||||
|
<BAR_MODIFIER>Mod1 { yy_pop_state(); return TOK_BAR_MOD1; }
|
||||||
|
<BAR_MODIFIER>Mod2 { yy_pop_state(); return TOK_BAR_MOD2; }
|
||||||
|
<BAR_MODIFIER>Mod3 { yy_pop_state(); return TOK_BAR_MOD3; }
|
||||||
|
<BAR_MODIFIER>Mod4 { yy_pop_state(); return TOK_BAR_MOD4; }
|
||||||
|
<BAR_MODIFIER>Mod5 { yy_pop_state(); return TOK_BAR_MOD5; }
|
||||||
<BAR>position { yy_push_state(BAR_POSITION); return TOK_BAR_POSITION; }
|
<BAR>position { yy_push_state(BAR_POSITION); return TOK_BAR_POSITION; }
|
||||||
<BAR_POSITION>bottom { yy_pop_state(); return TOK_BAR_BOTTOM; }
|
<BAR_POSITION>bottom { yy_pop_state(); return TOK_BAR_BOTTOM; }
|
||||||
<BAR_POSITION>top { yy_pop_state(); return TOK_BAR_TOP; }
|
<BAR_POSITION>top { yy_pop_state(); return TOK_BAR_TOP; }
|
||||||
|
@ -117,7 +127,7 @@ EOL (\r?\n)
|
||||||
<BAR_COLORS>inactive_workspace { BAR_DOUBLE_COLOR; return TOK_BAR_COLOR_INACTIVE_WORKSPACE; }
|
<BAR_COLORS>inactive_workspace { BAR_DOUBLE_COLOR; return TOK_BAR_COLOR_INACTIVE_WORKSPACE; }
|
||||||
<BAR_COLORS>urgent_workspace { BAR_DOUBLE_COLOR; return TOK_BAR_COLOR_URGENT_WORKSPACE; }
|
<BAR_COLORS>urgent_workspace { BAR_DOUBLE_COLOR; return TOK_BAR_COLOR_URGENT_WORKSPACE; }
|
||||||
<BAR_COLOR>#[0-9a-fA-F]+ { yy_pop_state(); yylval.string = sstrdup(yytext); return HEXCOLOR; }
|
<BAR_COLOR>#[0-9a-fA-F]+ { yy_pop_state(); yylval.string = sstrdup(yytext); return HEXCOLOR; }
|
||||||
<BAR,BAR_COLORS,BAR_MODE,BAR_POSITION>[a-zA-Z]+ { yylval.string = sstrdup(yytext); return WORD; }
|
<BAR,BAR_COLORS,BAR_MODE,BAR_MODIFIER,BAR_POSITION>[a-zA-Z]+ { yylval.string = sstrdup(yytext); return WORD; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -708,6 +708,14 @@ void parse_file(const char *f) {
|
||||||
%token TOK_BAR_MODE "mode (bar)"
|
%token TOK_BAR_MODE "mode (bar)"
|
||||||
%token TOK_BAR_HIDE "hide"
|
%token TOK_BAR_HIDE "hide"
|
||||||
%token TOK_BAR_DOCK "dock"
|
%token TOK_BAR_DOCK "dock"
|
||||||
|
%token TOK_BAR_MODIFIER "modifier (bar)"
|
||||||
|
%token TOK_BAR_CONTROL "shift (bar)"
|
||||||
|
%token TOK_BAR_SHIFT "control (bar)"
|
||||||
|
%token TOK_BAR_MOD1 "Mod1"
|
||||||
|
%token TOK_BAR_MOD2 "Mod2"
|
||||||
|
%token TOK_BAR_MOD3 "Mod3"
|
||||||
|
%token TOK_BAR_MOD4 "Mod4"
|
||||||
|
%token TOK_BAR_MOD5 "Mod5"
|
||||||
%token TOK_BAR_POSITION "position"
|
%token TOK_BAR_POSITION "position"
|
||||||
%token TOK_BAR_BOTTOM "bottom"
|
%token TOK_BAR_BOTTOM "bottom"
|
||||||
%token TOK_BAR_TOP "top"
|
%token TOK_BAR_TOP "top"
|
||||||
|
@ -748,6 +756,7 @@ void parse_file(const char *f) {
|
||||||
%type <number> popup_setting
|
%type <number> popup_setting
|
||||||
%type <number> bar_position_position
|
%type <number> bar_position_position
|
||||||
%type <number> bar_mode_mode
|
%type <number> bar_mode_mode
|
||||||
|
%type <number> bar_modifier_modifier
|
||||||
%type <number> optional_no_startup_id
|
%type <number> optional_no_startup_id
|
||||||
%type <string> command
|
%type <string> command
|
||||||
%type <string> word_or_number
|
%type <string> word_or_number
|
||||||
|
@ -1042,6 +1051,7 @@ barline:
|
||||||
| bar_tray_output
|
| bar_tray_output
|
||||||
| bar_position
|
| bar_position
|
||||||
| bar_mode
|
| bar_mode
|
||||||
|
| bar_modifier
|
||||||
| bar_font
|
| bar_font
|
||||||
| bar_workspace_buttons
|
| bar_workspace_buttons
|
||||||
| bar_verbose
|
| bar_verbose
|
||||||
|
@ -1119,6 +1129,23 @@ bar_mode_mode:
|
||||||
| TOK_BAR_DOCK { $$ = M_DOCK; }
|
| TOK_BAR_DOCK { $$ = M_DOCK; }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
bar_modifier:
|
||||||
|
TOK_BAR_MODIFIER bar_modifier_modifier
|
||||||
|
{
|
||||||
|
DLOG("modifier %d\n", $2);
|
||||||
|
current_bar.modifier = $2;
|
||||||
|
};
|
||||||
|
|
||||||
|
bar_modifier_modifier:
|
||||||
|
TOK_BAR_CONTROL { $$ = M_CONTROL; }
|
||||||
|
| TOK_BAR_SHIFT { $$ = M_SHIFT; }
|
||||||
|
| TOK_BAR_MOD1 { $$ = M_MOD1; }
|
||||||
|
| TOK_BAR_MOD2 { $$ = M_MOD2; }
|
||||||
|
| TOK_BAR_MOD3 { $$ = M_MOD3; }
|
||||||
|
| TOK_BAR_MOD4 { $$ = M_MOD4; }
|
||||||
|
| TOK_BAR_MOD5 { $$ = M_MOD5; }
|
||||||
|
;
|
||||||
|
|
||||||
bar_font:
|
bar_font:
|
||||||
TOK_BAR_FONT STR
|
TOK_BAR_FONT STR
|
||||||
{
|
{
|
||||||
|
|
30
src/ipc.c
30
src/ipc.c
|
@ -589,6 +589,36 @@ IPC_HANDLER(get_bar_config) {
|
||||||
ystr("hide");
|
ystr("hide");
|
||||||
else ystr("dock");
|
else ystr("dock");
|
||||||
|
|
||||||
|
ystr("modifier");
|
||||||
|
switch (config->modifier) {
|
||||||
|
case M_CONTROL:
|
||||||
|
ystr("ctrl");
|
||||||
|
break;
|
||||||
|
case M_SHIFT:
|
||||||
|
ystr("shift");
|
||||||
|
break;
|
||||||
|
case M_MOD1:
|
||||||
|
ystr("Mod1");
|
||||||
|
break;
|
||||||
|
case M_MOD2:
|
||||||
|
ystr("Mod2");
|
||||||
|
break;
|
||||||
|
case M_MOD3:
|
||||||
|
ystr("Mod3");
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
case M_MOD4:
|
||||||
|
ystr("Mod4");
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
case M_MOD5:
|
||||||
|
ystr("Mod5");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ystr("Mod4");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
ystr("position");
|
ystr("position");
|
||||||
if (config->position == P_BOTTOM)
|
if (config->position == P_BOTTOM)
|
||||||
ystr("bottom");
|
ystr("bottom");
|
||||||
|
|
Loading…
Reference in New Issue