Skip to content

Commit

Permalink
Merge pull request #530 from zijung/feature-mouse_event
Browse files Browse the repository at this point in the history
Add options to specify mouse event
  • Loading branch information
tsipinakis committed Jul 15, 2018
2 parents 6d0e20e + 88175b2 commit c0eef2d
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 3 deletions.
6 changes: 6 additions & 0 deletions config.h
Expand Up @@ -102,6 +102,12 @@ settings_t defaults = {
.code = 0,.sym = NoSymbol,.is_valid = false
}, /* ignore this */

.mouse_left_click = MOUSE_CLOSE_CURRENT,

.mouse_middle_click = MOUSE_DO_ACTION,

.mouse_right_click = MOUSE_CLOSE_ALL,

};

rule_t default_rules[] = {
Expand Down
24 changes: 24 additions & 0 deletions docs/dunst.pod
Expand Up @@ -472,6 +472,30 @@ single notification.
To avoid the corners clipping the icon or text the corner radius will be
automatically lowered to half of the notification height if it exceeds it.

=item B<mouse_left/middle/right_click> (values: [none/do_action/close_current/close_all])

Defines action of mouse click.

=over 4

=item B<none>

Don't do anything.

=item B<do_action> (default for mouse_middle_click)

If the notification has exactly one action, or one is marked as default, invoke it. If there are multiple and no default, open the context menu.

=item B<close_current> (default for mouse_left_click)

Close current notification.

=item B<close_all> (default for mouse_right_click)

Close all notifications.

=back

=back

=head2 Shortcut section
Expand Down
13 changes: 13 additions & 0 deletions dunstrc
Expand Up @@ -226,6 +226,19 @@
# layout changes.
force_xinerama = false

### mouse

# Defines action of mouse event
# Possible values are:
# * none: Don't do anything.
# * do_action: If the notification has exactly one action, or one is marked as default,
# invoke it. If there are multiple and no default, open the context menu.
# * close_current: Close current notification.
# * close_all: Close all notifications.
mouse_left_click = close_current
mouse_middle_click = do_action
mouse_right_click = close_all

# Experimental features that may or may not work correctly. Do not expect them
# to have a consistent behaviour across releases.
[experimental]
Expand Down
66 changes: 66 additions & 0 deletions src/settings.c
Expand Up @@ -49,6 +49,23 @@ static enum markup_mode parse_markup_mode(const char *mode)
}
}

static enum mouse_action parse_mouse_action(const char *action)
{
if (strcmp(action, "none") == 0)
return MOUSE_NONE;
else if (strcmp(action, "do_action") == 0)
return MOUSE_DO_ACTION;
else if (strcmp(action, "close_current") == 0)
return MOUSE_CLOSE_CURRENT;
else if (strcmp(action, "close_all") == 0)
return MOUSE_CLOSE_ALL;
else {
LOG_W("Unknown mouse action: '%s'", action);
return MOUSE_NONE;
}
}


static enum urgency ini_get_urgency(const char *section, const char *key, const int def)
{
int ret = def;
Expand Down Expand Up @@ -516,6 +533,55 @@ void load_settings(char *cmdline_config_path)
);

}

{
char *c = option_get_string(
"global",
"mouse_left_click", "-left_click", NULL,
"Action of Left click event"
);

if (c) {
settings.mouse_left_click = parse_mouse_action(c);
} else {
settings.mouse_left_click = defaults.mouse_left_click;
}

g_free(c);
}

{
char *c = option_get_string(
"global",
"mouse_middle_click", "-mouse_middle_click", NULL,
"Action of middle click event"
);

if (c) {
settings.mouse_middle_click = parse_mouse_action(c);
} else {
settings.mouse_middle_click = defaults.mouse_middle_click;
}

g_free(c);
}

{
char *c = option_get_string(
"global",
"mouse_right_click", "-mouse_right_click", NULL,
"Action of right click event"
);

if (c) {
settings.mouse_right_click = parse_mouse_action(c);
} else {
settings.mouse_right_click = defaults.mouse_right_click;
}

g_free(c);
}

settings.lowbgcolor = option_get_string(
"urgency_low",
"background", "-lb", defaults.lowbgcolor,
Expand Down
4 changes: 4 additions & 0 deletions src/settings.h
Expand Up @@ -12,6 +12,7 @@ enum icon_position_t { icons_left, icons_right, icons_off };
enum separator_color { SEP_FOREGROUND, SEP_AUTO, SEP_FRAME, SEP_CUSTOM };
enum follow_mode { FOLLOW_NONE, FOLLOW_MOUSE, FOLLOW_KEYBOARD };
enum markup_mode { MARKUP_NULL, MARKUP_NO, MARKUP_STRIP, MARKUP_FULL };
enum mouse_action { MOUSE_NONE, MOUSE_DO_ACTION, MOUSE_CLOSE_CURRENT, MOUSE_CLOSE_ALL };

struct geometry {
int x;
Expand Down Expand Up @@ -85,6 +86,9 @@ typedef struct _settings {
keyboard_shortcut context_ks;
bool force_xinerama;
int corner_radius;
enum mouse_action mouse_left_click;
enum mouse_action mouse_middle_click;
enum mouse_action mouse_right_click;
} settings_t;

extern settings_t settings;
Expand Down
23 changes: 20 additions & 3 deletions src/x11/x.c
Expand Up @@ -386,13 +386,30 @@ bool x_is_idle(void)
*/
static void x_handle_click(XEvent ev)
{
if (ev.xbutton.button == Button3) {
enum mouse_action act;

switch (ev.xbutton.button) {
case Button1:
act = settings.mouse_left_click;
break;
case Button2:
act = settings.mouse_middle_click;
break;
case Button3:
act = settings.mouse_right_click;
break;
default:
LOG_W("Unsupported mouse button: '%d'", ev.xbutton.button);
return;
}

if (act == MOUSE_CLOSE_ALL) {
queues_history_push_all();

return;
}

if (ev.xbutton.button == Button1 || ev.xbutton.button == Button2) {
if (act == MOUSE_DO_ACTION || act == MOUSE_CLOSE_CURRENT) {
int y = settings.separator_height;
notification *n = NULL;
int first = true;
Expand All @@ -408,7 +425,7 @@ static void x_handle_click(XEvent ev)
}

if (n) {
if (ev.xbutton.button == Button1)
if (act == MOUSE_CLOSE_CURRENT)
queues_notification_close(n, REASON_USER);
else
notification_do_action(n);
Expand Down

0 comments on commit c0eef2d

Please sign in to comment.