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