no focus for autostick windows, fix unhide with SHOWSTICK
This commit is contained in:
parent
bb3cc4a2ac
commit
d06638a1eb
8 changed files with 114 additions and 28 deletions
28
client.c
28
client.c
|
@ -8,6 +8,7 @@
|
||||||
#include <X11/Xutil.h>
|
#include <X11/Xutil.h>
|
||||||
#include "dat.h"
|
#include "dat.h"
|
||||||
#include "fns.h"
|
#include "fns.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
Client *clients;
|
Client *clients;
|
||||||
Client *current;
|
Client *current;
|
||||||
|
@ -62,12 +63,17 @@ active(Client *c)
|
||||||
{
|
{
|
||||||
Client *cc;
|
Client *cc;
|
||||||
|
|
||||||
|
|
||||||
if(c == 0){
|
if(c == 0){
|
||||||
fprintf(stderr, "ryudo: active(c==0)\n");
|
fprintf(stderr, "ryudo: active(c==0)\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(c == current)
|
if(c == current)
|
||||||
return;
|
return;
|
||||||
|
#ifdef AUTOSTICK
|
||||||
|
if (isautostick(c))
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
if(current){
|
if(current){
|
||||||
setactive(current, 0);
|
setactive(current, 0);
|
||||||
if(current->screen != c->screen)
|
if(current->screen != c->screen)
|
||||||
|
@ -262,8 +268,13 @@ shuffle(int up)
|
||||||
/*for(c=clients; c->next; c=c->next) */
|
/*for(c=clients; c->next; c=c->next) */
|
||||||
/* ; */
|
/* ; */
|
||||||
for(l=&clients; (*l)->next; l=&(*l)->next)
|
for(l=&clients; (*l)->next; l=&(*l)->next)
|
||||||
|
#ifdef AUTOSTICK
|
||||||
|
if ((*l)->state == 1 && !isautostick(*l))
|
||||||
|
c = *l;
|
||||||
|
#else
|
||||||
if ((*l)->state == 1)
|
if ((*l)->state == 1)
|
||||||
c = *l;
|
c = *l;
|
||||||
|
#endif
|
||||||
if (c == 0)
|
if (c == 0)
|
||||||
return;
|
return;
|
||||||
XMapRaised(dpy, c->parent);
|
XMapRaised(dpy, c->parent);
|
||||||
|
@ -283,3 +294,20 @@ shuffle(int up)
|
||||||
/* active(clients); */
|
/* active(clients); */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef AUTOSTICK
|
||||||
|
int
|
||||||
|
isautostick(Client *c)
|
||||||
|
{
|
||||||
|
static char *autostick[] = AUTOSTICK;
|
||||||
|
char **a = autostick;
|
||||||
|
|
||||||
|
while(*a){
|
||||||
|
if(strstr(c->class, *a)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
++a;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
20
config.h
20
config.h
|
@ -18,8 +18,22 @@
|
||||||
/* Notify on virtual desktop switch? */
|
/* Notify on virtual desktop switch? */
|
||||||
#define VIRTNOTIFY
|
#define VIRTNOTIFY
|
||||||
|
|
||||||
|
/* The summary and message to pass to the notifcation daeomon */
|
||||||
|
#define VIRTHEADER "virtual"
|
||||||
|
#define VIRTMSG "[%s]"
|
||||||
|
|
||||||
|
/* Deny focus to autostuck windows? (eg xosview, clock) */
|
||||||
|
#define NOFOCUS
|
||||||
|
|
||||||
/* Modifier key and associated modifier bits;
|
/* Modifier key and associated modifier bits;
|
||||||
* See xkb documentation for valid choices here
|
* Shift = (1<<0)
|
||||||
|
* Lock = (1<<1)
|
||||||
|
* Control = (1<<2)
|
||||||
|
* Mod1 = (1<<3)
|
||||||
|
* Mod2 = (1<<4)
|
||||||
|
* Mod3 = (1<<5)
|
||||||
|
* Mod4 = (1<<6)
|
||||||
|
* Mod5 = (1<<7)
|
||||||
*/
|
*/
|
||||||
#define SHORTCUTMOD Mod4Mask
|
#define SHORTCUTMOD Mod4Mask
|
||||||
#define MODBITS (1<<6)
|
#define MODBITS (1<<6)
|
||||||
|
@ -34,6 +48,9 @@
|
||||||
#define DESTROY_KEY XK_d
|
#define DESTROY_KEY XK_d
|
||||||
#define STICK_KEY XK_s
|
#define STICK_KEY XK_s
|
||||||
|
|
||||||
|
#define STICKYTOFRONT_KEY XK_t
|
||||||
|
#define STICKYTOBACK_KEY XK_b
|
||||||
|
|
||||||
#define SNAPLEFT_KEY XK_h
|
#define SNAPLEFT_KEY XK_h
|
||||||
#define SNAPRIGHT_KEY XK_l
|
#define SNAPRIGHT_KEY XK_l
|
||||||
#define SNAPTOP_KEY XK_k
|
#define SNAPTOP_KEY XK_k
|
||||||
|
@ -59,6 +76,7 @@
|
||||||
|
|
||||||
#define AUTOSTICK {\
|
#define AUTOSTICK {\
|
||||||
"XOsview",\
|
"XOsview",\
|
||||||
|
"XClock",\
|
||||||
0\
|
0\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
8
event.c
8
event.c
|
@ -15,6 +15,7 @@
|
||||||
#include "dat.h"
|
#include "dat.h"
|
||||||
#include "fns.h"
|
#include "fns.h"
|
||||||
#include "patchlevel.h"
|
#include "patchlevel.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
mainloop(int shape_event)
|
mainloop(int shape_event)
|
||||||
|
@ -23,7 +24,6 @@ mainloop(int shape_event)
|
||||||
|
|
||||||
for(;;){
|
for(;;){
|
||||||
getevent(&ev);
|
getevent(&ev);
|
||||||
|
|
||||||
#ifdef DEBUG_EV
|
#ifdef DEBUG_EV
|
||||||
if(debug){
|
if(debug){
|
||||||
ShowEvent(&ev);
|
ShowEvent(&ev);
|
||||||
|
@ -537,10 +537,16 @@ focusin(XFocusChangeEvent *e)
|
||||||
return;
|
return;
|
||||||
c = getclient(e->window, 0);
|
c = getclient(e->window, 0);
|
||||||
if(c != 0 && c->window == e->window && c != current){
|
if(c != 0 && c->window == e->window && c != current){
|
||||||
|
#ifdef AUTOSTICK
|
||||||
|
if (isautostick(c)){
|
||||||
|
#endif
|
||||||
/* someone grabbed keyboard or seized focus; make them current */
|
/* someone grabbed keyboard or seized focus; make them current */
|
||||||
XMapRaised(dpy, c->parent);
|
XMapRaised(dpy, c->parent);
|
||||||
top(c);
|
top(c);
|
||||||
active(c);
|
active(c);
|
||||||
|
#ifdef AUTOSTICK
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
4
fns.h
4
fns.h
|
@ -65,7 +65,8 @@ void gettrans();
|
||||||
void keypress();
|
void keypress();
|
||||||
void keyrelease();
|
void keyrelease();
|
||||||
void keysetup();
|
void keysetup();
|
||||||
void quickreshape();
|
void quickreshape(Client *c, int x, int y, int dx, int dy);
|
||||||
|
void stickystack(int);
|
||||||
|
|
||||||
/* menu.c */
|
/* menu.c */
|
||||||
void button();
|
void button();
|
||||||
|
@ -95,6 +96,7 @@ void rmclient();
|
||||||
void dump_revert();
|
void dump_revert();
|
||||||
void dump_clients();
|
void dump_clients();
|
||||||
void shuffle(int);
|
void shuffle(int);
|
||||||
|
int isautostick(Client* c);
|
||||||
|
|
||||||
/* grab.c */
|
/* grab.c */
|
||||||
int menuhit();
|
int menuhit();
|
||||||
|
|
39
key.c
39
key.c
|
@ -30,7 +30,6 @@ enum
|
||||||
/*static int pgdowncode = 0x69; */
|
/*static int pgdowncode = 0x69; */
|
||||||
|
|
||||||
static void alttab(int shift);
|
static void alttab(int shift);
|
||||||
void quickreshape(Client*c, int x, int y, int dx, int dy);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
keysetup(void)
|
keysetup(void)
|
||||||
|
@ -56,6 +55,10 @@ keysetup(void)
|
||||||
int slcode = XKeysymToKeycode(dpy, LAUNCH_KEY);
|
int slcode = XKeysymToKeycode(dpy, LAUNCH_KEY);
|
||||||
int rightcode = XKeysymToKeycode(dpy, NEXTVIRT_KEY);
|
int rightcode = XKeysymToKeycode(dpy, NEXTVIRT_KEY);
|
||||||
int leftcode = XKeysymToKeycode(dpy, PREVVIRT_KEY);
|
int leftcode = XKeysymToKeycode(dpy, PREVVIRT_KEY);
|
||||||
|
#ifdef DEVEL
|
||||||
|
int tcode = XKeysymToKeycode(dpy, STICKYTOFRONT_KEY);
|
||||||
|
int bcode = XKeysymToKeycode(dpy, STICKYTOBACK_KEY);
|
||||||
|
#endif
|
||||||
|
|
||||||
for(i=0; i<num_screens; i++){
|
for(i=0; i<num_screens; i++){
|
||||||
XGrabKey(dpy, tabcode, Mod1Mask, screens[i].root, 0, GrabModeSync, GrabModeAsync);
|
XGrabKey(dpy, tabcode, Mod1Mask, screens[i].root, 0, GrabModeSync, GrabModeAsync);
|
||||||
|
@ -79,6 +82,10 @@ keysetup(void)
|
||||||
XGrabKey(dpy, rightcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
|
XGrabKey(dpy, rightcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
|
||||||
XGrabKey(dpy, slcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
|
XGrabKey(dpy, slcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
|
||||||
XGrabKey(dpy, tabcode, Mod1Mask|ShiftMask, screens[i].root, 0, GrabModeSync, GrabModeAsync);
|
XGrabKey(dpy, tabcode, Mod1Mask|ShiftMask, screens[i].root, 0, GrabModeSync, GrabModeAsync);
|
||||||
|
#ifdef DEVEL
|
||||||
|
XGrabKey(dpy, tcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
|
||||||
|
XGrabKey(dpy, bcode, SHORTCUTMOD, screens[i].root, 0, GrabModeSync, GrabModeAsync);
|
||||||
|
#endif
|
||||||
/* XGrabKey(dpy, pgupcode, Mod1Mask, screens[i].root, 0, GrabModeSync, GrabModeAsync); */
|
/* XGrabKey(dpy, pgupcode, Mod1Mask, screens[i].root, 0, GrabModeSync, GrabModeAsync); */
|
||||||
/* XGrabKey(dpy, pgdowncode, Mod1Mask, screens[i].root, 0, GrabModeSync, GrabModeAsync); */
|
/* XGrabKey(dpy, pgdowncode, Mod1Mask, screens[i].root, 0, GrabModeSync, GrabModeAsync); */
|
||||||
/* XGrabKey(dpy, altcode, 0, screens[i].root, 0, GrabModeSync, GrabModeAsync); */
|
/* XGrabKey(dpy, altcode, 0, screens[i].root, 0, GrabModeSync, GrabModeAsync); */
|
||||||
|
@ -111,6 +118,10 @@ keypress(XKeyEvent *e)
|
||||||
int ccode = XKeysymToKeycode(dpy, SNAPCENTER_KEY);
|
int ccode = XKeysymToKeycode(dpy, SNAPCENTER_KEY);
|
||||||
int rightcode = XKeysymToKeycode(dpy, NEXTVIRT_KEY);
|
int rightcode = XKeysymToKeycode(dpy, NEXTVIRT_KEY);
|
||||||
int leftcode = XKeysymToKeycode(dpy, PREVVIRT_KEY);
|
int leftcode = XKeysymToKeycode(dpy, PREVVIRT_KEY);
|
||||||
|
#ifdef DEVEL
|
||||||
|
int tcode = XKeysymToKeycode(dpy, STICKYTOFRONT_KEY);
|
||||||
|
int bcode = XKeysymToKeycode(dpy, STICKYTOBACK_KEY);
|
||||||
|
#endif
|
||||||
|
|
||||||
static XWindowAttributes ra;
|
static XWindowAttributes ra;
|
||||||
XGetWindowAttributes(dpy, DefaultRootWindow(dpy), &ra);
|
XGetWindowAttributes(dpy, DefaultRootWindow(dpy), &ra);
|
||||||
|
@ -158,6 +169,14 @@ keypress(XKeyEvent *e)
|
||||||
if (e->keycode == ccode && (e->state&SHORTCUTMOD) == (MODBITS))
|
if (e->keycode == ccode && (e->state&SHORTCUTMOD) == (MODBITS))
|
||||||
quickreshape(current, ra.width/5, ra.height/5, 3*ra.width/5, 3*ra.height/5);
|
quickreshape(current, ra.width/5, ra.height/5, 3*ra.width/5, 3*ra.height/5);
|
||||||
|
|
||||||
|
#ifdef DEVEL
|
||||||
|
/* manage autostuck windows */
|
||||||
|
if (e->keycode == tcode && (e->state&SHORTCUTMOD) == (MODBITS))
|
||||||
|
stickystack(1);
|
||||||
|
if (e->keycode == bcode && (e->state&SHORTCUTMOD) == (MODBITS))
|
||||||
|
stickystack(0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* launch */
|
/* launch */
|
||||||
if (e->keycode == slcode && (e->state&SHORTCUTMOD) == (MODBITS)){
|
if (e->keycode == slcode && (e->state&SHORTCUTMOD) == (MODBITS)){
|
||||||
|
@ -226,3 +245,21 @@ alttab(int shift)
|
||||||
/* fprintf(stderr, "%sTab\n", shift ? "Back" : ""); */
|
/* fprintf(stderr, "%sTab\n", shift ? "Back" : ""); */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DEVEL
|
||||||
|
void
|
||||||
|
stickystack(int toTop)
|
||||||
|
{
|
||||||
|
Client *c;
|
||||||
|
if(toTop){
|
||||||
|
for(c = clients; c->next; c = c->next){
|
||||||
|
if(c && isautostick(c))
|
||||||
|
top(c);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
for(c = clients; c->next; c = c->next){
|
||||||
|
if(c && !isautostick(c))
|
||||||
|
top(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
2
main.c
2
main.c
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
char *version[] =
|
char *version[] =
|
||||||
{
|
{
|
||||||
"ryudo version 0.2\nCopyright (c) 1994-1996 David Hogan,\n(c) 2004 Russ Cox,\n(c) 2019-2021 Derek Stevens", 0
|
"ryudo version 0.3\nCopyright (c) 1994-1996 David Hogan,\n(c) 2004 Russ Cox,\n(c) 2019-2021 Derek Stevens", 0
|
||||||
};
|
};
|
||||||
|
|
||||||
Display *dpy;
|
Display *dpy;
|
||||||
|
|
6
manage.c
6
manage.c
|
@ -29,7 +29,6 @@ manage(Client *c, int mapped)
|
||||||
XClassHint class;
|
XClassHint class;
|
||||||
XWMHints *hints;
|
XWMHints *hints;
|
||||||
XSetWindowAttributes attrs;
|
XSetWindowAttributes attrs;
|
||||||
|
|
||||||
trace("manage", c, 0);
|
trace("manage", c, 0);
|
||||||
XSelectInput(dpy, c->window, ColormapChangeMask | EnterWindowMask | PropertyChangeMask | FocusChangeMask | KeyPressMask);
|
XSelectInput(dpy, c->window, ColormapChangeMask | EnterWindowMask | PropertyChangeMask | FocusChangeMask | KeyPressMask);
|
||||||
|
|
||||||
|
@ -40,9 +39,12 @@ manage(Client *c, int mapped)
|
||||||
c->class = class.res_class;
|
c->class = class.res_class;
|
||||||
c->is9term = 0;
|
c->is9term = 0;
|
||||||
if(isNew){
|
if(isNew){
|
||||||
c->is9term = strstr(c->class, "term") || strstr(c->class, "Term") || strstr (c->class, "urxvt") || strstr (c->class, "URxvt");
|
c->is9term = strstr(c->class, "term") || strstr(c->class, "Term")
|
||||||
|
|| strstr(c->class, "urxvt") || strstr(c->class, "URxvt")
|
||||||
|
|| strstr(c->class, "onsole") || strstr(c->class, "Alacritty");
|
||||||
isNew = 0;
|
isNew = 0;
|
||||||
}
|
}
|
||||||
|
printf("%s: is9term = %d", c->class, c->is9term);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
c->instance = 0;
|
c->instance = 0;
|
||||||
|
|
17
menu.c
17
menu.c
|
@ -14,9 +14,9 @@
|
||||||
#include <X11/X.h>
|
#include <X11/X.h>
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <X11/Xutil.h>
|
#include <X11/Xutil.h>
|
||||||
|
#include "config.h"
|
||||||
#include "dat.h"
|
#include "dat.h"
|
||||||
#include "fns.h"
|
#include "fns.h"
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
Client *hiddenc[MAXHIDDEN];
|
Client *hiddenc[MAXHIDDEN];
|
||||||
|
|
||||||
|
@ -396,11 +396,6 @@ button2(int n)
|
||||||
void
|
void
|
||||||
switch_to_c(int n, Client *c)
|
switch_to_c(int n, Client *c)
|
||||||
{
|
{
|
||||||
#ifdef AUTOSTICK
|
|
||||||
static char *autostick[] = AUTOSTICK;
|
|
||||||
char **a = autostick;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(c == 0)
|
if(c == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -411,12 +406,9 @@ switch_to_c(int n, Client *c)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef AUTOSTICK
|
#ifdef AUTOSTICK
|
||||||
while(*a){
|
if(c->virt >= 0 && isautostick(c)){
|
||||||
if (strstr(c->class, *a) && c->virt >= 0) {
|
|
||||||
stick(c);
|
stick(c);
|
||||||
}
|
}
|
||||||
++a;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(c->virt != virt && c->state == NormalState && c->virt >= 0){
|
if(c->virt != virt && c->state == NormalState && c->virt >= 0){
|
||||||
|
@ -461,6 +453,7 @@ switch_to(int n)
|
||||||
|
|
||||||
switch_to_c(n, clients);
|
switch_to_c(n, clients);
|
||||||
current = currents[virt];
|
current = currents[virt];
|
||||||
|
top(current);
|
||||||
if(fork() == 0)
|
if(fork() == 0)
|
||||||
{
|
{
|
||||||
close(ConnectionNumber(dpy));
|
close(ConnectionNumber(dpy));
|
||||||
|
@ -470,8 +463,8 @@ switch_to(int n)
|
||||||
signal(SIGTERM, SIG_DFL);
|
signal(SIGTERM, SIG_DFL);
|
||||||
signal(SIGHUP, SIG_DFL);
|
signal(SIGHUP, SIG_DFL);
|
||||||
#ifdef VIRTNOTIFY
|
#ifdef VIRTNOTIFY
|
||||||
sprintf(virtmsg, "virtual: switched to %s", b2items[virt]);
|
sprintf(virtmsg, VIRTMSG, b2items[virt]);
|
||||||
execlp("notify-send", "notify-send", "-c", "virtual", virtmsg, (char*)0);
|
execlp("notify-send", "notify-send", "-c", "virtual", VIRTHEADER, virtmsg, (char*)0);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue