Unify code used to execute external programs
This commit is contained in:
parent
e32d2342a6
commit
067234e9fb
11 changed files with 130 additions and 122 deletions
|
@ -437,7 +437,7 @@ char *battery_get_tooltip(void *obj)
|
||||||
return battery_os_tooltip();
|
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;
|
char *command = NULL;
|
||||||
switch (button) {
|
switch (button) {
|
||||||
|
@ -457,5 +457,5 @@ void battery_action(int button, Time time)
|
||||||
command = battery_dwheel_command;
|
command = battery_dwheel_command;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tint_exec(command, NULL, NULL, time);
|
tint_exec(command, NULL, NULL, time, obj, x, y);
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,7 +108,7 @@ void battery_default_font_changed();
|
||||||
|
|
||||||
gboolean resize_battery(void *obj);
|
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 */
|
/* operating system specific functions */
|
||||||
gboolean battery_os_init();
|
gboolean battery_os_init();
|
||||||
|
|
|
@ -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)
|
void button_action(void *obj, int mouse_button, int x, int y, Time time)
|
||||||
{
|
{
|
||||||
Button *button = (Button *)obj;
|
Button *button = (Button *)obj;
|
||||||
Panel *panel = (Panel *)button->area.panel;
|
|
||||||
char *command = NULL;
|
char *command = NULL;
|
||||||
switch (mouse_button) {
|
switch (mouse_button) {
|
||||||
case 1:
|
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;
|
command = button->backend->dwheel_command;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (command) {
|
tint_exec(command, NULL, NULL, time, obj, x, y);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char *button_get_tooltip(void *obj)
|
char *button_get_tooltip(void *obj)
|
||||||
|
|
|
@ -393,7 +393,7 @@ char *clock_get_tooltip(void *obj)
|
||||||
return strdup(buf_tooltip);
|
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;
|
char *command = NULL;
|
||||||
switch (button) {
|
switch (button) {
|
||||||
|
@ -413,5 +413,5 @@ void clock_action(int button, Time time)
|
||||||
command = clock_dwheel_command;
|
command = clock_dwheel_command;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tint_exec(command, NULL, NULL, time);
|
tint_exec(command, NULL, NULL, time, obj, x, y);
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,6 @@ void draw_clock(void *obj, cairo_t *c);
|
||||||
|
|
||||||
gboolean resize_clock(void *obj);
|
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
|
#endif
|
||||||
|
|
|
@ -588,7 +588,7 @@ void execp_action(void *obj, int button, int x, int y, Time time)
|
||||||
execp->area.width,
|
execp->area.width,
|
||||||
execp->area.height,
|
execp->area.height,
|
||||||
command);
|
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);
|
g_free(full_cmd);
|
||||||
if (pid > 0)
|
if (pid > 0)
|
||||||
g_tree_insert(execp->backend->cmd_pids, GINT_TO_POINTER(pid), GINT_TO_POINTER(1));
|
g_tree_insert(execp->backend->cmd_pids, GINT_TO_POINTER(pid), GINT_TO_POINTER(1));
|
||||||
|
|
|
@ -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_icon((Launcher *)icon->area.parent, icon);
|
||||||
launcher_reload_hidden_icons((Launcher *)icon->area.parent);
|
launcher_reload_hidden_icons((Launcher *)icon->area.parent);
|
||||||
|
|
||||||
if (evt->type == ButtonPress || evt->type == ButtonRelease)
|
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
|
// Populates the list_icons list from the list_apps list
|
||||||
|
|
|
@ -67,7 +67,7 @@ void launcher_default_icon_theme_changed();
|
||||||
|
|
||||||
// Populates the list_icons list
|
// Populates the list_icons list
|
||||||
void launcher_load_icons(Launcher *launcher);
|
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_desktop_file();
|
||||||
void test_launcher_read_theme_file();
|
void test_launcher_read_theme_file();
|
||||||
|
|
14
src/tint.c
14
src/tint.c
|
@ -967,8 +967,9 @@ void event_button_release(XEvent *e)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (click_clock(panel, e->xbutton.x, e->xbutton.y)) {
|
Clock *clock = click_clock(panel, e->xbutton.x, e->xbutton.y);
|
||||||
clock_action(e->xbutton.button, e->xbutton.time);
|
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)
|
if (panel_layer == BOTTOM_LAYER)
|
||||||
XLowerWindow(server.display, panel->main_win);
|
XLowerWindow(server.display, panel->main_win);
|
||||||
task_drag = 0;
|
task_drag = 0;
|
||||||
|
@ -976,8 +977,9 @@ void event_button_release(XEvent *e)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_BATTERY
|
#ifdef ENABLE_BATTERY
|
||||||
if (click_battery(panel, e->xbutton.x, e->xbutton.y)) {
|
Battery *battery = click_battery(panel, e->xbutton.x, e->xbutton.y);
|
||||||
battery_action(e->xbutton.button, e->xbutton.time);
|
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)
|
if (panel_layer == BOTTOM_LAYER)
|
||||||
XLowerWindow(server.display, panel->main_win);
|
XLowerWindow(server.display, panel->main_win);
|
||||||
task_drag = 0;
|
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)) {
|
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);
|
LauncherIcon *icon = click_launcher_icon(panel, e->xbutton.x, e->xbutton.y);
|
||||||
if (icon) {
|
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;
|
task_drag = 0;
|
||||||
return;
|
return;
|
||||||
|
@ -2131,7 +2133,7 @@ start:
|
||||||
strcat(cmd, "\"");
|
strcat(cmd, "\"");
|
||||||
strcat(cmd, "&)");
|
strcat(cmd, "&)");
|
||||||
fprintf(stderr, "DnD %s:%d: Running command: %s\n", __FILE__, __LINE__, 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);
|
free(cmd);
|
||||||
|
|
||||||
// Reply OK.
|
// Reply OK.
|
||||||
|
|
|
@ -103,22 +103,121 @@ gboolean parse_line(const char *line, char **key, char **value)
|
||||||
|
|
||||||
extern char *config_path;
|
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)
|
if (!command || strlen(command) == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
command = g_strdup_printf("export TINT2_CONFIG=%s;"
|
if (area) {
|
||||||
"%s",
|
Panel *panel = (Panel *)area->panel;
|
||||||
config_path,
|
|
||||||
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(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)
|
if (!command)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!tooltip)
|
if (!tooltip)
|
||||||
tooltip = command;
|
tooltip = command;
|
||||||
|
|
||||||
#if HAVE_SN && !defined TINT2CONF
|
#if HAVE_SN
|
||||||
SnLauncherContext *ctx = 0;
|
SnLauncherContext *ctx = 0;
|
||||||
if (startup_notifications && time) {
|
if (startup_notifications && time) {
|
||||||
ctx = sn_launcher_context_new(server.sn_display, server.screen);
|
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");
|
fprintf(stderr, "Could not fork\n");
|
||||||
} else if (pid == 0) {
|
} else if (pid == 0) {
|
||||||
// Child process
|
// Child process
|
||||||
#if HAVE_SN && !defined TINT2CONF
|
#if HAVE_SN
|
||||||
if (startup_notifications && time) {
|
if (startup_notifications && time) {
|
||||||
sn_launcher_context_setup_child_process(ctx);
|
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);
|
chdir(dir);
|
||||||
execl("/bin/sh", "/bin/sh", "-c", command, NULL);
|
execl("/bin/sh", "/bin/sh", "-c", command, NULL);
|
||||||
fprintf(stderr, "Failed to execlp %s\n", command);
|
fprintf(stderr, "Failed to execlp %s\n", command);
|
||||||
#if HAVE_SN && !defined TINT2CONF
|
#if HAVE_SN
|
||||||
if (startup_notifications && time) {
|
if (startup_notifications && time) {
|
||||||
sn_launcher_context_unref(ctx);
|
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);
|
_exit(1);
|
||||||
} else {
|
} else {
|
||||||
// Parent process
|
// Parent process
|
||||||
#if HAVE_SN && !defined TINT2CONF
|
#if HAVE_SN
|
||||||
if (startup_notifications && time) {
|
if (startup_notifications && time) {
|
||||||
g_tree_insert(server.pids, GINT_TO_POINTER(pid), ctx);
|
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)
|
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)
|
char *expand_tilde(const char *s)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
void extract_values_4(const char *value, char **value1, char **value2, char **value3, char **value4);
|
||||||
|
|
||||||
// Executes a command in a shell.
|
// 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);
|
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.
|
// Returns a copy of s in which "~" is expanded to the path to the user's home directory.
|
||||||
|
|
Loading…
Reference in a new issue