Compare commits

...

27 Commits

Author SHA1 Message Date
o9000
5a5d8fd978 Release 0.12.11 2016-05-14 08:39:54 +02:00
o9000
e09c4a0642 tint2conf: changed window title 2016-05-14 08:16:10 +02:00
o9000
c1eb404095 Update themes 2016-05-09 12:27:27 +02:00
o9000
7b3769da2a Update changelog 2016-05-09 12:22:05 +02:00
o9000
cc49e4026e tint2conf: Update translations 2016-05-09 12:20:31 +02:00
o9000
385f4fd25b tint2conf: Regenerate po files 2016-05-09 12:18:05 +02:00
o9000
6c00321262 tint2conf: Update pot file 2016-05-09 12:17:30 +02:00
o9000
aa77f05a98 tint2conf: Add extension if missing in save as dialog 2016-05-09 12:16:56 +02:00
o9000
ccd590e397 tint2conf: Workaround for a GTK quirk to prevent a crash when adding backgrounds 2016-05-07 20:13:13 +02:00
o9000
4ee1e8f2fa Release 0.12.10 2016-05-07 09:34:12 +02:00
o9000
690f30308f Fixed crash in systray with non-Latin languagess (thanks zcodes) 2016-05-07 00:38:52 +02:00
o9000
fea91746a4 Battery: do not show negative durations when the sensors return garbage 2016-04-23 11:54:38 +02:00
o9000
9d8350dabc Invalidate cached pixmaps on resize/move (issue #576) 2016-04-22 23:47:28 +02:00
o9000
a6879ea2a5 Proper workaround for issue #555 2016-04-22 23:16:26 +02:00
o9000
d2b32d528f Release 0.12.9 2016-04-02 14:11:01 +02:00
o9000
ad675495e6 Position task icon correctly (issue #575) 2016-03-29 14:59:02 +02:00
o9000
48e7e38b11 Compute task button size correctly if max size is 0 (issue #575) 2016-03-29 14:35:24 +02:00
o9000
dc191668fe Revert 580c3e76 (issue #572) 2016-03-28 20:26:47 +02:00
o9000
955be3658b Use imlib2 for taking screenshot; if it fails, use Xlib (issue #574) 2016-03-27 23:27:34 +02:00
o9000
dcc163ec0b Do not use imlib2 for taking screenshot (issue #574) 2016-03-27 23:23:55 +02:00
o9000
14716d41b9 Do not use imlib2 for taking screenshot (issue #574) 2016-03-27 23:17:03 +02:00
o9000
9018313fb2 Print error message if default_icon.png cannot be loaded (issue #574) 2016-03-27 17:33:42 +02:00
o9000
92b391a1b2 tint2conf: Show Loading when drawing themes; use different heights per row 2016-03-26 14:17:33 +01:00
o9000
b023229600 Battery: do not sample too often if the battery level changes slowly (and there is no support for reading current/power) 2016-03-26 13:36:49 +01:00
o9000
82b71ec5b6 Update changelog 2016-03-25 11:15:21 +01:00
o9000
1edaf21bde Add area.name, useful for debugging 2016-03-25 11:13:05 +01:00
o9000
76bd4baa9c Ignore empty areas for mouse events 2016-03-25 11:12:26 +01:00
33 changed files with 1722 additions and 1674 deletions

View File

@@ -1,3 +1,24 @@
2016-05-14 0.12.11
- Fixes:
- tint2conf:
- Fixed crash in tint2conf when adding background
- Add correct extension to file name in tint2conf for 'Save as'
- Changed main window title in tint2conf
2016-05-07 0.12.10
- Fixes:
- Fixed crash in systray with non-Latin languagess (thanks zcodes)
- Invalidate cached pixmaps on resize/move (issue #576)
- Battery: do not show negative durations when the sensors return garbage
- Proper workaround for issue #555
2016-04-02 0.12.9
- Fixes:
- Regression: Do not detect empty areas as clickable (issue #572)
- Regression: Position and resize task icon correctly (issue #575)
- Use imlib2 for taking screenshot; if it fails, use Xlib (issue #574)
- Battery: lower sample frequency when there is no support for reading current/power
2016-03-25 0.12.8 2016-03-25 0.12.8
- Major changes (see details below): - Major changes (see details below):
- Icon cache and lazy icon theme loading to improve performance in tint2 and tint2conf - Icon cache and lazy icon theme loading to improve performance in tint2 and tint2conf

View File

@@ -1,26 +1,26 @@
# New stable release: 0.12.8 # Latest stable release: 0.12.11
Changes: https://gitlab.com/o9000/tint2/blob/0.12.8/ChangeLog Changes: https://gitlab.com/o9000/tint2/blob/0.12.11/ChangeLog
Documentation: https://gitlab.com/o9000/tint2/wikis/Configure Documentation: https://gitlab.com/o9000/tint2/wikis/Configure
Try it out with (see also [dependencies](https://gitlab.com/o9000/tint2/wikis/Install#dependencies)): Compile it with (see also [dependencies](https://gitlab.com/o9000/tint2/wikis/Install#dependencies)):
``` ```
git clone https://gitlab.com/o9000/tint2.git git clone https://gitlab.com/o9000/tint2.git
cd tint2 cd tint2
git checkout 0.12.8 git checkout 0.12.11
mkdir build mkdir build
cd build cd build
cmake .. cmake ..
make -j4 make -j4
./tint2 &
./src/tint2conf/tint2conf &
``` ```
To install from source, also run (as root): To install, run (as root):
``` ```
make install make install
``` ```
And then you can run the panel `tint2` and the configuration program `tint2conf`.
Please report any problems to https://gitlab.com/o9000/tint2/issues. Your feedback is much appreciated. Please report any problems to https://gitlab.com/o9000/tint2/issues. Your feedback is much appreciated.
P.S. GitLab is now the official location of the tint2 project, migrated from Google Code, which is shutting down. In case you are wondering why not GitHub, BitBucket etc., we chose GitLab because it is open source, it is mature and works well, looks cool and has a very nice team. P.S. GitLab is now the official location of the tint2 project, migrated from Google Code, which is shutting down. In case you are wondering why not GitHub, BitBucket etc., we chose GitLab because it is open source, it is mature and works well, looks cool and has a very nice team.
@@ -69,10 +69,10 @@ tint2 is a simple panel/taskbar made for modern X window managers. It was specif
# Screenshots # Screenshots
## Default config of the latest release: ## Default config:
![Screenshot_2016-01-23_14-42-57](https://gitlab.com/o9000/tint2/uploads/948fa74eca60864352a033580350b4c3/Screenshot_2016-01-23_14-42-57.png) ![Screenshot_2016-01-23_14-42-57](https://gitlab.com/o9000/tint2/uploads/948fa74eca60864352a033580350b4c3/Screenshot_2016-01-23_14-42-57.png)
## Various configurations: ## Various configs:
![screenshot](https://gitlab.com/o9000/tint2/wikis/screenshot.png) ![screenshot](https://gitlab.com/o9000/tint2/wikis/screenshot.png)

View File

@@ -150,6 +150,7 @@ void init_battery_panel(void *p)
battery->area.parent = p; battery->area.parent = p;
battery->area.panel = p; battery->area.panel = p;
snprintf(battery->area.name, sizeof(battery->area.name), "Battery");
battery->area._draw_foreground = draw_battery; battery->area._draw_foreground = draw_battery;
battery->area.size_mode = LAYOUT_FIXED; battery->area.size_mode = LAYOUT_FIXED;
battery->area._resize = resize_battery; battery->area._resize = resize_battery;

View File

@@ -306,6 +306,7 @@ static gboolean update_linux_battery(struct psy_battery *bat)
gint64 old_timestamp = bat->timestamp; gint64 old_timestamp = bat->timestamp;
int old_energy_now = bat->energy_now; int old_energy_now = bat->energy_now;
gint old_power_now = bat->power_now;
/* reset values */ /* reset values */
bat->present = 0; bat->present = 0;
@@ -356,6 +357,12 @@ static gboolean update_linux_battery(struct psy_battery *bat)
/* some hardware does not support reading current power consumption */ /* some hardware does not support reading current power consumption */
g_error_free(error); g_error_free(error);
bat->power_now = estimate_power_usage(bat, old_energy_now, old_timestamp); bat->power_now = estimate_power_usage(bat, old_energy_now, old_timestamp);
if (bat->power_now == 0 && bat->status != BATTERY_FULL) {
/* If the hardware updates the level slower than our sampling period,
* we need to sample more rarely */
bat->power_now = old_power_now;
bat->timestamp = old_timestamp;
}
} else if (error) { } else if (error) {
g_error_free(error); g_error_free(error);
return FALSE; return FALSE;
@@ -430,6 +437,7 @@ int battery_os_update(BatteryState *state)
seconds = 3600 * (total_energy_full - total_energy_now) / total_power_now; seconds = 3600 * (total_energy_full - total_energy_now) / total_power_now;
else if (state->state == BATTERY_DISCHARGING) else if (state->state == BATTERY_DISCHARGING)
seconds = 3600 * total_energy_now / total_power_now; seconds = 3600 * total_energy_now / total_power_now;
seconds = MAX(0, seconds);
} }
battery_state_set_time(state, seconds); battery_state_set_time(state, seconds);

View File

@@ -180,6 +180,7 @@ void init_clock_panel(void *p)
clock_init_fonts(); clock_init_fonts();
clock->area.parent = p; clock->area.parent = p;
clock->area.panel = p; clock->area.panel = p;
snprintf(clock->area.name, sizeof(clock->area.name), "Clock");
clock->area._is_under_mouse = full_width_area_is_under_mouse; clock->area._is_under_mouse = full_width_area_is_under_mouse;
clock->area.has_mouse_press_effect = clock->area.has_mouse_over_effect = clock->area.has_mouse_press_effect = clock->area.has_mouse_over_effect =
panel_config.mouse_effects && (clock_lclick_command || clock_mclick_command || clock_rclick_command || panel_config.mouse_effects && (clock_lclick_command || clock_mclick_command || clock_rclick_command ||

View File

@@ -155,9 +155,9 @@ void init_execp_panel(void *p)
execp->area.paddingx = execp->backend->paddingx; execp->area.paddingx = execp->backend->paddingx;
execp->area.paddingy = execp->backend->paddingy; execp->area.paddingy = execp->backend->paddingy;
execp->area.paddingxlr = execp->backend->paddingxlr; execp->area.paddingxlr = execp->backend->paddingxlr;
execp->area.parent = panel; execp->area.parent = panel;
execp->area.panel = panel; execp->area.panel = panel;
snprintf(execp->area.name, sizeof(execp->area.name), "Execp %s", execp->backend->command ? execp->backend->command : "null");
execp->area._draw_foreground = draw_execp; execp->area._draw_foreground = draw_execp;
execp->area.size_mode = LAYOUT_FIXED; execp->area.size_mode = LAYOUT_FIXED;
execp->area._resize = resize_execp; execp->area._resize = resize_execp;

View File

@@ -39,6 +39,7 @@ void init_freespace_panel(void *p)
freespace->area.bg = &g_array_index(backgrounds, Background, 0); freespace->area.bg = &g_array_index(backgrounds, Background, 0);
freespace->area.parent = p; freespace->area.parent = p;
freespace->area.panel = p; freespace->area.panel = p;
snprintf(freespace->area.name, sizeof(freespace->area.name), "Freespace");
freespace->area.size_mode = LAYOUT_FIXED; freespace->area.size_mode = LAYOUT_FIXED;
freespace->area.resize_needed = 1; freespace->area.resize_needed = 1;
freespace->area.on_screen = TRUE; freespace->area.on_screen = TRUE;

View File

@@ -83,6 +83,7 @@ void init_launcher_panel(void *p)
launcher->area.parent = p; launcher->area.parent = p;
launcher->area.panel = p; launcher->area.panel = p;
snprintf(launcher->area.name, sizeof(launcher->area.name), "Launcher");
launcher->area._draw_foreground = NULL; launcher->area._draw_foreground = NULL;
launcher->area.size_mode = LAYOUT_FIXED; launcher->area.size_mode = LAYOUT_FIXED;
launcher->area._resize = resize_launcher; launcher->area._resize = resize_launcher;
@@ -452,6 +453,7 @@ void launcher_load_icons(Launcher *launcher)
if (entry.exec) { if (entry.exec) {
LauncherIcon *launcherIcon = calloc(1, sizeof(LauncherIcon)); LauncherIcon *launcherIcon = calloc(1, sizeof(LauncherIcon));
launcherIcon->area.panel = launcher->area.panel; launcherIcon->area.panel = launcher->area.panel;
snprintf(launcherIcon->area.name, sizeof(launcherIcon->area.name), "LauncherIcon %s", entry.name ? entry.name : "null");
launcherIcon->area._draw_foreground = draw_launcher_icon; launcherIcon->area._draw_foreground = draw_launcher_icon;
launcherIcon->area.size_mode = LAYOUT_FIXED; launcherIcon->area.size_mode = LAYOUT_FIXED;
launcherIcon->area._resize = NULL; launcherIcon->area._resize = NULL;

View File

@@ -99,6 +99,7 @@ void default_panel()
backgrounds = g_array_new(0, 0, sizeof(Background)); backgrounds = g_array_new(0, 0, sizeof(Background));
memset(&panel_config, 0, sizeof(Panel)); memset(&panel_config, 0, sizeof(Panel));
snprintf(panel_config.area.name, sizeof(panel_config.area.name), "Panel");
panel_config.mouse_over_alpha = 100; panel_config.mouse_over_alpha = 100;
panel_config.mouse_over_saturation = 0; panel_config.mouse_over_saturation = 0;
panel_config.mouse_over_brightness = 10; panel_config.mouse_over_brightness = 10;
@@ -196,6 +197,7 @@ void init_panel()
p->area.bg = &g_array_index(backgrounds, Background, 0); p->area.bg = &g_array_index(backgrounds, Background, 0);
p->area.parent = p; p->area.parent = p;
p->area.panel = p; p->area.panel = p;
snprintf(p->area.name, sizeof(p->area.name), "Panel %d", i);
p->area.on_screen = TRUE; p->area.on_screen = TRUE;
p->area.resize_needed = 1; p->area.resize_needed = 1;
p->area.size_mode = LAYOUT_DYNAMIC; p->area.size_mode = LAYOUT_DYNAMIC;
@@ -601,6 +603,21 @@ void place_panel_all_desktops(Panel *p)
num_atoms); num_atoms);
} }
void replace_panel_all_desktops(Panel *p)
{
XClientMessageEvent m;
memset(&m, 0, sizeof(m));
m.type = ClientMessage;
m.send_event = True;
m.display = server.display;
m.window = p->main_win;
m.message_type = server.atom._NET_WM_DESKTOP;
m.format = 32;
m.data.l[0] = ALL_DESKTOPS;
XSendEvent(server.display, server.root_win, False, SubstructureRedirectMask | SubstructureNotifyMask, (XEvent *)&m);
XSync(server.display, False);
}
void set_panel_properties(Panel *p) void set_panel_properties(Panel *p)
{ {
XStoreName(server.display, p->main_win, panel_window_name); XStoreName(server.display, p->main_win, panel_window_name);

View File

@@ -155,6 +155,7 @@ void render_panel(Panel *panel);
void set_panel_items_order(Panel *p); void set_panel_items_order(Panel *p);
void place_panel_all_desktops(Panel *p); void place_panel_all_desktops(Panel *p);
void replace_panel_all_desktops(Panel *p);
void set_panel_properties(Panel *p); void set_panel_properties(Panel *p);
// draw background panel // draw background panel

View File

@@ -33,6 +33,7 @@
#include "systraybar.h" #include "systraybar.h"
#include "server.h" #include "server.h"
#include "panel.h" #include "panel.h"
#include "window.h"
GSList *icons; GSList *icons;
@@ -113,6 +114,7 @@ void init_systray_panel(void *p)
Panel *panel = (Panel *)p; Panel *panel = (Panel *)p;
systray.area.parent = panel; systray.area.parent = panel;
systray.area.panel = panel; systray.area.panel = panel;
snprintf(systray.area.name, sizeof(systray.area.name), "Systray");
if (!systray.area.bg) if (!systray.area.bg)
systray.area.bg = &g_array_index(backgrounds, Background, 0); systray.area.bg = &g_array_index(backgrounds, Background, 0);
show(&systray.area); show(&systray.area);
@@ -533,15 +535,7 @@ gboolean add_icon(Window win)
XSelectInput(server.display, win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask); XSelectInput(server.display, win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask);
XTextProperty xname; char *name = get_window_name(win);
char *name;
if (XGetWMName(server.display, win, &xname)) {
name = strdup((char *)xname.value);
XFree(xname.value);
} else {
name = strdup("");
}
if (systray_profile) if (systray_profile)
fprintf(stderr, "[%f] %s:%d win = %lu (%s)\n", profiling_get_time(), __FUNCTION__, __LINE__, win, name); fprintf(stderr, "[%f] %s:%d win = %lu (%s)\n", profiling_get_time(), __FUNCTION__, __LINE__, win, name);
Panel *panel = systray.area.panel; Panel *panel = systray.area.panel;
@@ -1067,15 +1061,7 @@ void systray_property_notify(TrayWindow *traywin, XEvent *e)
Atom at = e->xproperty.atom; Atom at = e->xproperty.atom;
if (at == server.atom.WM_NAME) { if (at == server.atom.WM_NAME) {
free(traywin->name); free(traywin->name);
traywin->name = get_window_name(traywin->win);
XTextProperty xname;
if (XGetWMName(server.display, traywin->win, &xname)) {
traywin->name = strdup((char *)xname.value);
XFree(xname.value);
} else {
traywin->name = strdup("");
}
if (systray.sort == SYSTRAY_SORT_ASCENDING || systray.sort == SYSTRAY_SORT_DESCENDING) { if (systray.sort == SYSTRAY_SORT_ASCENDING || systray.sort == SYSTRAY_SORT_DESCENDING) {
systray.list_icons = g_slist_sort(systray.list_icons, compare_traywindows); systray.list_icons = g_slist_sort(systray.list_icons, compare_traywindows);
// print_icons(); // print_icons();

View File

@@ -65,6 +65,7 @@ Task *add_task(Window win)
Task task_template; Task task_template;
memset(&task_template, 0, sizeof(task_template)); memset(&task_template, 0, sizeof(task_template));
snprintf(task_template.area.name, sizeof(task_template.area.name), "Task %d", (int)win);
task_template.area.has_mouse_over_effect = panel_config.mouse_effects; task_template.area.has_mouse_over_effect = panel_config.mouse_effects;
task_template.area.has_mouse_press_effect = panel_config.mouse_effects; task_template.area.has_mouse_press_effect = panel_config.mouse_effects;
task_template.area._is_under_mouse = full_width_area_is_under_mouse; task_template.area._is_under_mouse = full_width_area_is_under_mouse;
@@ -82,6 +83,7 @@ Task *add_task(Window win)
} }
task_update_title(&task_template); task_update_title(&task_template);
task_update_icon(&task_template); task_update_icon(&task_template);
snprintf(task_template.area.name, sizeof(task_template.area.name), "Task %d %s", (int)win, task_template.title ? task_template.title : "null");
// fprintf(stderr, "%s %d: win = %ld, task = %s\n", __FUNCTION__, __LINE__, win, task_template.title ? // fprintf(stderr, "%s %d: win = %ld, task = %s\n", __FUNCTION__, __LINE__, win, task_template.title ?
// task_template.title : "??"); // task_template.title : "??");
@@ -367,7 +369,7 @@ void draw_task_icon(Task *task, int text_width)
else else
pos_x = (task->area.width - panel->g_task.icon_size1) / 2; pos_x = (task->area.width - panel->g_task.icon_size1) / 2;
} else { } else {
pos_x = panel->g_task.area.paddingxlr + task->area.bg->border.width; pos_x = task->area.bg->border.width + task->area.paddingxlr;
} }
// Render // Render
@@ -386,12 +388,12 @@ void draw_task_icon(Task *task, int text_width)
} }
imlib_context_set_image(image); imlib_context_set_image(image);
render_image(task->area.pix, pos_x, panel->g_task.icon_posy); render_image(task->area.pix, pos_x, (task->area.height - panel->g_task.icon_size1) / 2);
if (0) { if (0) {
fprintf(stderr, "Task icon size: %d %d pos %d\n", imlib_image_get_width(), imlib_image_get_height(), pos_x); fprintf(stderr, "Task icon size: %d %d pos %d %d\n", imlib_image_get_width(), imlib_image_get_height(), pos_x, panel->g_task.icon_posy);
fprintf(stderr, "Task max size : %d %d\n", panel->g_task.maximum_width, panel->g_task.maximum_height); fprintf(stderr, "Task max size : %d %d\n", panel->g_task.maximum_width, panel->g_task.maximum_height);
fprintf(stderr, "Task area size: %d %d\n", task->area.width, task->area.height); fprintf(stderr, "Task area size: %d %d\n", task->area.width, task->area.height);
fprintf(stderr, "Task area bord: %d\n", task->area.bg->border.width); fprintf(stderr, "Task border : %d\n", task->area.bg->border.width);
fprintf(stderr, "\n"); fprintf(stderr, "\n");
} }
} }

View File

@@ -147,6 +147,7 @@ void init_taskbar_panel(void *p)
// taskbar name // taskbar name
panel->g_taskbar.area_name.panel = panel; panel->g_taskbar.area_name.panel = panel;
snprintf(panel->g_taskbar.area_name.name, sizeof(panel->g_taskbar.area_name.name), "Taskbarname");
panel->g_taskbar.area_name.size_mode = LAYOUT_FIXED; panel->g_taskbar.area_name.size_mode = LAYOUT_FIXED;
panel->g_taskbar.area_name._resize = resize_taskbarname; panel->g_taskbar.area_name._resize = resize_taskbarname;
panel->g_taskbar.area_name._is_under_mouse = full_width_area_is_under_mouse; panel->g_taskbar.area_name._is_under_mouse = full_width_area_is_under_mouse;
@@ -158,6 +159,7 @@ void init_taskbar_panel(void *p)
// taskbar // taskbar
panel->g_taskbar.area.parent = panel; panel->g_taskbar.area.parent = panel;
panel->g_taskbar.area.panel = panel; panel->g_taskbar.area.panel = panel;
snprintf(panel->g_taskbar.area.name, sizeof(panel->g_taskbar.area.name), "Taskbar");
panel->g_taskbar.area.size_mode = LAYOUT_DYNAMIC; panel->g_taskbar.area.size_mode = LAYOUT_DYNAMIC;
panel->g_taskbar.area.alignment = taskbar_alignment; panel->g_taskbar.area.alignment = taskbar_alignment;
panel->g_taskbar.area._resize = resize_taskbar; panel->g_taskbar.area._resize = resize_taskbar;
@@ -178,6 +180,7 @@ void init_taskbar_panel(void *p)
// task // task
panel->g_task.area.panel = panel; panel->g_task.area.panel = panel;
snprintf(panel->g_task.area.name, sizeof(panel->g_task.area.name), "Task");
panel->g_task.area.size_mode = LAYOUT_DYNAMIC; panel->g_task.area.size_mode = LAYOUT_DYNAMIC;
panel->g_task.area._draw_foreground = draw_task; panel->g_task.area._draw_foreground = draw_task;
panel->g_task.area._on_change_layout = on_change_task; panel->g_task.area._on_change_layout = on_change_task;
@@ -220,10 +223,16 @@ void init_taskbar_panel(void *p)
if ((panel->g_task.config_background_mask & (1 << TASK_URGENT)) == 0) if ((panel->g_task.config_background_mask & (1 << TASK_URGENT)) == 0)
panel->g_task.background[TASK_URGENT] = panel->g_task.background[TASK_ACTIVE]; panel->g_task.background[TASK_URGENT] = panel->g_task.background[TASK_ACTIVE];
if (!panel->g_task.maximum_width)
panel->g_task.maximum_width = server.monitors[panel->monitor].width;
if (!panel->g_task.maximum_height)
panel->g_task.maximum_height = server.monitors[panel->monitor].height;
if (panel_horizontal) { if (panel_horizontal) {
panel->g_task.area.posy = panel->g_taskbar.area.posy + panel->g_task.area.posy = panel->g_taskbar.area.posy +
panel->g_taskbar.background[TASKBAR_NORMAL]->border.width + panel->g_taskbar.background[TASKBAR_NORMAL]->border.width +
panel->g_taskbar.area.paddingy; panel->g_taskbar.area.paddingy;
panel->g_task.area.width = panel->g_task.maximum_width;
panel->g_task.area.height = panel->area.height - (2 * panel->g_task.area.posy); panel->g_task.area.height = panel->area.height - (2 * panel->g_task.area.posy);
} else { } else {
panel->g_task.area.posx = panel->g_taskbar.area.posx + panel->g_task.area.posx = panel->g_taskbar.area.posx +
@@ -259,19 +268,26 @@ void init_taskbar_panel(void *p)
PANGO_ELLIPSIZE_END, PANGO_ELLIPSIZE_END,
FALSE); FALSE);
if (!panel->g_task.maximum_width && panel_horizontal)
panel->g_task.maximum_width = server.monitors[panel->monitor].width;
panel->g_task.text_posx = panel->g_task.background[0]->border.width + panel->g_task.area.paddingxlr; panel->g_task.text_posx = panel->g_task.background[0]->border.width + panel->g_task.area.paddingxlr;
panel->g_task.text_height = panel->g_task.area.height - (2 * panel->g_task.area.paddingy); panel->g_task.text_height = panel->g_task.area.height - (2 * panel->g_task.area.paddingy);
if (panel->g_task.has_icon) { if (panel->g_task.has_icon) {
panel->g_task.icon_size1 = panel->g_task.icon_size1 =
MIN(panel->g_task.maximum_width, MIN(panel->g_task.maximum_height, panel->g_task.area.height)) - MIN(MIN(panel->g_task.maximum_width, panel->g_task.maximum_height),
MIN(panel->g_task.area.width, panel->g_task.area.height)) -
(2 * panel->g_task.area.paddingy) - 2 * panel->g_task.area.bg->border.width; (2 * panel->g_task.area.paddingy) - 2 * panel->g_task.area.bg->border.width;
panel->g_task.text_posx += panel->g_task.icon_size1 + panel->g_task.area.paddingx; panel->g_task.text_posx += panel->g_task.icon_size1 + panel->g_task.area.paddingx;
panel->g_task.icon_posy = (panel->g_task.area.height - panel->g_task.icon_size1) / 2; panel->g_task.icon_posy = (panel->g_task.area.height - panel->g_task.icon_size1) / 2;
if (0)
printf("task: icon_size = %d, textx = %f, texth = %f, icony = %d, w = %d, h = %d, maxw = %d, maxh = %d\n",
panel->g_task.icon_size1,
panel->g_task.text_posx,
panel->g_task.text_height,
panel->g_task.icon_posy,
panel->g_task.area.width,
panel->g_task.area.height,
panel->g_task.maximum_width,
panel->g_task.maximum_height);
} }
// printf("monitor %d, task_maximum_width %d\n", panel->monitor, panel->g_task.maximum_width);
Taskbar *taskbar; Taskbar *taskbar;
panel->num_desktops = server.num_desktops; panel->num_desktops = server.num_desktops;

View File

@@ -505,6 +505,11 @@ void init_X11_post_config()
default_icon = imlib_load_image(path); default_icon = imlib_load_image(path);
g_free(path); g_free(path);
} }
if (!default_icon) {
fprintf(stderr,
RED "Could not load default_icon.png. Please check that tint2 has been installed correctly!" RESET
"\n");
}
} }
void cleanup() void cleanup()
@@ -560,18 +565,45 @@ void get_snapshot(const char *path)
XCreatePixmap(server.display, server.root_win, panel->area.width, panel->area.height, server.depth); XCreatePixmap(server.display, server.root_win, panel->area.width, panel->area.height, server.depth);
render_panel(panel); render_panel(panel);
Imlib_Image img = NULL; XSync(server.display, False);
imlib_context_set_drawable(panel->temp_pmap);
img = imlib_create_image_from_drawable(0, 0, 0, panel->area.width, panel->area.height, 0);
imlib_context_set_image(img); imlib_context_set_drawable(panel->temp_pmap);
if (!panel_horizontal) { Imlib_Image img = imlib_create_image_from_drawable(0, 0, 0, panel->area.width, panel->area.height, 1);
// rotate 90° vertical panel
imlib_image_flip_horizontal(); if (!img) {
imlib_image_flip_diagonal(); XImage *ximg =
XGetImage(server.display, panel->temp_pmap, 0, 0, panel->area.width, panel->area.height, AllPlanes, ZPixmap);
if (ximg) {
DATA32 *pixels = calloc(panel->area.width * panel->area.height, sizeof(DATA32));
for (int x = 0; x < panel->area.width; x++) {
for (int y = 0; y < panel->area.height; y++) {
DATA32 xpixel = XGetPixel(ximg, x, y);
DATA32 r = (xpixel >> 16) & 0xff;
DATA32 g = (xpixel >> 8) & 0xff;
DATA32 b = (xpixel >> 0) & 0xff;
DATA32 a = 0x0;
DATA32 argb = (a << 24) | (r << 16) | (g << 8) | b;
pixels[y * panel->area.width + x] = argb;
}
}
XDestroyImage(ximg);
img = imlib_create_image_using_data(panel->area.width, panel->area.height, pixels);
}
}
if (img) {
imlib_context_set_image(img);
if (!panel_horizontal) {
// rotate 90° vertical panel
imlib_image_flip_horizontal();
imlib_image_flip_diagonal();
}
imlib_save_image(path);
imlib_free_image();
} }
imlib_save_image(path);
imlib_free_image();
} }
void window_action(Task *task, MouseAction action) void window_action(Task *task, MouseAction action)
@@ -953,7 +985,7 @@ void event_property_notify(XEvent *e)
Panel *p = &panels[i]; Panel *p = &panels[i];
if (win == p->main_win) { if (win == p->main_win) {
if (at == server.atom._NET_WM_DESKTOP && get_window_desktop(p->main_win) != ALL_DESKTOPS) if (at == server.atom._NET_WM_DESKTOP && get_window_desktop(p->main_win) != ALL_DESKTOPS)
place_panel_all_desktops(p); replace_panel_all_desktops(p);
return; return;
} }
} }

View File

@@ -237,7 +237,7 @@ int main(int argc, char **argv)
// define main layout : container, menubar, toolbar // define main layout : container, menubar, toolbar
g_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(g_window), _("Panel theming")); gtk_window_set_title(GTK_WINDOW(g_window), _("Tint2 panel themes"));
gtk_window_resize(GTK_WINDOW(g_window), 920, 600); gtk_window_resize(GTK_WINDOW(g_window), 920, 600);
g_signal_connect(G_OBJECT(g_window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(g_window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
vBox = gtk_vbox_new(FALSE, 0); vBox = gtk_vbox_new(FALSE, 0);
@@ -418,13 +418,38 @@ static void menuSaveAs()
GTK_RESPONSE_ACCEPT, GTK_RESPONSE_ACCEPT,
NULL); NULL);
GtkFileChooser *chooser = GTK_FILE_CHOOSER(dialog); GtkFileChooser *chooser = GTK_FILE_CHOOSER(dialog);
gtk_file_chooser_set_do_overwrite_confirmation(chooser, TRUE); gtk_file_chooser_set_do_overwrite_confirmation(chooser, FALSE);
gchar *config_dir = g_build_filename(g_get_home_dir(), ".config", "tint2", NULL); gchar *config_dir = g_build_filename(g_get_home_dir(), ".config", "tint2", NULL);
gtk_file_chooser_set_current_folder(chooser, config_dir); gtk_file_chooser_set_current_folder(chooser, config_dir);
g_free(config_dir); g_free(config_dir);
GtkFileFilter *filter = gtk_file_filter_new();
gtk_file_filter_add_pattern(filter, "*.tint2rc");
gtk_file_filter_add_pattern(filter, "tint2rc");
gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter);
gtk_file_chooser_set_current_name(chooser, filename); gtk_file_chooser_set_current_name(chooser, filename);
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
gchar *newpath = gtk_file_chooser_get_filename(chooser); gchar *newpath = gtk_file_chooser_get_filename(chooser);
if (!endswith(newpath, ".tint2rc") && !endswith(newpath, "/tint2rc")) {
gchar *proper_path = g_strdup_printf("%s.tint2rc", newpath);
g_free(newpath);
newpath = proper_path;
}
if (g_file_test(newpath, G_FILE_TEST_EXISTS)) {
GtkWidget *w = gtk_message_dialog_new(GTK_WINDOW(g_window),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_QUESTION,
GTK_BUTTONS_YES_NO,
_("A file named \"%s\" already exists. Do you want to replace it?"),
newpath);
gint response = gtk_dialog_run(GTK_DIALOG(w));
gtk_widget_destroy(w);
if (response != GTK_RESPONSE_YES) {
g_free(newpath);
gtk_widget_destroy(dialog);
g_free(filepath);
return;
}
}
import_with_overwrite(filepath, newpath); import_with_overwrite(filepath, newpath);
g_free(newpath); g_free(newpath);
} }

View File

@@ -18,3 +18,4 @@
gboolean update_snapshot(); gboolean update_snapshot();
void menuApply(); void menuApply();
void refresh_current_theme(); void refresh_current_theme();
extern GtkWidget *g_window;

View File

@@ -2059,7 +2059,7 @@ msgid "tint2conf"
msgstr "tint2conf" msgstr "tint2conf"
#: ../main.c:240 #: ../main.c:240
msgid "Panel theming" msgid "Tint2 panel themes"
msgstr "Izgled ploče" msgstr "Izgled ploče"
#: ../main.c:250 #: ../main.c:250
@@ -2189,16 +2189,21 @@ msgstr "Uredi odabranu temu"
msgid "Save theme as" msgid "Save theme as"
msgstr "Snimiti temu kao" msgstr "Snimiti temu kao"
#: ../main.c:446 #: ../main.c:439
#, c-format
msgid "A file named \"%s\" already exists. Do you want to replace it?"
msgstr ""
#: ../main.c:472
#, fuzzy #, fuzzy
msgid "Do you really want to delete the selected theme?" msgid "Do you really want to delete the selected theme?"
msgstr "Uredi odabranu temu" msgstr "Uredi odabranu temu"
#: ../main.c:485 #: ../main.c:511
msgid "Do you really want to reset the selected theme to default?" msgid "Do you really want to reset the selected theme to default?"
msgstr "" msgstr ""
#: ../main.c:653 #: ../main.c:679
msgid "Do you really want to replace the default theme with the selected " msgid "Do you really want to replace the default theme with the selected "
"theme?" "theme?"
msgstr "" msgstr ""

View File

@@ -2117,8 +2117,8 @@ msgid "tint2conf"
msgstr "tint2conf" msgstr "tint2conf"
#: ../main.c:240 #: ../main.c:240
msgid "Panel theming" msgid "Tint2 panel themes"
msgstr "Thème du panel" msgstr "Thème du panel tint2"
#: ../main.c:250 #: ../main.c:250
msgid "Theme" msgid "Theme"
@@ -2240,15 +2240,21 @@ msgstr "Veuillez sélectionner un thème."
msgid "Save theme as" msgid "Save theme as"
msgstr "Enregistrer le thème sous" msgstr "Enregistrer le thème sous"
#: ../main.c:446 #: ../main.c:439
#, c-format
msgid "A file named \"%s\" already exists. Do you want to replace it?"
msgstr "Un fichier nommé « %s » existe déjà. Voulez-vous le remplacer ?"
#: ../main.c:472
msgid "Do you really want to delete the selected theme?" msgid "Do you really want to delete the selected theme?"
msgstr "Voulez-vous vraiment supprimer le thème choisi?" msgstr "Voulez-vous vraiment supprimer le thème choisi?"
#: ../main.c:485 #: ../main.c:511
msgid "Do you really want to reset the selected theme to default?" msgid "Do you really want to reset the selected theme to default?"
msgstr "Voulez-vous vraiment revenir au thème par défaut?" msgstr "Voulez-vous vraiment revenir au thème par défaut?"
#: ../main.c:653 #: ../main.c:679
msgid "Do you really want to replace the default theme with the selected " msgid "Do you really want to replace the default theme with the selected "
"theme?" "theme?"
msgstr "Voulez-vous vraiment remplacer le thème par défaut par celui sélectionné?" msgstr "Voulez-vous vraiment remplacer le thème par défaut par celui "
"sélectionné?"

View File

@@ -2059,7 +2059,7 @@ msgid "tint2conf"
msgstr "tint2conf" msgstr "tint2conf"
#: ../main.c:240 #: ../main.c:240
msgid "Panel theming" msgid "Tint2 panel themes"
msgstr "Izgled ploče" msgstr "Izgled ploče"
#: ../main.c:250 #: ../main.c:250
@@ -2189,16 +2189,21 @@ msgstr "Uredi odabranu temu"
msgid "Save theme as" msgid "Save theme as"
msgstr "Snimiti temu kao" msgstr "Snimiti temu kao"
#: ../main.c:446 #: ../main.c:439
#, c-format
msgid "A file named \"%s\" already exists. Do you want to replace it?"
msgstr "Datoteka imena \"%s\" već postoji. Želite li ju zamjeniti?"
#: ../main.c:472
#, fuzzy #, fuzzy
msgid "Do you really want to delete the selected theme?" msgid "Do you really want to delete the selected theme?"
msgstr "Uredi odabranu temu" msgstr "Uredi odabranu temu"
#: ../main.c:485 #: ../main.c:511
msgid "Do you really want to reset the selected theme to default?" msgid "Do you really want to reset the selected theme to default?"
msgstr "" msgstr ""
#: ../main.c:653 #: ../main.c:679
msgid "Do you really want to replace the default theme with the selected " msgid "Do you really want to replace the default theme with the selected "
"theme?" "theme?"
msgstr "" msgstr ""

View File

@@ -2093,7 +2093,7 @@ msgid "tint2conf"
msgstr "tint2conf" msgstr "tint2conf"
#: ../main.c:240 #: ../main.c:240
msgid "Panel theming" msgid "Tint2 panel themes"
msgstr "Wygląd panelu" msgstr "Wygląd panelu"
#: ../main.c:250 #: ../main.c:250
@@ -2223,16 +2223,21 @@ msgstr "Edycja wybranego motywu"
msgid "Save theme as" msgid "Save theme as"
msgstr "Zapisz motyw jako" msgstr "Zapisz motyw jako"
#: ../main.c:446 #: ../main.c:439
#, c-format
msgid "A file named \"%s\" already exists. Do you want to replace it?"
msgstr "Plik o nazwie \"%s\" już istnieje. Zastąpić go?"
#: ../main.c:472
#, fuzzy #, fuzzy
msgid "Do you really want to delete the selected theme?" msgid "Do you really want to delete the selected theme?"
msgstr "Edycja wybranego motywu" msgstr "Edycja wybranego motywu"
#: ../main.c:485 #: ../main.c:511
msgid "Do you really want to reset the selected theme to default?" msgid "Do you really want to reset the selected theme to default?"
msgstr "" msgstr ""
#: ../main.c:653 #: ../main.c:679
msgid "Do you really want to replace the default theme with the selected " msgid "Do you really want to replace the default theme with the selected "
"theme?" "theme?"
msgstr "" msgstr ""

File diff suppressed because it is too large Load Diff

View File

@@ -2058,7 +2058,7 @@ msgid "tint2conf"
msgstr "тинт2конф" msgstr "тинт2конф"
#: ../main.c:240 #: ../main.c:240
msgid "Panel theming" msgid "Tint2 panel themes"
msgstr "Изглед плоче" msgstr "Изглед плоче"
#: ../main.c:250 #: ../main.c:250
@@ -2188,16 +2188,21 @@ msgstr "Уреди одабрану тему"
msgid "Save theme as" msgid "Save theme as"
msgstr "Снимити тему као" msgstr "Снимити тему као"
#: ../main.c:446 #: ../main.c:439
#, c-format
msgid "A file named \"%s\" already exists. Do you want to replace it?"
msgstr "Датотека под називом „%s“ већ постоји. Да ли желите да је замените?"
#: ../main.c:472
#, fuzzy #, fuzzy
msgid "Do you really want to delete the selected theme?" msgid "Do you really want to delete the selected theme?"
msgstr "Уреди одабрану тему" msgstr "Уреди одабрану тему"
#: ../main.c:485 #: ../main.c:511
msgid "Do you really want to reset the selected theme to default?" msgid "Do you really want to reset the selected theme to default?"
msgstr "" msgstr ""
#: ../main.c:653 #: ../main.c:679
msgid "Do you really want to replace the default theme with the selected " msgid "Do you really want to replace the default theme with the selected "
"theme?" "theme?"
msgstr "" msgstr ""

View File

@@ -1914,7 +1914,7 @@ msgid "tint2conf"
msgstr "" msgstr ""
#: ../main.c:240 #: ../main.c:240
msgid "Panel theming" msgid "Tint2 panel themes"
msgstr "" msgstr ""
#: ../main.c:250 #: ../main.c:250
@@ -2036,15 +2036,20 @@ msgstr ""
msgid "Save theme as" msgid "Save theme as"
msgstr "" msgstr ""
#: ../main.c:446 #: ../main.c:439
#, c-format
msgid "A file named \"%s\" already exists. Do you want to replace it?"
msgstr ""
#: ../main.c:472
msgid "Do you really want to delete the selected theme?" msgid "Do you really want to delete the selected theme?"
msgstr "" msgstr ""
#: ../main.c:485 #: ../main.c:511
msgid "Do you really want to reset the selected theme to default?" msgid "Do you really want to reset the selected theme to default?"
msgstr "" msgstr ""
#: ../main.c:653 #: ../main.c:679
msgid "" msgid ""
"Do you really want to replace the default theme with the selected theme?" "Do you really want to replace the default theme with the selected theme?"
msgstr "" msgstr ""

View File

@@ -735,6 +735,7 @@ void background_create_new()
bgColBorderOpacity, borderOpacity, bgColBorderOpacity, borderOpacity,
bgColBorderWidth, b, bgColBorderWidth, b,
bgColCornerRadius, r, bgColCornerRadius, r,
bgColText, "",
bgColFillColorOver, &fillColorOver, bgColFillColorOver, &fillColorOver,
bgColFillOpacityOver, fillOpacityOver, bgColFillOpacityOver, fillOpacityOver,
bgColBorderColorOver, &borderColorOver, bgColBorderColorOver, &borderColorOver,
@@ -743,7 +744,6 @@ void background_create_new()
bgColFillOpacityPress, fillOpacityPress, bgColFillOpacityPress, fillOpacityPress,
bgColBorderColorPress, &borderColorPress, bgColBorderColorPress, &borderColorPress,
bgColBorderOpacityPress, borderOpacityPress, bgColBorderOpacityPress, borderOpacityPress,
bgColText, "",
-1); -1);
background_update_image(index); background_update_image(index);
@@ -805,6 +805,7 @@ void background_duplicate(GtkWidget *widget, gpointer data)
bgColFillOpacity, fillOpacity, bgColFillOpacity, fillOpacity,
bgColBorderColor, borderColor, bgColBorderColor, borderColor,
bgColBorderOpacity, borderOpacity, bgColBorderOpacity, borderOpacity,
bgColText, "",
bgColFillColorOver, fillColorOver, bgColFillColorOver, fillColorOver,
bgColFillOpacityOver, fillOpacityOver, bgColFillOpacityOver, fillOpacityOver,
bgColBorderColorOver, borderColorOver, bgColBorderColorOver, borderColorOver,
@@ -815,7 +816,6 @@ void background_duplicate(GtkWidget *widget, gpointer data)
bgColBorderOpacityPress, borderOpacityPress, bgColBorderOpacityPress, borderOpacityPress,
bgColBorderWidth, b, bgColBorderWidth, b,
bgColCornerRadius, r, bgColCornerRadius, r,
bgColText, ""
-1); -1);
g_boxed_free(GDK_TYPE_COLOR, fillColor); g_boxed_free(GDK_TYPE_COLOR, fillColor);
g_boxed_free(GDK_TYPE_COLOR, borderColor); g_boxed_free(GDK_TYPE_COLOR, borderColor);
@@ -2080,9 +2080,9 @@ void launcher_add_app(GtkWidget *widget, gpointer data)
gtk_list_store_append(launcher_apps, &iter); gtk_list_store_append(launcher_apps, &iter);
gtk_list_store_set(launcher_apps, &iter, gtk_list_store_set(launcher_apps, &iter,
appsColIcon, pixbuf, appsColIcon, pixbuf,
appsColIconName, g_strdup(iconName),
appsColText, g_strdup(name), appsColText, g_strdup(name),
appsColPath, g_strdup(path), appsColPath, g_strdup(path),
appsColIconName, g_strdup(iconName),
-1); -1);
if (pixbuf) if (pixbuf)
g_object_unref(pixbuf); g_object_unref(pixbuf);
@@ -2324,9 +2324,9 @@ void load_desktop_file(const char *file, gboolean selected)
gtk_list_store_insert(store, &iter, index); gtk_list_store_insert(store, &iter, index);
gtk_list_store_set(store, &iter, gtk_list_store_set(store, &iter,
appsColIcon, pixbuf, appsColIcon, pixbuf,
appsColIconName, g_strdup(entry.icon),
appsColText, g_strdup(entry.name), appsColText, g_strdup(entry.name),
appsColPath, g_strdup(file), appsColPath, g_strdup(file),
appsColIconName, g_strdup(entry.icon),
-1); -1);
if (pixbuf) if (pixbuf)
g_object_unref(pixbuf); g_object_unref(pixbuf);
@@ -2337,9 +2337,9 @@ void load_desktop_file(const char *file, gboolean selected)
gtk_list_store_append(store, &iter); gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, gtk_list_store_set(store, &iter,
appsColIcon, pixbuf, appsColIcon, pixbuf,
appsColIconName, g_strdup(""),
appsColText, g_strdup(file), appsColText, g_strdup(file),
appsColPath, g_strdup(file), appsColPath, g_strdup(file),
appsColIconName, g_strdup(""),
-1); -1);
if (pixbuf) if (pixbuf)
g_object_unref(pixbuf); g_object_unref(pixbuf);
@@ -2359,9 +2359,9 @@ void populate_from_entries(GList *entries, gboolean selected)
gtk_list_store_append(selected ? launcher_apps : all_apps, &iter); gtk_list_store_append(selected ? launcher_apps : all_apps, &iter);
gtk_list_store_set(selected ? launcher_apps :all_apps, &iter, gtk_list_store_set(selected ? launcher_apps :all_apps, &iter,
appsColIcon, pixbuf, appsColIcon, pixbuf,
appsColIconName, g_strdup(entry->icon),
appsColText, g_strdup(entry->name), appsColText, g_strdup(entry->name),
appsColPath, g_strdup(entry->path), appsColPath, g_strdup(entry->path),
appsColIconName, g_strdup(entry->icon),
-1); -1);
if (pixbuf) if (pixbuf)
g_object_unref(pixbuf); g_object_unref(pixbuf);

View File

@@ -18,6 +18,7 @@
**************************************************************************/ **************************************************************************/
#include "main.h" #include "main.h"
#include "properties.h"
#include "strnatcmp.h" #include "strnatcmp.h"
#include "theme_view.h" #include "theme_view.h"
#include "common.h" #include "common.h"
@@ -28,17 +29,15 @@ GtkListStore *theme_list_store;
int g_width_list, g_height_list; int g_width_list, g_height_list;
GtkCellRenderer *g_renderer; GtkCellRenderer *g_renderer;
gint theme_name_compare(GtkTreeModel *model, gint theme_name_compare(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data);
GtkTreeIter *a,
GtkTreeIter *b,
gpointer user_data);
GtkWidget *create_view() GtkWidget *create_view()
{ {
GtkTreeViewColumn *col; GtkTreeViewColumn *col;
GtkCellRenderer *renderer; GtkCellRenderer *renderer;
theme_list_store = gtk_list_store_new(NB_COL, G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF); theme_list_store =
gtk_list_store_new(NB_COL, G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_INT, G_TYPE_INT);
GtkWidget *view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(theme_list_store)); GtkWidget *view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(theme_list_store));
gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view), TRUE); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view), TRUE);
@@ -51,25 +50,23 @@ GtkWidget *create_view()
gtk_tree_view_column_pack_start(col, renderer, TRUE); gtk_tree_view_column_pack_start(col, renderer, TRUE);
gtk_tree_view_column_add_attribute(col, renderer, "text", COL_THEME_FILE); gtk_tree_view_column_add_attribute(col, renderer, "text", COL_THEME_FILE);
gtk_tree_view_column_set_visible(col, FALSE); gtk_tree_view_column_set_visible(col, FALSE);
gtk_tree_view_append_column(GTK_TREE_VIEW(view),col); gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
renderer = gtk_cell_renderer_text_new(); renderer = gtk_cell_renderer_text_new();
col = gtk_tree_view_column_new(); col = gtk_tree_view_column_new();
gtk_tree_view_column_pack_start(col, renderer, TRUE); gtk_tree_view_column_pack_start(col, renderer, TRUE);
gtk_tree_view_column_add_attribute(col, renderer, "text", COL_THEME_NAME); gtk_tree_view_column_add_attribute(col, renderer, "text", COL_THEME_NAME);
gtk_tree_view_append_column(GTK_TREE_VIEW(view),col); gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
g_width_list = 200;
g_height_list = 30;
g_renderer = gtk_cell_renderer_pixbuf_new(); g_renderer = gtk_cell_renderer_pixbuf_new();
g_object_set(g_renderer, "xalign", 0.0, NULL); g_object_set(g_renderer, "xalign", 0.0, NULL);
gtk_cell_renderer_set_fixed_size(g_renderer, g_width_list, g_height_list); gtk_cell_renderer_set_fixed_size(g_renderer, 200, 30);
// specific to gtk-2.18 or higher
// gtk_cell_renderer_set_padding(g_renderer, 5, 5);
col = gtk_tree_view_column_new(); col = gtk_tree_view_column_new();
gtk_tree_view_column_pack_start(col, g_renderer, TRUE); gtk_tree_view_column_pack_start(col, g_renderer, TRUE);
gtk_tree_view_column_add_attribute(col, g_renderer, "pixbuf", COL_SNAPSHOT); gtk_tree_view_column_add_attribute(col, g_renderer, "pixbuf", COL_SNAPSHOT);
gtk_tree_view_append_column(GTK_TREE_VIEW(view),col); gtk_tree_view_column_add_attribute(col, g_renderer, "width", COL_WIDTH);
gtk_tree_view_column_add_attribute(col, g_renderer, "height", COL_HEIGHT);
gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
GtkTreeSortable *sortable = GTK_TREE_SORTABLE(theme_list_store); GtkTreeSortable *sortable = GTK_TREE_SORTABLE(theme_list_store);
gtk_tree_sortable_set_sort_column_id(sortable, COL_THEME_FILE, GTK_SORT_ASCENDING); gtk_tree_sortable_set_sort_column_id(sortable, COL_THEME_FILE, GTK_SORT_ASCENDING);
@@ -77,10 +74,7 @@ GtkWidget *create_view()
return view; return view;
} }
gint theme_name_compare(GtkTreeModel *model, gint theme_name_compare(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data)
GtkTreeIter *a,
GtkTreeIter *b,
gpointer user_data)
{ {
gchar *path_a, *path_b; gchar *path_a, *path_b;
gtk_tree_model_get(model, a, COL_THEME_FILE, &path_a, -1); gtk_tree_model_get(model, a, COL_THEME_FILE, &path_a, -1);
@@ -158,23 +152,35 @@ void theme_list_append(const gchar *path)
g_free(suffix); g_free(suffix);
} }
gboolean update_snapshot() gboolean update_snapshot()
{ {
GtkTreeModel *model; const gint PADDING = 20;
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(g_theme_view));
GtkTreeIter iter; GtkTreeIter iter;
gboolean have_iter; gboolean have_iter;
gint pixWidth = 200, pixHeight = 30; int num_updates = 0;
have_iter = gtk_tree_model_get_iter_first(model, &iter);
while (have_iter) {
GdkPixbuf *pixbuf;
gtk_tree_model_get(model, &iter, COL_SNAPSHOT, &pixbuf, -1);
if (pixbuf)
g_object_unref(pixbuf);
else
num_updates++;
have_iter = gtk_tree_model_iter_next(model, &iter);
}
gboolean need_pls_wait = num_updates > 3;
if (need_pls_wait)
create_please_wait(GTK_WINDOW(g_window));
model = gtk_tree_view_get_model(GTK_TREE_VIEW(g_theme_view));
have_iter = gtk_tree_model_get_iter_first(model, &iter); have_iter = gtk_tree_model_get_iter_first(model, &iter);
while (have_iter) { while (have_iter) {
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
gtk_tree_model_get(model, &iter, COL_SNAPSHOT, &pixbuf, -1); gtk_tree_model_get(model, &iter, COL_SNAPSHOT, &pixbuf, -1);
if (pixbuf) { if (pixbuf) {
pixWidth = MAX(pixWidth, gdk_pixbuf_get_width(pixbuf));
pixHeight = MAX(pixHeight, gdk_pixbuf_get_height(pixbuf));
g_object_unref(pixbuf); g_object_unref(pixbuf);
have_iter = gtk_tree_model_iter_next(model, &iter); have_iter = gtk_tree_model_iter_next(model, &iter);
continue; continue;
@@ -182,9 +188,7 @@ gboolean update_snapshot()
// build panel's snapshot // build panel's snapshot
gchar *path; gchar *path;
gtk_tree_model_get(model, &iter, gtk_tree_model_get(model, &iter, COL_THEME_FILE, &path, -1);
COL_THEME_FILE, &path,
-1);
char fname[128]; char fname[128];
sprintf(fname, "tint2-%d.jpg", (int)getpid()); sprintf(fname, "tint2-%d.jpg", (int)getpid());
@@ -206,16 +210,26 @@ gboolean update_snapshot()
g_free(snap); g_free(snap);
g_free(path); g_free(path);
pixWidth = MAX(pixWidth, gdk_pixbuf_get_width(pixbuf)); gtk_list_store_set(theme_list_store,
pixHeight = MAX(pixHeight, gdk_pixbuf_get_height(pixbuf)); &iter,
COL_SNAPSHOT,
gtk_list_store_set(theme_list_store, &iter, COL_SNAPSHOT, pixbuf, -1); pixbuf,
COL_WIDTH,
gdk_pixbuf_get_width(pixbuf) + PADDING,
COL_HEIGHT,
gdk_pixbuf_get_height(pixbuf) + PADDING,
-1);
if (pixbuf) if (pixbuf)
g_object_unref(pixbuf); g_object_unref(pixbuf);
if (need_pls_wait)
process_events();
have_iter = gtk_tree_model_iter_next(model, &iter); have_iter = gtk_tree_model_iter_next(model, &iter);
} }
gtk_cell_renderer_set_fixed_size(g_renderer, pixWidth + 30, pixHeight + 30); if (need_pls_wait)
destroy_please_wait();
return FALSE; return FALSE;
} }

View File

@@ -5,7 +5,12 @@
extern GtkWidget *g_theme_view; extern GtkWidget *g_theme_view;
extern GtkListStore *theme_list_store; extern GtkListStore *theme_list_store;
enum { COL_THEME_FILE = 0, COL_THEME_NAME, COL_SNAPSHOT, NB_COL, }; enum { COL_THEME_FILE = 0,
COL_THEME_NAME,
COL_SNAPSHOT,
COL_WIDTH,
COL_HEIGHT,
NB_COL, };
GtkWidget *create_view(); GtkWidget *create_view();

View File

@@ -70,17 +70,15 @@ void relayout_fixed(Area *a)
relayout_fixed(l->data); relayout_fixed(l->data);
// Recalculate size // Recalculate size
a->_changed = 0; a->_changed = FALSE;
if (a->resize_needed && a->size_mode == LAYOUT_FIXED) { if (a->resize_needed && a->size_mode == LAYOUT_FIXED) {
a->resize_needed = 0; a->resize_needed = FALSE;
if (a->_resize) { if (a->_resize && a->_resize(a)) {
if (a->_resize(a)) { // The size has changed => resize needed for the parent
// The size hash changed => resize needed for the parent if (a->parent)
if (a->parent) ((Area *)a->parent)->resize_needed = TRUE;
((Area *)a->parent)->resize_needed = 1; a->_changed = TRUE;
a->_changed = 1;
}
} }
} }
} }
@@ -92,10 +90,11 @@ void relayout_dynamic(Area *a, int level)
// Area is resized before its children // Area is resized before its children
if (a->resize_needed && a->size_mode == LAYOUT_DYNAMIC) { if (a->resize_needed && a->size_mode == LAYOUT_DYNAMIC) {
a->resize_needed = 0; a->resize_needed = FALSE;
if (a->_resize) { if (a->_resize) {
a->_resize(a); if (a->_resize(a))
a->_changed = TRUE;
// resize children with LAYOUT_DYNAMIC // resize children with LAYOUT_DYNAMIC
for (GList *l = a->children; l; l = l->next) { for (GList *l = a->children; l; l = l->next) {
Area *child = ((Area *)l->data); Area *child = ((Area *)l->data);
@@ -119,13 +118,13 @@ void relayout_dynamic(Area *a, int level)
if (pos != child->posx) { if (pos != child->posx) {
// pos changed => redraw // pos changed => redraw
child->posx = pos; child->posx = pos;
child->_changed = 1; child->_changed = TRUE;
} }
} else { } else {
if (pos != child->posy) { if (pos != child->posy) {
// pos changed => redraw // pos changed => redraw
child->posy = pos; child->posy = pos;
child->_changed = 1; child->_changed = TRUE;
} }
} }
@@ -148,13 +147,13 @@ void relayout_dynamic(Area *a, int level)
if (pos != child->posx) { if (pos != child->posx) {
// pos changed => redraw // pos changed => redraw
child->posx = pos; child->posx = pos;
child->_changed = 1; child->_changed = TRUE;
} }
} else { } else {
if (pos != child->posy) { if (pos != child->posy) {
// pos changed => redraw // pos changed => redraw
child->posy = pos; child->posy = pos;
child->_changed = 1; child->_changed = TRUE;
} }
} }
@@ -187,13 +186,13 @@ void relayout_dynamic(Area *a, int level)
if (pos != child->posx) { if (pos != child->posx) {
// pos changed => redraw // pos changed => redraw
child->posx = pos; child->posx = pos;
child->_changed = 1; child->_changed = TRUE;
} }
} else { } else {
if (pos != child->posy) { if (pos != child->posy) {
// pos changed => redraw // pos changed => redraw
child->posy = pos; child->posy = pos;
child->_changed = 1; child->_changed = TRUE;
} }
} }
@@ -224,7 +223,7 @@ void draw_tree(Area *a)
return; return;
if (a->_redraw_needed) { if (a->_redraw_needed) {
a->_redraw_needed = 0; a->_redraw_needed = FALSE;
draw(a); draw(a);
} }
@@ -286,7 +285,7 @@ int relayout_with_constraint(Area *a, int maximum_size)
modulo--; modulo--;
} }
if (child->width != old_width) if (child->width != old_width)
child->_changed = 1; child->_changed = TRUE;
} }
} }
} else { } else {
@@ -326,7 +325,7 @@ int relayout_with_constraint(Area *a, int maximum_size)
modulo--; modulo--;
} }
if (child->height != old_height) if (child->height != old_height)
child->_changed = 1; child->_changed = TRUE;
} }
} }
} }
@@ -361,7 +360,7 @@ void hide(Area *a)
a->on_screen = FALSE; a->on_screen = FALSE;
if (parent) if (parent)
parent->resize_needed = 1; parent->resize_needed = TRUE;
if (panel_horizontal) if (panel_horizontal)
a->width = 0; a->width = 0;
else else
@@ -374,12 +373,27 @@ void show(Area *a)
a->on_screen = TRUE; a->on_screen = TRUE;
if (parent) if (parent)
parent->resize_needed = 1; parent->resize_needed = TRUE;
a->resize_needed = 1; a->resize_needed = TRUE;
} }
void draw(Area *a) void draw(Area *a)
{ {
if (a->_changed) {
// On resize/move, invalidate cached pixmaps
for (int i = 0; i < MOUSE_STATE_COUNT; i++) {
XFreePixmap(server.display, a->pix_by_state[i]);
if (a->pix == a->pix_by_state[i]) {
a->pix = None;
}
a->pix_by_state[i] = None;
}
if (a->pix) {
XFreePixmap(server.display, a->pix);
a->pix = None;
}
}
if (a->pix) { if (a->pix) {
XFreePixmap(server.display, a->pix); XFreePixmap(server.display, a->pix);
if (a->pix_by_state[a->has_mouse_over_effect ? a->mouse_state : 0] != a->pix) if (a->pix_by_state[a->has_mouse_over_effect ? a->mouse_state : 0] != a->pix)
@@ -594,7 +608,7 @@ gboolean area_is_first(void *obj)
Area *node = &panel->area; Area *node = &panel->area;
while (node) { while (node) {
if (!node->on_screen) if (!node->on_screen || node->width == 0 || node->height == 0)
return FALSE; return FALSE;
if (node == a) if (node == a)
return TRUE; return TRUE;
@@ -603,7 +617,7 @@ gboolean area_is_first(void *obj)
node = NULL; node = NULL;
for (; l; l = l->next) { for (; l; l = l->next) {
Area *child = l->data; Area *child = l->data;
if (!child->on_screen) if (!child->on_screen || child->width == 0 || child->height == 0)
continue; continue;
node = child; node = child;
break; break;
@@ -624,7 +638,7 @@ gboolean area_is_last(void *obj)
Area *node = &panel->area; Area *node = &panel->area;
while (node) { while (node) {
if (!node->on_screen) if (!node->on_screen || node->width == 0 || node->height == 0)
return FALSE; return FALSE;
if (node == a) if (node == a)
return TRUE; return TRUE;
@@ -633,7 +647,7 @@ gboolean area_is_last(void *obj)
node = NULL; node = NULL;
for (; l; l = l->next) { for (; l; l = l->next) {
Area *child = l->data; Area *child = l->data;
if (!child->on_screen) if (!child->on_screen || child->width == 0 || child->height == 0)
continue; continue;
node = child; node = child;
} }
@@ -645,7 +659,7 @@ gboolean area_is_last(void *obj)
gboolean area_is_under_mouse(void *obj, int x, int y) gboolean area_is_under_mouse(void *obj, int x, int y)
{ {
Area *a = obj; Area *a = obj;
if (!a->on_screen) if (!a->on_screen || a->width == 0 || a->height == 0)
return FALSE; return FALSE;
if (a->_is_under_mouse) if (a->_is_under_mouse)
@@ -664,9 +678,9 @@ gboolean full_width_area_is_under_mouse(void *obj, int x, int y)
return a->_is_under_mouse(a, x, y); return a->_is_under_mouse(a, x, y);
if (panel_horizontal) if (panel_horizontal)
return (x >= a->posx || area_is_first(a)) && (x <= a->posx + a->width || area_is_last(a)); return (x >= a->posx) && (x <= a->posx + a->width);
else else
return (y >= a->posy || area_is_first(a)) && (y <= a->posy + a->height || area_is_last(a)); return (y >= a->posy) && (y <= a->posy + a->height);
} }
Area *find_area_under_mouse(void *root, int x, int y) Area *find_area_under_mouse(void *root, int x, int y)

View File

@@ -194,6 +194,7 @@ typedef struct Area {
// This is the pixmap on which the Area is rendered. Render to it directly if needed. // This is the pixmap on which the Area is rendered. Render to it directly if needed.
Pixmap pix; Pixmap pix;
Pixmap pix_by_state[MOUSE_STATE_COUNT]; Pixmap pix_by_state[MOUSE_STATE_COUNT];
char name[32];
// Callbacks // Callbacks

View File

@@ -320,3 +320,32 @@ gulong *get_best_icon(gulong *data, int icon_count, int num, int *iw, int *ih, i
*ih = height[icon_num]; *ih = height[icon_num];
return icon_data[icon_num]; return icon_data[icon_num];
} }
// Thanks zcodes!
char *get_window_name(Window win)
{
XTextProperty text_property;
Status status = XGetWMName(server.display, win, &text_property);
if (!status || !text_property.value || !text_property.nitems) {
return strdup("");
}
char **name_list;
int count;
status = Xutf8TextPropertyToTextList(server.display, &text_property, &name_list, &count);
if (status < Success || !count) {
XFree(text_property.value);
return strdup("");
}
if (!name_list[0]) {
XFreeStringList(name_list);
XFree(text_property.value);
return strdup("");
}
char *result = strdup(name_list[0]);
XFreeStringList(name_list);
XFree(text_property.value);
return result;
}

View File

@@ -33,4 +33,6 @@ void change_window_desktop(Window win, int desktop);
int get_icon_count(gulong *data, int num); 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);
char *get_window_name(Window win);
#endif #endif

View File

@@ -1,4 +1,4 @@
#---- Generated by tint2conf bd50 ---- #---- Generated by tint2conf 2e3c ----
# See https://gitlab.com/o9000/tint2/wikis/Configure for # See https://gitlab.com/o9000/tint2/wikis/Configure for
# full documentation of the configuration options. # full documentation of the configuration options.
#------------------------------------- #-------------------------------------
@@ -67,11 +67,11 @@ border_color_pressed = #555555 100
rounded = 2 rounded = 2
border_width = 1 border_width = 1
background_color = #222222 100 background_color = #222222 100
border_color = #777777 100 border_color = #777777 30
background_color_hover = #222222 100 background_color_hover = #222222 100
border_color_hover = #777777 100 border_color_hover = #777777 30
background_color_pressed = #222222 100 background_color_pressed = #222222 100
border_color_pressed = #777777 100 border_color_pressed = #777777 30
#------------------------------------- #-------------------------------------
# Panel # Panel
@@ -85,6 +85,7 @@ panel_dock = 0
panel_position = bottom center horizontal panel_position = bottom center horizontal
panel_layer = normal panel_layer = normal
panel_monitor = all panel_monitor = all
primary_monitor_first = 0
autohide = 0 autohide = 0
autohide_show_timeout = 0 autohide_show_timeout = 0
autohide_hide_timeout = 0.5 autohide_hide_timeout = 0.5
@@ -106,6 +107,7 @@ taskbar_active_background_id = 0
taskbar_name = 1 taskbar_name = 1
taskbar_hide_inactive_tasks = 0 taskbar_hide_inactive_tasks = 0
taskbar_hide_different_monitor = 0 taskbar_hide_different_monitor = 0
taskbar_always_show_all_desktop_tasks = 0
taskbar_name_padding = 6 3 taskbar_name_padding = 6 3
taskbar_name_background_id = 6 taskbar_name_background_id = 6
taskbar_name_active_background_id = 7 taskbar_name_active_background_id = 7

View File

@@ -1,4 +1,4 @@
#---- Generated by tint2conf 5b63 ---- #---- Generated by tint2conf 2c73 ----
# See https://gitlab.com/o9000/tint2/wikis/Configure for # See https://gitlab.com/o9000/tint2/wikis/Configure for
# full documentation of the configuration options. # full documentation of the configuration options.
#------------------------------------- #-------------------------------------
@@ -57,11 +57,11 @@ border_color_pressed = #999999 100
rounded = 2 rounded = 2
border_width = 1 border_width = 1
background_color = #eeeeee 4 background_color = #eeeeee 4
border_color = #cccccc 100 border_color = #cccccc 30
background_color_hover = #eeeeee 22 background_color_hover = #eeeeee 22
border_color_hover = #999999 100 border_color_hover = #999999 30
background_color_pressed = #dddddd 4 background_color_pressed = #dddddd 4
border_color_pressed = #999999 100 border_color_pressed = #999999 30
# Background 7: Active desktop name # Background 7: Active desktop name
rounded = 2 rounded = 2
@@ -85,6 +85,7 @@ panel_dock = 0
panel_position = bottom center horizontal panel_position = bottom center horizontal
panel_layer = normal panel_layer = normal
panel_monitor = all panel_monitor = all
primary_monitor_first = 0
autohide = 0 autohide = 0
autohide_show_timeout = 0 autohide_show_timeout = 0
autohide_hide_timeout = 0.5 autohide_hide_timeout = 0.5
@@ -106,6 +107,7 @@ taskbar_active_background_id = 0
taskbar_name = 1 taskbar_name = 1
taskbar_hide_inactive_tasks = 0 taskbar_hide_inactive_tasks = 0
taskbar_hide_different_monitor = 0 taskbar_hide_different_monitor = 0
taskbar_always_show_all_desktop_tasks = 0
taskbar_name_padding = 6 3 taskbar_name_padding = 6 3
taskbar_name_background_id = 6 taskbar_name_background_id = 6
taskbar_name_active_background_id = 7 taskbar_name_active_background_id = 7

View File

@@ -1,4 +1,4 @@
#---- Generated by tint2conf 812e ---- #---- Generated by tint2conf ac71 ----
# See https://gitlab.com/o9000/tint2/wikis/Configure for # See https://gitlab.com/o9000/tint2/wikis/Configure for
# full documentation of the configuration options. # full documentation of the configuration options.
#------------------------------------- #-------------------------------------
@@ -57,11 +57,11 @@ border_color_pressed = #999999 100
rounded = 2 rounded = 2
border_width = 1 border_width = 1
background_color = #eeeeee 4 background_color = #eeeeee 4
border_color = #999999 100 border_color = #999999 30
background_color_hover = #eeeeee 22 background_color_hover = #eeeeee 22
border_color_hover = #999999 100 border_color_hover = #999999 30
background_color_pressed = #dddddd 4 background_color_pressed = #dddddd 4
border_color_pressed = #999999 100 border_color_pressed = #999999 30
# Background 7: Active desktop name # Background 7: Active desktop name
rounded = 2 rounded = 2
@@ -85,6 +85,7 @@ panel_dock = 0
panel_position = bottom left vertical panel_position = bottom left vertical
panel_layer = normal panel_layer = normal
panel_monitor = all panel_monitor = all
primary_monitor_first = 0
autohide = 0 autohide = 0
autohide_show_timeout = 0 autohide_show_timeout = 0
autohide_hide_timeout = 0.5 autohide_hide_timeout = 0.5
@@ -106,6 +107,7 @@ taskbar_active_background_id = 0
taskbar_name = 1 taskbar_name = 1
taskbar_hide_inactive_tasks = 0 taskbar_hide_inactive_tasks = 0
taskbar_hide_different_monitor = 0 taskbar_hide_different_monitor = 0
taskbar_always_show_all_desktop_tasks = 0
taskbar_name_padding = 6 3 taskbar_name_padding = 6 3
taskbar_name_background_id = 6 taskbar_name_background_id = 6
taskbar_name_active_background_id = 7 taskbar_name_active_background_id = 7