From 067234e9fb01364645416dd7f77cb0f6182e56a6 Mon Sep 17 00:00:00 2001 From: o9000 Date: Sat, 29 Apr 2017 13:42:37 +0200 Subject: [PATCH] Unify code used to execute external programs --- src/battery/battery.c | 4 +- src/battery/battery.h | 2 +- src/button/button.c | 96 +---------------------------- src/clock/clock.c | 4 +- src/clock/clock.h | 2 +- src/execplugin/execplugin.c | 2 +- src/launcher/launcher.c | 4 +- src/launcher/launcher.h | 2 +- src/tint.c | 14 +++-- src/util/common.c | 120 +++++++++++++++++++++++++++++++++--- src/util/common.h | 2 +- 11 files changed, 130 insertions(+), 122 deletions(-) diff --git a/src/battery/battery.c b/src/battery/battery.c index ccc6975..57581e1 100644 --- a/src/battery/battery.c +++ b/src/battery/battery.c @@ -437,7 +437,7 @@ char *battery_get_tooltip(void *obj) return battery_os_tooltip(); } -void battery_action(int button, Time time) +void battery_action(void *obj, int button, int x, int y, Time time) { char *command = NULL; switch (button) { @@ -457,5 +457,5 @@ void battery_action(int button, Time time) command = battery_dwheel_command; break; } - tint_exec(command, NULL, NULL, time); + tint_exec(command, NULL, NULL, time, obj, x, y); } diff --git a/src/battery/battery.h b/src/battery/battery.h index 831413c..9c02803 100644 --- a/src/battery/battery.h +++ b/src/battery/battery.h @@ -108,7 +108,7 @@ void battery_default_font_changed(); gboolean resize_battery(void *obj); -void battery_action(int button, Time time); +void battery_action(void *obj, int button, int x, int y, Time time); /* operating system specific functions */ gboolean battery_os_init(); diff --git a/src/button/button.c b/src/button/button.c index c5c9e4f..3b119fb 100644 --- a/src/button/button.c +++ b/src/button/button.c @@ -516,7 +516,6 @@ void button_dump_geometry(void *obj, int indent) void button_action(void *obj, int mouse_button, int x, int y, Time time) { Button *button = (Button *)obj; - Panel *panel = (Panel *)button->area.panel; char *command = NULL; switch (mouse_button) { case 1: @@ -535,100 +534,7 @@ void button_action(void *obj, int mouse_button, int x, int y, Time time) command = button->backend->dwheel_command; break; } - if (command) { - int aligned_x, aligned_y, aligned_x1, aligned_y1, aligned_x2, aligned_y2; - int panel_x1, panel_x2, panel_y1, panel_y2; - if (panel_horizontal) { - if (area_is_first(button)) - aligned_x1 = panel->posx; - else - aligned_x1 = panel->posx + button->area.posx; - - if (area_is_last(button)) - aligned_x2 = panel->posx + panel->area.width; - else - aligned_x2 = panel->posx + button->area.posx + button->area.width; - - if (area_is_first(button)) - aligned_x = aligned_x1; - else if (area_is_last(button)) - aligned_x = aligned_x2; - else - aligned_x = aligned_x1; - - if (panel_position & BOTTOM) - aligned_y = panel->posy; - else - aligned_y = panel->posy + panel->area.height; - - aligned_y1 = aligned_y2 = aligned_y; - - panel_x1 = panel->posx; - panel_x2 = panel->posx + panel->area.width; - panel_y1 = panel_y2 = aligned_y; - } else { - if (area_is_first(button)) - aligned_y1 = panel->posy; - else - aligned_y1 = panel->posy + button->area.posy; - - if (area_is_last(button)) - aligned_y2 = panel->posy + panel->area.height; - else - aligned_y2 = panel->posy + button->area.posy + button->area.height; - - if (area_is_first(button)) - aligned_y = aligned_y1; - else if (area_is_last(button)) - aligned_y = aligned_y2; - else - aligned_y = aligned_y1; - - if (panel_position & RIGHT) - aligned_x = panel->posx; - else - aligned_x = panel->posx + panel->area.width; - - aligned_x1 = aligned_x2 = aligned_x; - - panel_x1 = panel_x2 = aligned_x; - panel_y1 = panel->posy; - panel_y2 = panel->posy + panel->area.height; - } - - char *full_cmd = g_strdup_printf("export TINT2_BUTTON_X=%d;" - "export TINT2_BUTTON_Y=%d;" - "export TINT2_BUTTON_W=%d;" - "export TINT2_BUTTON_H=%d;" - "export TINT2_BUTTON_ALIGNED_X=%d;" - "export TINT2_BUTTON_ALIGNED_Y=%d;" - "export TINT2_BUTTON_ALIGNED_X1=%d;" - "export TINT2_BUTTON_ALIGNED_Y1=%d;" - "export TINT2_BUTTON_ALIGNED_X2=%d;" - "export TINT2_BUTTON_ALIGNED_Y2=%d;" - "export TINT2_BUTTON_PANEL_X1=%d;" - "export TINT2_BUTTON_PANEL_Y1=%d;" - "export TINT2_BUTTON_PANEL_X2=%d;" - "export TINT2_BUTTON_PANEL_Y2=%d;" - "%s", - x, - y, - button->area.width, - button->area.height, - aligned_x, - aligned_y, - aligned_x1, - aligned_y1, - aligned_x2, - aligned_y2, - panel_x1, - panel_y1, - panel_x2, - panel_y2, - command); - tint_exec(full_cmd, NULL, NULL, time); - g_free(full_cmd); - } + tint_exec(command, NULL, NULL, time, obj, x, y); } char *button_get_tooltip(void *obj) diff --git a/src/clock/clock.c b/src/clock/clock.c index 818b1e3..66e79e3 100644 --- a/src/clock/clock.c +++ b/src/clock/clock.c @@ -393,7 +393,7 @@ char *clock_get_tooltip(void *obj) return strdup(buf_tooltip); } -void clock_action(int button, Time time) +void clock_action(void *obj, int button, int x, int y, Time time) { char *command = NULL; switch (button) { @@ -413,5 +413,5 @@ void clock_action(int button, Time time) command = clock_dwheel_command; break; } - tint_exec(command, NULL, NULL, time); + tint_exec(command, NULL, NULL, time, obj, x, y); } diff --git a/src/clock/clock.h b/src/clock/clock.h index 47851d2..ea47f6f 100644 --- a/src/clock/clock.h +++ b/src/clock/clock.h @@ -54,6 +54,6 @@ void draw_clock(void *obj, cairo_t *c); gboolean resize_clock(void *obj); -void clock_action(int button, Time time); +void clock_action(void *obj, int button, int x, int y, Time time); #endif diff --git a/src/execplugin/execplugin.c b/src/execplugin/execplugin.c index f176f1d..3d3c1b1 100644 --- a/src/execplugin/execplugin.c +++ b/src/execplugin/execplugin.c @@ -588,7 +588,7 @@ void execp_action(void *obj, int button, int x, int y, Time time) execp->area.width, execp->area.height, command); - pid_t pid = tint_exec(full_cmd, NULL, NULL, time); + pid_t pid = tint_exec(full_cmd, NULL, NULL, time, obj, x, y); g_free(full_cmd); if (pid > 0) g_tree_insert(execp->backend->cmd_pids, GINT_TO_POINTER(pid), GINT_TO_POINTER(1)); diff --git a/src/launcher/launcher.c b/src/launcher/launcher.c index 897fd83..18cbafb 100644 --- a/src/launcher/launcher.c +++ b/src/launcher/launcher.c @@ -415,13 +415,13 @@ void free_icon(Imlib_Image icon) } } -void launcher_action(LauncherIcon *icon, XEvent *evt) +void launcher_action(LauncherIcon *icon, XEvent *evt, int x, int y) { launcher_reload_icon((Launcher *)icon->area.parent, icon); launcher_reload_hidden_icons((Launcher *)icon->area.parent); if (evt->type == ButtonPress || evt->type == ButtonRelease) - tint_exec(icon->cmd, icon->cwd, icon->icon_tooltip, evt->xbutton.time); + tint_exec(icon->cmd, icon->cwd, icon->icon_tooltip, evt->xbutton.time, &icon->area, x, y); } // Populates the list_icons list from the list_apps list diff --git a/src/launcher/launcher.h b/src/launcher/launcher.h index 6b44dc3..db22e6f 100644 --- a/src/launcher/launcher.h +++ b/src/launcher/launcher.h @@ -67,7 +67,7 @@ void launcher_default_icon_theme_changed(); // Populates the list_icons list void launcher_load_icons(Launcher *launcher); -void launcher_action(LauncherIcon *icon, XEvent *e); +void launcher_action(LauncherIcon *icon, XEvent *e, int x, int y); void test_launcher_read_desktop_file(); void test_launcher_read_theme_file(); diff --git a/src/tint.c b/src/tint.c index 7791d07..e92d2ed 100644 --- a/src/tint.c +++ b/src/tint.c @@ -967,8 +967,9 @@ void event_button_release(XEvent *e) break; } - if (click_clock(panel, e->xbutton.x, e->xbutton.y)) { - clock_action(e->xbutton.button, e->xbutton.time); + Clock *clock = click_clock(panel, e->xbutton.x, e->xbutton.y); + if (clock) { + clock_action(clock, e->xbutton.button, e->xbutton.x - clock->area.posx, e->xbutton.y - clock->area.posy, e->xbutton.time); if (panel_layer == BOTTOM_LAYER) XLowerWindow(server.display, panel->main_win); task_drag = 0; @@ -976,8 +977,9 @@ void event_button_release(XEvent *e) } #ifdef ENABLE_BATTERY - if (click_battery(panel, e->xbutton.x, e->xbutton.y)) { - battery_action(e->xbutton.button, e->xbutton.time); + Battery *battery = click_battery(panel, e->xbutton.x, e->xbutton.y); + if (battery) { + battery_action(battery, e->xbutton.button, e->xbutton.x - battery->area.posx, e->xbutton.y - battery->area.posy, e->xbutton.time); if (panel_layer == BOTTOM_LAYER) XLowerWindow(server.display, panel->main_win); task_drag = 0; @@ -1006,7 +1008,7 @@ void event_button_release(XEvent *e) if (e->xbutton.button == 1 && click_launcher(panel, e->xbutton.x, e->xbutton.y)) { LauncherIcon *icon = click_launcher_icon(panel, e->xbutton.x, e->xbutton.y); if (icon) { - launcher_action(icon, e); + launcher_action(icon, e, e->xbutton.x - icon->area.posx, e->xbutton.y - icon->area.posy); } task_drag = 0; return; @@ -2131,7 +2133,7 @@ start: strcat(cmd, "\""); strcat(cmd, "&)"); fprintf(stderr, "DnD %s:%d: Running command: %s\n", __FILE__, __LINE__, cmd); - tint_exec(cmd, NULL, NULL, e.xselection.time); + tint_exec(cmd, NULL, NULL, e.xselection.time, NULL, 0, 0); free(cmd); // Reply OK. diff --git a/src/util/common.c b/src/util/common.c index 43ea6a8..8b149fa 100644 --- a/src/util/common.c +++ b/src/util/common.c @@ -103,22 +103,121 @@ gboolean parse_line(const char *line, char **key, char **value) extern char *config_path; -pid_t tint_exec(const char *command, const char *dir, const char *tooltip, Time time) +#ifndef TINT2CONF +pid_t tint_exec(const char *command, const char *dir, const char *tooltip, Time time, Area *area, int x, int y) { if (!command || strlen(command) == 0) return -1; - command = g_strdup_printf("export TINT2_CONFIG=%s;" - "%s", - config_path, - command); + if (area) { + Panel *panel = (Panel *)area->panel; + + int aligned_x, aligned_y, aligned_x1, aligned_y1, aligned_x2, aligned_y2; + int panel_x1, panel_x2, panel_y1, panel_y2; + if (panel_horizontal) { + if (area_is_first(area)) + aligned_x1 = panel->posx; + else + aligned_x1 = panel->posx + area->posx; + + if (area_is_last(area)) + aligned_x2 = panel->posx + panel->area.width; + else + aligned_x2 = panel->posx + area->posx + area->width; + + if (area_is_first(area)) + aligned_x = aligned_x1; + else if (area_is_last(area)) + aligned_x = aligned_x2; + else + aligned_x = aligned_x1; + + if (panel_position & BOTTOM) + aligned_y = panel->posy; + else + aligned_y = panel->posy + panel->area.height; + + aligned_y1 = aligned_y2 = aligned_y; + + panel_x1 = panel->posx; + panel_x2 = panel->posx + panel->area.width; + panel_y1 = panel_y2 = aligned_y; + } else { + if (area_is_first(area)) + aligned_y1 = panel->posy; + else + aligned_y1 = panel->posy + area->posy; + + if (area_is_last(area)) + aligned_y2 = panel->posy + panel->area.height; + else + aligned_y2 = panel->posy + area->posy + area->height; + + if (area_is_first(area)) + aligned_y = aligned_y1; + else if (area_is_last(area)) + aligned_y = aligned_y2; + else + aligned_y = aligned_y1; + + if (panel_position & RIGHT) + aligned_x = panel->posx; + else + aligned_x = panel->posx + panel->area.width; + + aligned_x1 = aligned_x2 = aligned_x; + + panel_x1 = panel_x2 = aligned_x; + panel_y1 = panel->posy; + panel_y2 = panel->posy + panel->area.height; + } + + command = g_strdup_printf("export TINT2_CONFIG=%s;" + "export TINT2_BUTTON_X=%d;" + "export TINT2_BUTTON_Y=%d;" + "export TINT2_BUTTON_W=%d;" + "export TINT2_BUTTON_H=%d;" + "export TINT2_BUTTON_ALIGNED_X=%d;" + "export TINT2_BUTTON_ALIGNED_Y=%d;" + "export TINT2_BUTTON_ALIGNED_X1=%d;" + "export TINT2_BUTTON_ALIGNED_Y1=%d;" + "export TINT2_BUTTON_ALIGNED_X2=%d;" + "export TINT2_BUTTON_ALIGNED_Y2=%d;" + "export TINT2_BUTTON_PANEL_X1=%d;" + "export TINT2_BUTTON_PANEL_Y1=%d;" + "export TINT2_BUTTON_PANEL_X2=%d;" + "export TINT2_BUTTON_PANEL_Y2=%d;" + "%s", + config_path, + x, + y, + area->width, + area->height, + aligned_x, + aligned_y, + aligned_x1, + aligned_y1, + aligned_x2, + aligned_y2, + panel_x1, + panel_y1, + panel_x2, + panel_y2, + command); + } else { + command = g_strdup_printf("export TINT2_CONFIG=%s;" + "%s", + config_path, + command); + } + if (!command) return -1; if (!tooltip) tooltip = command; -#if HAVE_SN && !defined TINT2CONF +#if HAVE_SN SnLauncherContext *ctx = 0; if (startup_notifications && time) { ctx = sn_launcher_context_new(server.sn_display, server.screen); @@ -134,7 +233,7 @@ pid_t tint_exec(const char *command, const char *dir, const char *tooltip, Time fprintf(stderr, "Could not fork\n"); } else if (pid == 0) { // Child process -#if HAVE_SN && !defined TINT2CONF +#if HAVE_SN if (startup_notifications && time) { sn_launcher_context_setup_child_process(ctx); } @@ -146,7 +245,7 @@ pid_t tint_exec(const char *command, const char *dir, const char *tooltip, Time chdir(dir); execl("/bin/sh", "/bin/sh", "-c", command, NULL); fprintf(stderr, "Failed to execlp %s\n", command); -#if HAVE_SN && !defined TINT2CONF +#if HAVE_SN if (startup_notifications && time) { sn_launcher_context_unref(ctx); } @@ -154,7 +253,7 @@ pid_t tint_exec(const char *command, const char *dir, const char *tooltip, Time _exit(1); } else { // Parent process -#if HAVE_SN && !defined TINT2CONF +#if HAVE_SN if (startup_notifications && time) { g_tree_insert(server.pids, GINT_TO_POINTER(pid), ctx); } @@ -165,8 +264,9 @@ pid_t tint_exec(const char *command, const char *dir, const char *tooltip, Time void tint_exec_no_sn(const char *command) { - tint_exec(command, NULL, NULL, 0); + tint_exec(command, NULL, NULL, 0, NULL, 0, 0); } +#endif char *expand_tilde(const char *s) { diff --git a/src/util/common.h b/src/util/common.h index c1f72d2..ee6d0e2 100644 --- a/src/util/common.h +++ b/src/util/common.h @@ -54,7 +54,7 @@ void extract_values(const char *value, char **value1, char **value2, char **valu void extract_values_4(const char *value, char **value1, char **value2, char **value3, char **value4); // Executes a command in a shell. -pid_t tint_exec(const char *command, const char *dir, const char *tooltip, Time time); +pid_t tint_exec(const char *command, const char *dir, const char *tooltip, Time time, Area *area, int x, int y); void tint_exec_no_sn(const char *command); // Returns a copy of s in which "~" is expanded to the path to the user's home directory.