Compare commits

..

6 Commits

Author SHA1 Message Date
o9000
6df4eb4bee Release 0.14.4 2017-04-29 13:47:21 +02:00
o9000
18fcc4952d Update release script 2017-04-29 13:47:04 +02:00
o9000
3878bd6a49 Update changelog 2017-04-29 13:44:22 +02:00
o9000
067234e9fb Unify code used to execute external programs 2017-04-29 13:42:37 +02:00
o9000
e32d2342a6 Fix regression in executor (issue #639) 2017-04-27 21:57:45 +02:00
o9000
82776df9d6 Fix crash when _NET_WM_ICON is set but empty 2017-04-27 09:04:16 +02:00
19 changed files with 168 additions and 149 deletions

View File

@@ -1,3 +1,8 @@
2017-04-29 0.14.4
- Fixes:
- Fix regression in executor (issue #639)
- Fix crash when _NET_WM_ICON is set but empty (https://github.com/jmc-88/tint3/issues/21)
2017-04-23 0.14.3 2017-04-23 0.14.3
- Fixes: - Fixes:
- Make versioning more robust when building as package - Make versioning more robust when building as package

View File

@@ -1,5 +1,5 @@
# Latest stable release: 0.14.3 # Latest stable release: 0.14.4
Changes: https://gitlab.com/o9000/tint2/blob/0.14.3/ChangeLog Changes: https://gitlab.com/o9000/tint2/blob/0.14.4/ChangeLog
Documentation: [doc/tint2.md](doc/tint2.md) Documentation: [doc/tint2.md](doc/tint2.md)
@@ -8,7 +8,7 @@ Compile it with (after you install the [dependencies](https://gitlab.com/o9000/t
``` ```
git clone https://gitlab.com/o9000/tint2.git git clone https://gitlab.com/o9000/tint2.git
cd tint2 cd tint2
git checkout 0.14.3 git checkout 0.14.4
mkdir build mkdir build
cd build cd build
cmake .. cmake ..

View File

@@ -199,9 +199,9 @@ pre {
</style> </style>
</head> </head>
<body> <body>
<h1 id="latest-stable-release-0-14-3"><span class="md2man-title">Latest</span> <span class="md2man-section">stable</span> <span class="md2man-date">release:</span> <span class="md2man-source">0.14.3</span><a name="latest-stable-release-0-14-3" href="#latest-stable-release-0-14-3" class="md2man-permalink" title="permalink"></a></h1><p>Changes: <a href="https://gitlab.com/o9000/tint2/blob/0.14.3/ChangeLog">https://gitlab.com/o9000/tint2/blob/0.14.3/ChangeLog</a></p><p>Documentation: <a href="manual.html">manual.html</a></p><p>Compile it with (after you install the <a href="https://gitlab.com/o9000/tint2/wikis/Install#dependencies">dependencies</a>):</p><pre class="highlight plaintext"><code>git clone https://gitlab.com/o9000/tint2.git <h1 id="latest-stable-release-0-14-4"><span class="md2man-title">Latest</span> <span class="md2man-section">stable</span> <span class="md2man-date">release:</span> <span class="md2man-source">0.14.4</span><a name="latest-stable-release-0-14-4" href="#latest-stable-release-0-14-4" class="md2man-permalink" title="permalink"></a></h1><p>Changes: <a href="https://gitlab.com/o9000/tint2/blob/0.14.4/ChangeLog">https://gitlab.com/o9000/tint2/blob/0.14.4/ChangeLog</a></p><p>Documentation: <a href="manual.html">manual.html</a></p><p>Compile it with (after you install the <a href="https://gitlab.com/o9000/tint2/wikis/Install#dependencies">dependencies</a>):</p><pre class="highlight plaintext"><code>git clone https://gitlab.com/o9000/tint2.git
cd tint2 cd tint2
git checkout 0.14.3 git checkout 0.14.4
mkdir build mkdir build
cd build cd build
cmake .. cmake ..

View File

@@ -1,4 +1,4 @@
.TH TINT2 1 "2017\-04\-23" 0.14.3 .TH TINT2 1 "2017\-04\-29" 0.14.4
.SH NAME .SH NAME
.PP .PP
tint2 \- lightweight panel/taskbar tint2 \- lightweight panel/taskbar

View File

@@ -1,4 +1,4 @@
# TINT2 1 "2017-04-23" 0.14.3 # TINT2 1 "2017-04-29" 0.14.4
## NAME ## NAME
tint2 - lightweight panel/taskbar tint2 - lightweight panel/taskbar

View File

@@ -237,4 +237,4 @@ if __name__ == '__main__':
run("tar -xzf tint2-%s.tar.gz" % readable_version) run("tar -xzf tint2-%s.tar.gz" % readable_version)
run("cd tint2-%s ; mkdir build ; cd build ; cmake .. ; make" % readable_version) run("cd tint2-%s ; mkdir build ; cd build ; cmake .. ; make" % readable_version)
assert_equal(run("./tint2-%s/build/tint2 -v" % readable_version).strip(), "tint2 version %s" % readable_version) assert_equal(run("./tint2-%s/build/tint2 -v" % readable_version).strip(), "tint2 version %s" % readable_version)
os.system("git log -p -1") os.system("git log -p -1 --word-diff")

View File

@@ -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);
} }

View File

@@ -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();

View File

@@ -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)

View File

@@ -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);
} }

View File

@@ -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

View File

@@ -588,8 +588,10 @@ 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);
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)
g_tree_insert(execp->backend->cmd_pids, GINT_TO_POINTER(pid), GINT_TO_POINTER(1));
} else { } else {
execp_force_update(execp); execp_force_update(execp);
} }

View File

@@ -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

View File

@@ -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();

View File

@@ -276,25 +276,25 @@ void task_update_icon(Task *task)
Imlib_Image img = NULL; Imlib_Image img = NULL;
if (!img) { if (!img) {
int i; int len;
gulong *data = server_get_property(task->win, server.atom._NET_WM_ICON, XA_CARDINAL, &i); gulong *data = server_get_property(task->win, server.atom._NET_WM_ICON, XA_CARDINAL, &len);
if (data) { if (data && len > 0) {
// get ARGB icon // get ARGB icon
int w, h; int w, h;
gulong *tmp_data; gulong *tmp_data = get_best_icon(data, get_icon_count(data, len), len, &w, &h, panel->g_task.icon_size1);
if (tmp_data) {
tmp_data = get_best_icon(data, get_icon_count(data, i), i, &w, &h, panel->g_task.icon_size1); DATA32 icon_data[w * h];
DATA32 icon_data[w * h]; for (int j = 0; j < w * h; ++j)
for (int j = 0; j < w * h; ++j) icon_data[j] = tmp_data[j];
icon_data[j] = tmp_data[j]; img = imlib_create_image_using_copied_data(w, h, icon_data);
img = imlib_create_image_using_copied_data(w, h, icon_data); if (0 && img)
if (0 && img) fprintf(stderr,
fprintf(stderr, "%s: Got %dx%d icon via _NET_WM_ICON for %s\n",
"%s: Got %dx%d icon via _NET_WM_ICON for %s\n", __FUNCTION__,
__FUNCTION__, w,
w, h,
h, task->title ? task->title : "task");
task->title ? task->title : "task"); }
XFree(data); XFree(data);
} }
} }

View File

@@ -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.

View File

@@ -103,22 +103,121 @@ gboolean parse_line(const char *line, char **key, char **value)
extern char *config_path; extern char *config_path;
void 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; return -1;
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);
}
command = g_strdup_printf("export TINT2_CONFIG=%s;"
"%s",
config_path,
command);
if (!command) if (!command)
return; 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 @@ void tint_exec(const char *command, const char *dir, const char *tooltip, Time t
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 @@ void tint_exec(const char *command, const char *dir, const char *tooltip, Time t
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,18 +253,20 @@ void tint_exec(const char *command, const char *dir, const char *tooltip, Time t
_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);
} }
#endif // HAVE_SN #endif // HAVE_SN
} }
return pid;
} }
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)
{ {

View File

@@ -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.
void 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.

View File

@@ -277,6 +277,9 @@ int get_icon_count(gulong *data, int num)
gulong *get_best_icon(gulong *data, int icon_count, int num, int *iw, int *ih, int best_icon_size) gulong *get_best_icon(gulong *data, int icon_count, int num, int *iw, int *ih, int best_icon_size)
{ {
if (icon_count < 1 || num < 1)
return NULL;
int width[icon_count], height[icon_count], pos, i, w, h; int width[icon_count], height[icon_count], pos, i, w, h;
gulong *icon_data[icon_count]; gulong *icon_data[icon_count];