From 2e55d52318f4eb07f1673d79c294abfe82d6276f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Mon, 9 Sep 2013 17:35:10 +0200 Subject: Dunst patches --- .../dunst-1.0.0/dunst-1.0.0-fix-pause-resume.patch | 60 ++++++++++ x11-misc/dunst-1.0.0/dunst-1.0.0-numlock.patch | 130 +++++++++++++++++++++ x11-misc/dunst-1.0.0/net-wm-window-type.patch | 54 +++++++++ 3 files changed, 244 insertions(+) create mode 100644 x11-misc/dunst-1.0.0/dunst-1.0.0-fix-pause-resume.patch create mode 100644 x11-misc/dunst-1.0.0/dunst-1.0.0-numlock.patch create mode 100644 x11-misc/dunst-1.0.0/net-wm-window-type.patch diff --git a/x11-misc/dunst-1.0.0/dunst-1.0.0-fix-pause-resume.patch b/x11-misc/dunst-1.0.0/dunst-1.0.0-fix-pause-resume.patch new file mode 100644 index 0000000..9955177 --- /dev/null +++ b/x11-misc/dunst-1.0.0/dunst-1.0.0-fix-pause-resume.patch @@ -0,0 +1,60 @@ +From 04248fd49ef6769c7dc7e246fc505ad9c70afe27 Mon Sep 17 00:00:00 2001 +From: Sascha Kruse +Date: Mon, 22 Apr 2013 20:07:35 +0000 +Subject: [PATCH] fix pause/resume + +this fixes github issue #98 +--- + dunst.c | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +diff --git a/dunst.c b/dunst.c +index fe67f4b..534a6d2 100644 +--- a/dunst.c ++++ b/dunst.c +@@ -105,7 +105,7 @@ void update_lists() + + if (pause_display) { + while (displayed->length > 0) { +- g_queue_insert_sorted(queue, g_queue_pop_head(queue), ++ g_queue_insert_sorted(queue, g_queue_pop_head(displayed), + notification_cmp_data, NULL); + } + return; +@@ -240,16 +240,16 @@ gboolean run(void *data) + timeout_cnt--; + } + +- if (displayed->length > 0 && !xctx.visible) { +- x_win_show(); ++ if (displayed->length > 0 && !xctx.visible && !pause_display) { ++ x_win_show(); + } + +- if (displayed->length == 0 && xctx.visible) { +- x_win_hide(); ++ if (xctx.visible && (pause_display || displayed->length == 0)) { ++ x_win_hide(); + } + + if (xctx.visible) { +- x_win_draw(); ++ x_win_draw(); + } + + if (xctx.visible) { +@@ -355,9 +355,11 @@ void pause_signal_handler(int sig) + { + if (sig == SIGUSR1) { + pause_display = true; ++ wake_up(); + } + if (sig == SIGUSR2) { + pause_display = false; ++ wake_up(); + } + + signal(sig, pause_signal_handler); +-- +1.8.1.5 + diff --git a/x11-misc/dunst-1.0.0/dunst-1.0.0-numlock.patch b/x11-misc/dunst-1.0.0/dunst-1.0.0-numlock.patch new file mode 100644 index 0000000..e6b4d9a --- /dev/null +++ b/x11-misc/dunst-1.0.0/dunst-1.0.0-numlock.patch @@ -0,0 +1,130 @@ +diff --git a/x.c b/x.c +index 2ad74d3..4248082 100644 +--- a/x.c ++++ b/x.c +@@ -458,6 +458,53 @@ static void setopacity(Window win, unsigned long opacity) + + + ++ /* ++ * Returns the modifier which is NumLock. ++ */ ++static KeySym x_numlock_mod() ++{ ++ const KeyCode nl = XKeysymToKeycode(xctx.dpy, XStringToKeysym("Num_Lock")); ++ ++ int mod; ++ KeySym sym = 0; ++ XModifierKeymap * map = XGetModifierMapping(xctx.dpy); ++ ++ for (mod = 0; mod < 8; mod++) { ++ for (int j = 0; j < map->max_keypermod; j++) { ++ if (map->modifiermap[mod*map->max_keypermod+j] == nl) { ++ switch (mod) { ++ case ShiftMapIndex: ++ sym = ShiftMask; ++ break; ++ case LockMapIndex: ++ sym = LockMask; ++ break; ++ case ControlMapIndex: ++ sym = ControlMask; ++ break; ++ case Mod1MapIndex: ++ sym = Mod1Mask; ++ break; ++ case Mod2MapIndex: ++ sym = Mod2Mask; ++ break; ++ case Mod3MapIndex: ++ sym = Mod3Mask; ++ break; ++ case Mod4MapIndex: ++ sym = Mod4Mask; ++ break; ++ case Mod5MapIndex: ++ sym = Mod5Mask; ++ break; ++ } ++ } ++ } ++ } ++ ++ XFreeModifiermap(map); ++ return sym; ++} + + /* + * Helper function to use glib's mainloop mechanic +@@ -488,6 +535,7 @@ gboolean x_mainloop_fd_dispatch(GSource * source, GSourceFunc callback, + gpointer user_data) + { + XEvent ev; ++ unsigned int state; + while (XPending(xctx.dpy) > 0) { + XNextEvent(xctx.dpy, &ev); + switch (ev.type) { +@@ -508,10 +556,13 @@ gboolean x_mainloop_fd_dispatch(GSource * source, GSourceFunc callback, + } + break; + case KeyPress: ++ state = ev.xkey.state; ++ /* NumLock is also encoded in the state. Remove it. */ ++ state &= ~x_numlock_mod(); + if (settings.close_ks.str + && XLookupKeysym(&ev.xkey, + 0) == settings.close_ks.sym +- && settings.close_ks.mask == ev.xkey.state) { ++ && settings.close_ks.mask == state) { + if (displayed) { + notification *n = g_queue_peek_head(displayed); + if (n) +@@ -521,19 +572,19 @@ gboolean x_mainloop_fd_dispatch(GSource * source, GSourceFunc callback, + if (settings.history_ks.str + && XLookupKeysym(&ev.xkey, + 0) == settings.history_ks.sym +- && settings.history_ks.mask == ev.xkey.state) { ++ && settings.history_ks.mask == state) { + history_pop(); + } + if (settings.close_all_ks.str + && XLookupKeysym(&ev.xkey, + 0) == settings.close_all_ks.sym +- && settings.close_all_ks.mask == ev.xkey.state) { ++ && settings.close_all_ks.mask == state) { + move_all_to_history(); + } + if (settings.context_ks.str + && XLookupKeysym(&ev.xkey, + 0) == settings.context_ks.sym +- && settings.context_ks.mask == ev.xkey.state) { ++ && settings.context_ks.mask == state) { + context_menu(); + } + break; +@@ -926,9 +977,12 @@ int x_shortcut_grab(keyboard_shortcut * ks) + + x_shortcut_setup_error_handler(); + +- if (ks->is_valid) ++ if (ks->is_valid) { + XGrabKey(xctx.dpy, ks->code, ks->mask, root, + true, GrabModeAsync, GrabModeAsync); ++ XGrabKey(xctx.dpy, ks->code, ks->mask | x_numlock_mod() , root, ++ true, GrabModeAsync, GrabModeAsync); ++ } + + if (x_shortcut_tear_down_error_handler()) { + fprintf(stderr, "Unable to grab key \"%s\"\n", ks->str); +@@ -945,8 +999,10 @@ void x_shortcut_ungrab(keyboard_shortcut * ks) + { + Window root; + root = RootWindow(xctx.dpy, DefaultScreen(xctx.dpy)); +- if (ks->is_valid) ++ if (ks->is_valid) { + XUngrabKey(xctx.dpy, ks->code, ks->mask, root); ++ XUngrabKey(xctx.dpy, ks->code, ks->mask | x_numlock_mod(), root); ++ } + } + + /* diff --git a/x11-misc/dunst-1.0.0/net-wm-window-type.patch b/x11-misc/dunst-1.0.0/net-wm-window-type.patch new file mode 100644 index 0000000..cfd5e8c --- /dev/null +++ b/x11-misc/dunst-1.0.0/net-wm-window-type.patch @@ -0,0 +1,54 @@ +From 41e5976e6da40344aa400f9011529db9c75bf769 Mon Sep 17 00:00:00 2001 +From: Sascha Kruse +Date: Tue, 16 Jul 2013 13:30:46 +0200 +Subject: [PATCH] set _NET_WM_WINDOW_TYPE (thanks lexming) + +fix #113 +--- + x.c | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +diff --git a/x.c b/x.c +index e149f5c..5622f30 100644 +--- a/x.c ++++ b/x.c +@@ -850,6 +850,27 @@ void x_setup(void) + x_win_setup(); + x_cairo_setup(); + x_shortcut_grab(&settings.history_ks); ++ ++} ++ ++ ++static void x_set_win_type(Window win) ++{ ++ ++ long data[2]; ++ ++ Atom net_wm_window_type = ++ XInternAtom(xctx.dpy, "_NET_WM_WINDOW_TYPE", false); ++ Atom net_wm_window_type_notification = ++ XInternAtom(xctx.dpy, "_NET_WM_WINDOW_TYPE_NOTIFICATION", false); ++ Atom net_wm_window_type_utility = ++ XInternAtom(xctx.dpy, "_NET_WM_WINDOW_TYPE_UTILITY", false); ++ ++ data[0] = net_wm_window_type_notification; ++ data[1] = net_wm_window_type_utility; ++ ++ XChangeProperty(xctx.dpy, win, net_wm_window_type, XA_ATOM, 32, ++ PropModeReplace, (unsigned char *) &data, 1L); + } + + /* +@@ -884,6 +905,8 @@ static void x_win_setup(void) + CopyFromParent, DefaultVisual(xctx.dpy, + DefaultScreen(xctx.dpy)), + CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); ++ ++ x_set_win_type(xctx.win); + settings.transparency = + settings.transparency > 100 ? 100 : settings.transparency; + setopacity(xctx.win, +-- +1.8.4 + -- cgit v1.2.3