mirror of
https://github.com/lbonn/rofi
synced 2024-11-15 00:27:36 +00:00
pass proper timestamp in _NET_ACTIVE_WINDOW message
This commit is contained in:
parent
d3a5181873
commit
7e975f1a29
1 changed files with 20 additions and 14 deletions
|
@ -414,12 +414,12 @@ int window_get_cardinal_prop(Window w, Atom atom, unsigned long *list, int count
|
|||
}
|
||||
|
||||
// a ClientMessage
|
||||
int window_send_message(Window target, Window subject, Atom atom, unsigned long protocol, unsigned long mask)
|
||||
int window_send_message(Window target, Window subject, Atom atom, unsigned long protocol, unsigned long mask, Time time)
|
||||
{
|
||||
XEvent e; memset(&e, 0, sizeof(XEvent));
|
||||
e.xclient.type = ClientMessage;
|
||||
e.xclient.message_type = atom; e.xclient.window = subject;
|
||||
e.xclient.data.l[0] = protocol; e.xclient.data.l[1] = CurrentTime;
|
||||
e.xclient.data.l[0] = protocol; e.xclient.data.l[1] = time;
|
||||
e.xclient.send_event = True; e.xclient.format = 32;
|
||||
int r = XSendEvent(display, target, False, mask, &e) ?1:0;
|
||||
XFlush(display);
|
||||
|
@ -531,6 +531,12 @@ client* window_client(Window win)
|
|||
return c;
|
||||
}
|
||||
|
||||
#define ALLWINDOWS 1
|
||||
#define DESKTOPWINDOWS 2
|
||||
|
||||
unsigned int all_windows_modmask; KeySym all_windows_keysym;
|
||||
unsigned int desktop_windows_modmask; KeySym desktop_windows_keysym;
|
||||
|
||||
#include "textbox.c"
|
||||
|
||||
void menu_draw(textbox *text, textbox **boxes, int max_lines, int selected, char **filtered)
|
||||
|
@ -547,7 +553,7 @@ void menu_draw(textbox *text, textbox **boxes, int max_lines, int selected, char
|
|||
}
|
||||
}
|
||||
|
||||
int menu(char **lines, char **input, char *prompt, int selected)
|
||||
int menu(char **lines, char **input, char *prompt, int selected, Time *time)
|
||||
{
|
||||
int line = -1, i, j, chosen = 0;
|
||||
workarea mon; monitor_active(&mon);
|
||||
|
@ -619,6 +625,9 @@ int menu(char **lines, char **input, char *prompt, int selected)
|
|||
{
|
||||
while (XCheckTypedEvent(display, KeyPress, &ev));
|
||||
|
||||
if (time)
|
||||
*time = ev.xkey.time;
|
||||
|
||||
int rc = textbox_keypress(text, &ev);
|
||||
if (rc < 0)
|
||||
{
|
||||
|
@ -647,7 +656,9 @@ int menu(char **lines, char **input, char *prompt, int selected)
|
|||
// unhandled key
|
||||
KeySym key = XkbKeycodeToKeysym(display, ev.xkey.keycode, 0, 0);
|
||||
|
||||
if (key == XK_Escape)
|
||||
if (key == XK_Escape
|
||||
|| ((all_windows_modmask == AnyModifier || ev.xkey.state & all_windows_modmask ) && key == all_windows_keysym)
|
||||
|| ((desktop_windows_modmask == AnyModifier || ev.xkey.state & desktop_windows_modmask) && key == desktop_windows_keysym))
|
||||
break;
|
||||
|
||||
if (key == XK_Up)
|
||||
|
@ -677,9 +688,6 @@ int menu(char **lines, char **input, char *prompt, int selected)
|
|||
return line;
|
||||
}
|
||||
|
||||
#define ALLWINDOWS 1
|
||||
#define DESKTOPWINDOWS 2
|
||||
|
||||
#define FORK 1
|
||||
#define NOFORK 2
|
||||
|
||||
|
@ -757,18 +765,19 @@ void run_switcher(int mode, int fmode)
|
|||
display = XOpenDisplay(0);
|
||||
XSync(display, True);
|
||||
char *input = NULL;
|
||||
int n = menu(list, &input, "> ", 1);
|
||||
Time time;
|
||||
int n = menu(list, &input, "> ", 1, &time);
|
||||
if (n >= 0 && list[n])
|
||||
{
|
||||
if (mode == ALLWINDOWS)
|
||||
{
|
||||
// TODO: get rid of strtol
|
||||
window_send_message(root, root, netatoms[_NET_CURRENT_DESKTOP], strtol(list[n], NULL, 10)-1,
|
||||
SubstructureNotifyMask | SubstructureRedirectMask);
|
||||
SubstructureNotifyMask | SubstructureRedirectMask, time);
|
||||
XSync(display, False);
|
||||
}
|
||||
window_send_message(root, ids->array[n], netatoms[_NET_ACTIVE_WINDOW], 2, // 2 = pager
|
||||
SubstructureNotifyMask | SubstructureRedirectMask);
|
||||
SubstructureNotifyMask | SubstructureRedirectMask, time);
|
||||
}
|
||||
else
|
||||
// act as a launcher
|
||||
|
@ -785,9 +794,6 @@ void run_switcher(int mode, int fmode)
|
|||
winlist_free(ids);
|
||||
}
|
||||
|
||||
unsigned int all_windows_modmask; KeySym all_windows_keysym;
|
||||
unsigned int desktop_windows_modmask; KeySym desktop_windows_keysym;
|
||||
|
||||
// KeyPress event
|
||||
void handle_keypress(XEvent *ev)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue