fix a few issues, add in mouse bindings

This commit is contained in:
speedie 2023-04-25 16:42:15 +02:00
parent ad32165408
commit 54797235e1
6 changed files with 470 additions and 314 deletions

View file

@ -213,373 +213,407 @@ spmenu =
password = 0; password = 0;
} ); } );
// Mouse
mouse = ( { click = "clickinput";
modifier = "None";
button = "left-click";
function = "clear";
argument = "0";
},
{ click = "clickprompt";
modifier = "None";
button = "left-click";
function = "clear";
argument = "0";
},
{ click = "clickmode";
modifier = "None";
button = "left-click";
function = "switchmode";
argument = "0";
},
{ click = "clicknumber";
modifier = "None";
button = "left-click";
function = "viewhist";
argument = "0";
},
{ click = "clickselitem";
modifier = "None";
button = "left-click";
function = "None";
argument = "0";
},
{ ignoreglobalmouse = 1; } );
// Keys // Keys
keys = ( { mode = -1; keys = ( { mode = -1;
modifier = "None"; modifier = "None";
key = "Enter"; key = "Enter";
function = "selectitem"; function = "selectitem";
argument = "+1"; argument = "+1";
} },
{ mode = -1; { mode = -1;
modifier = "Shift"; modifier = "Shift";
key = "Enter"; key = "Enter";
function = "selectitem"; function = "selectitem";
argument = "0"; argument = "0";
} },
{ mode = -1; { mode = -1;
modifier = "None"; modifier = "None";
key = "Tab"; key = "Tab";
function = "complete"; function = "complete";
argument = "0"; argument = "0";
} },
{ mode = -1; { mode = -1;
modifier = "Ctrl"; modifier = "Ctrl";
key = "v"; key = "v";
function = "paste"; function = "paste";
argument = "2"; argument = "2";
} },
{ mode = -1; { mode = -1;
modifier = "Ctrl+Shift"; modifier = "Ctrl+Shift";
key = "v"; key = "v";
function = "paste"; function = "paste";
argument = "1"; argument = "1";
} },
{ mode = -1; { mode = -1;
modifier = "None"; modifier = "None";
key = "Backspace"; key = "Backspace";
function = "backspace"; function = "backspace";
argument = "0"; argument = "0";
} },
{ mode = -1; { mode = -1;
modifier = "Ctrl"; modifier = "Ctrl";
key = "Backspace"; key = "Backspace";
function = "deleteword"; function = "deleteword";
argument = "0"; argument = "0";
} },
{ mode = -1; { mode = -1;
modifier = "Ctrl"; modifier = "Ctrl";
key = "Left"; key = "Left";
function = "moveword"; function = "moveword";
argument = "-1"; argument = "-1";
} },
{ mode = -1; { mode = -1;
modifier = "Ctrl"; modifier = "Ctrl";
key = "Right"; key = "Right";
function = "moveword"; function = "moveword";
argument = "+1"; argument = "+1";
} },
{ mode = -1; { mode = -1;
modifier = "None"; modifier = "None";
key = "Left"; key = "Left";
function = "movecursor"; function = "movecursor";
argument = "-1"; argument = "-1";
} },
{ mode = -1; { mode = -1;
modifier = "None"; modifier = "None";
key = "Right"; key = "Right";
function = "movecursor"; function = "movecursor";
argument = "+1"; argument = "+1";
} },
{ mode = -1; { mode = -1;
modifier = "Control+Shift"; modifier = "Control+Shift";
key = "p"; key = "p";
function = "spawn"; function = "spawn";
argument = "setprofile"; argument = "setprofile";
} },
{ mode = 1; { mode = 1;
modifier = "None"; modifier = "None";
key = "Esc"; key = "Esc";
function = "switchmode"; function = "switchmode";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "i"; key = "i";
function = "switchmode"; function = "switchmode";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "/"; key = "/";
function = "switchmode"; function = "switchmode";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl"; modifier = "Ctrl";
key = "="; key = "=";
function = "setimgsize"; function = "setimgsize";
argument = "+1"; argument = "+1";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl"; modifier = "Ctrl";
key = "-"; key = "-";
function = "setimgsize"; function = "setimgsize";
argument = "-1"; argument = "-1";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "-"; key = "-";
function = "setimgsize"; function = "setimgsize";
argument = "-10"; argument = "-10";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "="; key = "=";
function = "setimgsize"; function = "setimgsize";
argument = "+10"; argument = "+10";
} },
{ mode = 0; { mode = 0;
modifier = "Shift"; modifier = "Shift";
key = "-"; key = "-";
function = "setimgsize"; function = "setimgsize";
argument = "-100"; argument = "-100";
} },
{ mode = 0; { mode = 0;
modifier = "Shift"; modifier = "Shift";
key = "="; key = "=";
function = "setimgsize"; function = "setimgsize";
argument = "+100"; argument = "+100";
} },
{ mode = 0; { mode = 0;
modifier = "Shift"; modifier = "Shift";
key = "0"; key = "0";
function = "defaultimg"; function = "defaultimg";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "r"; key = "r";
function = "rotateimg"; function = "rotateimg";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "p"; key = "p";
function = "setimgpos"; function = "setimgpos";
argument = "+1"; argument = "+1";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl"; modifier = "Ctrl";
key = "1"; key = "1";
function = "setimggaps"; function = "setimggaps";
argument = "-1"; argument = "-1";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl"; modifier = "Ctrl";
key = "2"; key = "2";
function = "setimggaps"; function = "setimggaps";
argument = "+1"; argument = "+1";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "1"; key = "1";
function = "setimggaps"; function = "setimggaps";
argument = "-10"; argument = "-10";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "2"; key = "2";
function = "setimggaps"; function = "setimggaps";
argument = "+10"; argument = "+10";
} },
{ mode = 0; { mode = 0;
modifier = "Shift"; modifier = "Shift";
key = "1"; key = "1";
function = "setimggaps"; function = "setimggaps";
argument = "-100"; argument = "-100";
} },
{ mode = 0; { mode = 0;
modifier = "Shift"; modifier = "Shift";
key = "2"; key = "2";
function = "setimggaps"; function = "setimggaps";
argument = "+100"; argument = "+100";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "t"; key = "t";
function = "toggleimg"; function = "toggleimg";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "h"; key = "h";
function = "flipimg"; function = "flipimg";
argument = "1"; argument = "1";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "v"; key = "v";
function = "flipimg"; function = "flipimg";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "k"; key = "k";
function = "moveup"; function = "moveup";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "j"; key = "j";
function = "movedown"; function = "movedown";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "h"; key = "h";
function = "moveleft"; function = "moveleft";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "l"; key = "l";
function = "moveright"; function = "moveright";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl"; modifier = "Ctrl";
key = "u"; key = "u";
function = "moveup"; function = "moveup";
argument = "5"; argument = "5";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl"; modifier = "Ctrl";
key = "d"; key = "d";
function = "movedown"; function = "movedown";
argument = "5"; argument = "5";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl"; modifier = "Ctrl";
key = "k"; key = "k";
function = "setlines"; function = "setlines";
argument = "+1"; argument = "+1";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl"; modifier = "Ctrl";
key = "j"; key = "j";
function = "setlines"; function = "setlines";
argument = "-1"; argument = "-1";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl+Alt+Shift"; modifier = "Ctrl+Alt+Shift";
key = "k"; key = "k";
function = "setlines"; function = "setlines";
argument = "+5"; argument = "+5";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl+Alt+Shift"; modifier = "Ctrl+Alt+Shift";
key = "j"; key = "j";
function = "setlines"; function = "setlines";
argument = "-5"; argument = "-5";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl"; modifier = "Ctrl";
key = "h"; key = "h";
function = "setcolumns"; function = "setcolumns";
argument = "+1"; argument = "+1";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl"; modifier = "Ctrl";
key = "h"; key = "h";
function = "setcolumns"; function = "setcolumns";
argument = "-1"; argument = "-1";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl+Alt+Shift"; modifier = "Ctrl+Alt+Shift";
key = "h"; key = "h";
function = "setcolumns"; function = "setcolumns";
argument = "+5"; argument = "+5";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl+Alt+Shift"; modifier = "Ctrl+Alt+Shift";
key = "l"; key = "l";
function = "setcolumns"; function = "setcolumns";
argument = "-5"; argument = "-5";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl"; modifier = "Ctrl";
key = "k"; key = "k";
function = "restoresel"; function = "restoresel";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "u"; key = "u";
function = "togglehighlight"; function = "togglehighlight";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "Ctrl+Shift"; modifier = "Ctrl+Shift";
key = "h"; key = "h";
function = "viewhist"; function = "viewhist";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "d"; key = "d";
function = "clear"; function = "clear";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "c"; key = "c";
function = "clearins"; function = "clearins";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "Esc"; key = "Esc";
function = "quit"; function = "quit";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "Home"; key = "Home";
function = "movestart"; function = "movestart";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "End"; key = "End";
function = "moveend"; function = "moveend";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "g"; key = "g";
function = "movestart"; function = "movestart";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "Shift"; modifier = "Shift";
key = "g"; key = "g";
function = "moveend"; function = "moveend";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "Next"; key = "Next";
function = "movenext"; function = "movenext";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "None"; modifier = "None";
key = "Prior"; key = "Prior";
function = "moveprev"; function = "moveprev";
argument = "0"; argument = "0";
} },
{ mode = 0; { mode = 0;
modifier = "Alt"; modifier = "Alt";
key = "p"; key = "p";
function = "navhistory"; function = "navhistory";
argument = "-1"; argument = "-1";
} },
{ mode = 0; { mode = 0;
modifier = "Alt"; modifier = "Alt";
key = "n"; key = "n";
function = "navhistory"; function = "navhistory";
argument = "+1"; argument = "+1";
} },
ignoreglobalkeys = 1; ), { ignoreglobalkeys = 1; } ),
}; };

View file

@ -55,7 +55,7 @@ conf_init(void)
// attempt to read config file to cfg // attempt to read config file to cfg
if (!config_read_file(&cfg, cfgfile)) { if (!config_read_file(&cfg, cfgfile)) {
// invalid configuration, but let's try to read it anyway // invalid configuration, but let's try to read it anyway
; fprintf(stdout, "spmenu: Invalid configuration.\n");
} }
// load options spmenu.window // load options spmenu.window
@ -620,6 +620,62 @@ conf_init(void)
} }
} }
// load options spmenu.keys
setting = config_lookup(&cfg, "spmenu.mouse");
if (setting != NULL) {
unsigned int i = 0;
conflength = config_setting_length(setting);
for (i = 0; i < conflength; ++i) {
config_setting_t *conf = config_setting_get_elem(setting, i);
// look up
config_setting_lookup_string(conf, "click", &dest);
for (int j = 0; j < LENGTH(ctp); j++) {
if (!strcmp(ctp[j].tclick, strdup(dest))) {
cbuttons[i].click = ctp[j].click;
}
}
// look up
config_setting_lookup_string(conf, "modifier", &dest);
for (int j = 0; j < LENGTH(ml); j++) {
if (!strcmp(ml[j].mod, strdup(dest))) {
cbuttons[i].mask = ml[j].modifier;
}
}
config_setting_lookup_string(conf, "button", &dest);
for (int j = 0; j < LENGTH(btp); j++) {
if (!strcmp(btp[j].click, strdup(dest))) {
cbuttons[i].button = btp[j].button;
}
}
config_setting_lookup_string(conf, "function", &dest);
for (int j = 0; j < LENGTH(fl); j++) {
if (!strcmp(fl[j].function, strdup(dest))) {
cbuttons[i].func = fl[j].func;
}
}
config_setting_lookup_string(conf, "argument", &dest);
for (int j = 0; j < LENGTH(al); j++) {
if (!strcmp(al[j].argument, strdup(dest))) {
cbuttons[i].arg = al[j].arg;
}
}
config_setting_lookup_int(conf, "ignoreglobalmouse", &ignoreglobalmouse);
}
}
// we're done here // we're done here
config_destroy(&cfg); config_destroy(&cfg);
return; return;

View file

@ -422,8 +422,8 @@ static KeyList kl[] = {
{ "g", XK_g }, { "g", XK_g },
{ "h", XK_h }, { "h", XK_h },
{ "i", XK_i }, { "i", XK_i },
{ "j", XK_k }, { "j", XK_j },
{ "k", XK_j }, { "k", XK_k },
{ "l", XK_l }, { "l", XK_l },
{ "m", XK_m }, { "m", XK_m },
{ "n", XK_n }, { "n", XK_n },

View file

@ -73,6 +73,14 @@ buttonpress(XEvent *e)
} else if (buttons[i].click == clickitem) { } else if (buttons[i].click == clickitem) {
click = clickitem; click = clickitem;
} }
}
for (i = 0; i < LENGTH(cbuttons); i++) {
if (cbuttons[i].click == clickselitem && cbuttons[i].button == ev->button && CLEANMASK(cbuttons[i].mask) == CLEANMASK(ev->state)) {
puts(item->text);
exit(0);
} else if (cbuttons[i].click == clickitem) {
click = clickitem;
}
} }
} }
} }
@ -99,6 +107,14 @@ buttonpress(XEvent *e)
click = clickitem; click = clickitem;
} }
} }
for (i = 0; i < LENGTH(cbuttons); i++) {
if (cbuttons[i].click == clickselitem && cbuttons[i].button == ev->button && CLEANMASK(cbuttons[i].mask) == CLEANMASK(ev->state)) {
puts(item->text);
exit(0);
} else if (cbuttons[i].click == clickitem) {
click = clickitem;
}
}
} }
} }
@ -111,8 +127,18 @@ buttonpress(XEvent *e)
} }
// go through mouse button array and run function // go through mouse button array and run function
for (i = 0; i < LENGTH(buttons); i++) for (i = 0; i < LENGTH(buttons); i++) {
if (ignoreglobalmouse) break;
if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button
&& CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
buttons[i].func(&buttons[i].arg); buttons[i].func(&buttons[i].arg);
}
// go through mouse config array and run function
for (i = 0; i < LENGTH(cbuttons); i++) {
if (ignoreconfmouse) break;
if (click == cbuttons[i].click && cbuttons[i].func && cbuttons[i].button == ev->button
&& CLEANMASK(cbuttons[i].mask) == CLEANMASK(ev->state))
cbuttons[i].func(&cbuttons[i].arg);
}
} }

View file

@ -1,11 +1,3 @@
typedef struct {
unsigned int click;
unsigned int mask;
unsigned int button;
void (*func)(Arg *arg);
Arg arg;
} Mouse;
// clicks // clicks
enum { enum {
clickwindow, clickwindow,
@ -20,4 +12,50 @@ enum {
clickmode, clickmode,
}; };
typedef struct {
unsigned int click;
unsigned int mask;
unsigned int button;
void (*func)(Arg *arg);
Arg arg;
} Mouse;
typedef struct {
char *click;
unsigned int button;
} ButtonType;
typedef struct {
char *tclick;
unsigned int click;
} ClickType;
static ButtonType btp[] = {
{ "button1", Button1 },
{ "button2", Button2 },
{ "button3", Button3 },
{ "button4", Button4 },
{ "button5", Button5 },
{ "left-click", Button1 },
{ "middle-click", Button2 },
{ "right-click", Button3 },
{ "scroll-up", Button4 },
{ "scroll-down", Button5 },
};
static ClickType ctp[] = {
{ "clickwindow", clickwindow },
{ "clickprompt", clickprompt },
{ "clickinput", clickinput },
{ "clicklarrow", clicklarrow },
{ "clickitem", clickitem },
{ "clickselitem", clickselitem },
{ "clickrarrow", clickrarrow },
{ "clicknumber", clicknumber },
{ "clickcaps", clickcaps },
{ "clickmode", clickmode },
};
static Mouse cbuttons[256];
static void buttonpress(XEvent *e); static void buttonpress(XEvent *e);

View file

@ -177,6 +177,8 @@ static int isrtl = 0;
static int ignoreconfkeys = 0; // can be set globally if you don't want to override keybinds with config file keys static int ignoreconfkeys = 0; // can be set globally if you don't want to override keybinds with config file keys
static int ignoreglobalkeys = 0; // should be set in the config file, if 1, the Keys keys array is ignored static int ignoreglobalkeys = 0; // should be set in the config file, if 1, the Keys keys array is ignored
static int ignoreconfmouse = 0; // same for mouse
static int ignoreglobalmouse = 0; // same for mouse
// X11 properties // X11 properties
static Atom clip, utf8, types, dock; static Atom clip, utf8, types, dock;