Compare commits
2 Commits
v0.12-rc5
...
area-align
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
92fa96b8c7 | ||
|
|
ca862025d6 |
@@ -1,4 +1,4 @@
|
|||||||
2015-05-23 master
|
2015-05-03 master
|
||||||
- Note: the changes listed here are based on the previous release tint2 0.11, however some distributions (e.g. Debian)
|
- Note: the changes listed here are based on the previous release tint2 0.11, however some distributions (e.g. Debian)
|
||||||
offered packages using newer commits and/or patches; thus from the user's perspective some of these features are
|
offered packages using newer commits and/or patches; thus from the user's perspective some of these features are
|
||||||
already present. They are marked with '(already released by distros)'.
|
already present. They are marked with '(already released by distros)'.
|
||||||
@@ -11,8 +11,6 @@
|
|||||||
- Experimental, testing/feedback needed
|
- Experimental, testing/feedback needed
|
||||||
- Icons (system tray, task buttons, launcher):
|
- Icons (system tray, task buttons, launcher):
|
||||||
- Changed rendering method to fix icon corruptions (please report any problems)
|
- Changed rendering method to fix icon corruptions (please report any problems)
|
||||||
- System tray:
|
|
||||||
- Workaround for misbehaving applications leaving empty tray icons
|
|
||||||
- Many bugfixes
|
- Many bugfixes
|
||||||
- New config options (see https://gitlab.com/o9000/tint2/wikis/Configure):
|
- New config options (see https://gitlab.com/o9000/tint2/wikis/Configure):
|
||||||
- Panel:
|
- Panel:
|
||||||
|
|||||||
10
README.md
10
README.md
@@ -1,14 +1,14 @@
|
|||||||
### New unstable release: 0.12-rc5
|
### New unstable release: 0.12-rc3
|
||||||
Changes: https://gitlab.com/o9000/tint2/blob/master/ChangeLog
|
Changes: https://gitlab.com/o9000/tint2/blob/master/ChangeLog
|
||||||
|
|
||||||
Documentation: https://gitlab.com/o9000/tint2/wikis/home
|
Documentation: https://gitlab.com/o9000/tint2/wikis/home
|
||||||
|
|
||||||
Try it out with (see also [dependencies](https://gitlab.com/o9000/tint2/wikis/Install#dependencies)):
|
Try it out with (see also [dependencies](https://gitlab.com/o9000/tint2/wikis/Install#dependencies)):
|
||||||
```
|
```
|
||||||
mkdir tint2-0.12-rc5
|
mkdir tint2-0.12-rc3
|
||||||
cd tint2-0.12-rc5
|
cd tint2-0.12-rc3
|
||||||
wget 'https://gitlab.com/o9000/tint2/repository/archive.tar.gz?ref=v0.12-rc5' --output-document tint2-0.12-rc5.tar.gz
|
wget 'https://gitlab.com/o9000/tint2/repository/archive.tar.gz?ref=v0.12-rc3' --output-document tint2-0.12-rc3.tar.gz
|
||||||
tar -xzf tint2-0.12-rc5.tar.gz
|
tar -xzf tint2-0.12-rc3.tar.gz
|
||||||
cd tint2.git
|
cd tint2.git
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
|
|||||||
@@ -76,9 +76,6 @@ void update_battery_tick(void* arg)
|
|||||||
int16_t old_hours = battery_state.time.hours;
|
int16_t old_hours = battery_state.time.hours;
|
||||||
int8_t old_minutes = battery_state.time.minutes;
|
int8_t old_minutes = battery_state.time.minutes;
|
||||||
|
|
||||||
if (!battery_found) {
|
|
||||||
init_battery();
|
|
||||||
}
|
|
||||||
if (update_battery() != 0) {
|
if (update_battery() != 0) {
|
||||||
// Reconfigure
|
// Reconfigure
|
||||||
init_battery();
|
init_battery();
|
||||||
@@ -106,24 +103,16 @@ void update_battery_tick(void* arg)
|
|||||||
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < nb_panel; i++) {
|
for (i = 0; i < nb_panel; i++) {
|
||||||
if (!battery_found) {
|
if (!battery_found && panel1[i].battery.area.on_screen == 1) {
|
||||||
if (panel1[i].battery.area.on_screen == 1) {
|
|
||||||
hide(&panel1[i].battery.area);
|
hide(&panel1[i].battery.area);
|
||||||
panel_refresh = 1;
|
panel_refresh = 1;
|
||||||
}
|
} else if (battery_state.percentage >= percentage_hide && panel1[i].battery.area.on_screen == 1) {
|
||||||
} else {
|
|
||||||
if (battery_state.percentage >= percentage_hide) {
|
|
||||||
if (panel1[i].battery.area.on_screen == 1) {
|
|
||||||
hide(&panel1[i].battery.area);
|
hide(&panel1[i].battery.area);
|
||||||
panel_refresh = 1;
|
panel_refresh = 1;
|
||||||
}
|
} else if (battery_state.percentage < percentage_hide && panel1[i].battery.area.on_screen == 0) {
|
||||||
} else {
|
|
||||||
if (panel1[i].battery.area.on_screen == 0) {
|
|
||||||
show(&panel1[i].battery.area);
|
show(&panel1[i].battery.area);
|
||||||
panel_refresh = 1;
|
panel_refresh = 1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
if (panel1[i].battery.area.on_screen == 1) {
|
if (panel1[i].battery.area.on_screen == 1) {
|
||||||
panel1[i].battery.area.resize = 1;
|
panel1[i].battery.area.resize = 1;
|
||||||
panel_refresh = 1;
|
panel_refresh = 1;
|
||||||
@@ -290,7 +279,7 @@ void init_battery()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!battery_timeout)
|
if (!battery_timeout)
|
||||||
battery_timeout = add_timeout(10, 30000, update_battery_tick, 0, &battery_timeout);
|
battery_timeout = add_timeout(10, 10000, update_battery_tick, 0, &battery_timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -485,7 +474,7 @@ int update_battery() {
|
|||||||
battery_state.time.seconds = seconds;
|
battery_state.time.seconds = seconds;
|
||||||
|
|
||||||
if (energy_full > 0)
|
if (energy_full > 0)
|
||||||
new_percentage = 0.5 + ((energy_now <= energy_full ? energy_now : energy_full) * 100.0) / energy_full;
|
new_percentage = ((energy_now <= energy_full ? energy_now : energy_full) * 100) / energy_full;
|
||||||
|
|
||||||
battery_state.percentage = new_percentage;
|
battery_state.percentage = new_percentage;
|
||||||
|
|
||||||
|
|||||||
@@ -613,13 +613,13 @@ void add_entry (char *key, char *value)
|
|||||||
}
|
}
|
||||||
else if (strcmp(key, "systray_sort") == 0) {
|
else if (strcmp(key, "systray_sort") == 0) {
|
||||||
if (strcmp(value, "descending") == 0)
|
if (strcmp(value, "descending") == 0)
|
||||||
systray.sort = SYSTRAY_SORT_DESCENDING;
|
systray.sort = -1;
|
||||||
else if (strcmp(value, "ascending") == 0)
|
else if (strcmp(value, "ascending") == 0)
|
||||||
systray.sort = SYSTRAY_SORT_ASCENDING;
|
systray.sort = 1;
|
||||||
else if (strcmp(value, "left2right") == 0)
|
else if (strcmp(value, "left2right") == 0)
|
||||||
systray.sort = SYSTRAY_SORT_LEFT2RIGHT;
|
systray.sort = 2;
|
||||||
else if (strcmp(value, "right2left") == 0)
|
else if (strcmp(value, "right2left") == 0)
|
||||||
systray.sort = SYSTRAY_SORT_RIGHT2LEFT;
|
systray.sort = 3;
|
||||||
}
|
}
|
||||||
else if (strcmp(key, "systray_icon_size") == 0) {
|
else if (strcmp(key, "systray_icon_size") == 0) {
|
||||||
systray_max_icon_size = atoi(value);
|
systray_max_icon_size = atoi(value);
|
||||||
|
|||||||
@@ -536,9 +536,6 @@ char *get_icon_path_helper(GSList *themes, const char *icon_name, int size)
|
|||||||
char *next_larger = NULL;
|
char *next_larger = NULL;
|
||||||
GSList *next_larger_theme = NULL;
|
GSList *next_larger_theme = NULL;
|
||||||
|
|
||||||
int file_name_size = 4096;
|
|
||||||
char *file_name = calloc(file_name_size, 1);
|
|
||||||
|
|
||||||
for (theme = themes; theme; theme = g_slist_next(theme)) {
|
for (theme = themes; theme; theme = g_slist_next(theme)) {
|
||||||
((IconTheme*)theme->data)->list_directories = g_slist_sort_with_data(((IconTheme*)theme->data)->list_directories,
|
((IconTheme*)theme->data)->list_directories = g_slist_sort_with_data(((IconTheme*)theme->data)->list_directories,
|
||||||
compare_theme_directories,
|
compare_theme_directories,
|
||||||
@@ -563,13 +560,8 @@ char *get_icon_path_helper(GSList *themes, const char *icon_name, int size)
|
|||||||
char *theme_name = ((IconTheme*)theme->data)->name;
|
char *theme_name = ((IconTheme*)theme->data)->name;
|
||||||
char *dir_name = ((IconThemeDir*)dir->data)->name;
|
char *dir_name = ((IconThemeDir*)dir->data)->name;
|
||||||
char *extension = (char*) ext->data;
|
char *extension = (char*) ext->data;
|
||||||
if (strlen(base_name) + strlen(theme_name) +
|
char *file_name = calloc(strlen(base_name) + strlen(theme_name) +
|
||||||
strlen(dir_name) + strlen(icon_name) + strlen(extension) + 100 > file_name_size) {
|
strlen(dir_name) + strlen(icon_name) + strlen(extension) + 100, 1);
|
||||||
file_name_size = strlen(base_name) + strlen(theme_name) +
|
|
||||||
strlen(dir_name) + strlen(icon_name) + strlen(extension) + 100;
|
|
||||||
file_name = realloc(file_name, file_name_size);
|
|
||||||
}
|
|
||||||
file_name[0] = 0;
|
|
||||||
// filename = directory/$(themename)/subdirectory/iconname.extension
|
// filename = directory/$(themename)/subdirectory/iconname.extension
|
||||||
sprintf(file_name, "%s/%s/%s/%s%s", base_name, theme_name, dir_name, icon_name, extension);
|
sprintf(file_name, "%s/%s/%s/%s%s", base_name, theme_name, dir_name, icon_name, extension);
|
||||||
if (DEBUG_ICON_SEARCH)
|
if (DEBUG_ICON_SEARCH)
|
||||||
@@ -604,12 +596,11 @@ char *get_icon_path_helper(GSList *themes, const char *icon_name, int size)
|
|||||||
printf("next_larger = %s; next_larger_size = %d\n", next_larger, next_larger_size);
|
printf("next_larger = %s; next_larger_size = %d\n", next_larger, next_larger_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(file_name);
|
free(file_name);
|
||||||
file_name = NULL;
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (next_larger) {
|
if (next_larger) {
|
||||||
g_slist_free(extensions);
|
g_slist_free(extensions);
|
||||||
free(best_file_name);
|
free(best_file_name);
|
||||||
|
|||||||
@@ -31,8 +31,6 @@
|
|||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <glib/gstdio.h>
|
#include <glib/gstdio.h>
|
||||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_RSVG
|
#ifdef HAVE_RSVG
|
||||||
#include <librsvg/rsvg.h>
|
#include <librsvg/rsvg.h>
|
||||||
@@ -152,7 +150,8 @@ void cleanup_launcher_theme(Launcher *launcher)
|
|||||||
for (l = launcher->list_icons; l ; l = l->next) {
|
for (l = launcher->list_icons; l ; l = l->next) {
|
||||||
LauncherIcon *launcherIcon = (LauncherIcon*)l->data;
|
LauncherIcon *launcherIcon = (LauncherIcon*)l->data;
|
||||||
if (launcherIcon) {
|
if (launcherIcon) {
|
||||||
free_icon(launcherIcon->image);
|
free_icon(launcherIcon->icon_scaled);
|
||||||
|
free_icon(launcherIcon->icon_original);
|
||||||
free(launcherIcon->icon_name);
|
free(launcherIcon->icon_name);
|
||||||
free(launcherIcon->icon_path);
|
free(launcherIcon->icon_path);
|
||||||
free(launcherIcon->cmd);
|
free(launcherIcon->cmd);
|
||||||
@@ -187,7 +186,7 @@ int resize_launcher(void *obj)
|
|||||||
// Resize icons if necessary
|
// Resize icons if necessary
|
||||||
for (l = launcher->list_icons; l ; l = l->next) {
|
for (l = launcher->list_icons; l ; l = l->next) {
|
||||||
LauncherIcon *launcherIcon = (LauncherIcon *)l->data;
|
LauncherIcon *launcherIcon = (LauncherIcon *)l->data;
|
||||||
if (launcherIcon->icon_size != icon_size || !launcherIcon->image) {
|
if (launcherIcon->icon_size != icon_size || !launcherIcon->icon_original) {
|
||||||
launcherIcon->icon_size = icon_size;
|
launcherIcon->icon_size = icon_size;
|
||||||
launcherIcon->area.width = launcherIcon->icon_size;
|
launcherIcon->area.width = launcherIcon->icon_size;
|
||||||
launcherIcon->area.height = launcherIcon->icon_size;
|
launcherIcon->area.height = launcherIcon->icon_size;
|
||||||
@@ -196,72 +195,72 @@ int resize_launcher(void *obj)
|
|||||||
char *new_icon_path = get_icon_path(launcher->list_themes, launcherIcon->icon_name, launcherIcon->icon_size);
|
char *new_icon_path = get_icon_path(launcher->list_themes, launcherIcon->icon_name, launcherIcon->icon_size);
|
||||||
if (!new_icon_path) {
|
if (!new_icon_path) {
|
||||||
// Draw a blank icon
|
// Draw a blank icon
|
||||||
free_icon(launcherIcon->image);
|
free_icon(launcherIcon->icon_original);
|
||||||
launcherIcon->image = NULL;
|
launcherIcon->icon_original = NULL;
|
||||||
|
free_icon(launcherIcon->icon_scaled);
|
||||||
|
launcherIcon->icon_scaled = NULL;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (launcherIcon->icon_path && strcmp(new_icon_path, launcherIcon->icon_path) == 0) {
|
||||||
|
// If it's the same file just rescale
|
||||||
|
free_icon(launcherIcon->icon_scaled);
|
||||||
|
launcherIcon->icon_scaled = scale_icon(launcherIcon->icon_original, icon_size);
|
||||||
|
free(new_icon_path);
|
||||||
|
fprintf(stderr, "launcher.c %d: Using icon %s\n", __LINE__, launcherIcon->icon_path);
|
||||||
|
} else {
|
||||||
// Free the old files
|
// Free the old files
|
||||||
free_icon(launcherIcon->image);
|
free_icon(launcherIcon->icon_original);
|
||||||
launcherIcon->image = NULL;
|
free_icon(launcherIcon->icon_scaled);
|
||||||
|
launcherIcon->icon_original = launcherIcon->icon_scaled = NULL;
|
||||||
// Load the new file and scale
|
// Load the new file and scale
|
||||||
launcherIcon->image = imlib_load_image_immediately(new_icon_path);
|
launcherIcon->icon_original = imlib_load_image_immediately(new_icon_path);
|
||||||
#ifdef HAVE_RSVG
|
#ifdef HAVE_RSVG
|
||||||
if (!launcherIcon->image && g_str_has_suffix(new_icon_path, ".svg")) {
|
if (!launcherIcon->icon_original && g_str_has_suffix(new_icon_path, ".svg")) {
|
||||||
char suffix[128];
|
|
||||||
sprintf(suffix, "tmpicon-%d.png", getpid());
|
|
||||||
// We fork here because librsvg allocates memory like crazy
|
|
||||||
pid_t pid = fork();
|
|
||||||
if (pid == 0) {
|
|
||||||
// Child
|
|
||||||
GError* err = NULL;
|
GError* err = NULL;
|
||||||
RsvgHandle* svg = rsvg_handle_new_from_file(new_icon_path, &err);
|
RsvgHandle* svg = rsvg_handle_new_from_file(new_icon_path, &err);
|
||||||
|
|
||||||
if (err != NULL) {
|
if (err != NULL) {
|
||||||
fprintf(stderr, "Could not load svg image!: %s", err->message);
|
fprintf(stderr, "Could not load svg image!: %s", err->message);
|
||||||
g_error_free(err);
|
g_error_free(err);
|
||||||
launcherIcon->image = NULL;
|
launcherIcon->icon_original = NULL;
|
||||||
} else {
|
} else {
|
||||||
|
char suffix[128];
|
||||||
|
sprintf(suffix, "tmpicon-%d.png", getpid());
|
||||||
gchar *name = g_build_filename(g_get_user_config_dir(), "tint2", suffix, NULL);
|
gchar *name = g_build_filename(g_get_user_config_dir(), "tint2", suffix, NULL);
|
||||||
GdkPixbuf *pixbuf = rsvg_handle_get_pixbuf(svg);
|
GdkPixbuf *pixbuf = rsvg_handle_get_pixbuf(svg);
|
||||||
gdk_pixbuf_save(pixbuf, name, "png", NULL, NULL);
|
gdk_pixbuf_save(pixbuf, name, "png", NULL, NULL);
|
||||||
}
|
launcherIcon->icon_original = imlib_load_image_immediately_without_cache(name);
|
||||||
exit(0);
|
|
||||||
} else {
|
|
||||||
// Parent
|
|
||||||
waitpid(pid, 0, 0);
|
|
||||||
gchar *name = g_build_filename(g_get_user_config_dir(), "tint2", suffix, NULL);
|
|
||||||
launcherIcon->image = imlib_load_image_immediately_without_cache(name);
|
|
||||||
g_remove(name);
|
g_remove(name);
|
||||||
g_free(name);
|
g_free(name);
|
||||||
|
g_object_unref(G_OBJECT(pixbuf));
|
||||||
|
g_object_unref(G_OBJECT(svg));
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
launcherIcon->image = imlib_load_image_immediately(new_icon_path);
|
launcherIcon->icon_original = imlib_load_image_immediately(new_icon_path);
|
||||||
}
|
}
|
||||||
// On loading error, fallback to default
|
// On loading error, fallback to default
|
||||||
if (!launcherIcon->image) {
|
if (!launcherIcon->icon_original) {
|
||||||
free(new_icon_path);
|
free(new_icon_path);
|
||||||
new_icon_path = get_icon_path(launcher->list_themes, DEFAULT_ICON, launcherIcon->icon_size);
|
new_icon_path = get_icon_path(launcher->list_themes, DEFAULT_ICON, launcherIcon->icon_size);
|
||||||
if (new_icon_path)
|
if (new_icon_path)
|
||||||
launcherIcon->image = imlib_load_image_immediately(new_icon_path);
|
launcherIcon->icon_original = imlib_load_image_immediately(new_icon_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!launcherIcon->image) {
|
if (!launcherIcon->icon_original) {
|
||||||
// Loading default icon failed, draw a blank icon
|
// Loading default icon failed, draw a blank icon
|
||||||
free(new_icon_path);
|
free(new_icon_path);
|
||||||
} else {
|
} else {
|
||||||
// Loaded icon successfully
|
// Loaded icon successfully
|
||||||
Imlib_Image original = launcherIcon->image;
|
launcherIcon->icon_scaled = scale_icon(launcherIcon->icon_original, launcherIcon->icon_size);
|
||||||
launcherIcon->image = scale_icon(launcherIcon->image, launcherIcon->icon_size);
|
|
||||||
free_icon(original);
|
|
||||||
free(launcherIcon->icon_path);
|
free(launcherIcon->icon_path);
|
||||||
launcherIcon->icon_path = new_icon_path;
|
launcherIcon->icon_path = new_icon_path;
|
||||||
fprintf(stderr, "launcher.c %d: Using icon %s\n", __LINE__, launcherIcon->icon_path);
|
fprintf(stderr, "launcher.c %d: Using icon %s\n", __LINE__, launcherIcon->icon_path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
count = g_slist_length(launcher->list_icons);
|
count = g_slist_length(launcher->list_icons);
|
||||||
|
|
||||||
@@ -332,7 +331,6 @@ int resize_launcher(void *obj)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,8 +355,9 @@ void draw_launcher_icon(void *obj, cairo_t *c)
|
|||||||
{
|
{
|
||||||
LauncherIcon *launcherIcon = (LauncherIcon*)obj;
|
LauncherIcon *launcherIcon = (LauncherIcon*)obj;
|
||||||
|
|
||||||
|
Imlib_Image icon_scaled = launcherIcon->icon_scaled;
|
||||||
// Render
|
// Render
|
||||||
imlib_context_set_image(launcherIcon->image);
|
imlib_context_set_image(icon_scaled);
|
||||||
if (server.real_transparency) {
|
if (server.real_transparency) {
|
||||||
render_image(launcherIcon->area.pix, 0, 0);
|
render_image(launcherIcon->area.pix, 0, 0);
|
||||||
} else {
|
} else {
|
||||||
@@ -404,7 +403,7 @@ void launcher_action(LauncherIcon *icon, XEvent* evt)
|
|||||||
char *cmd = calloc(strlen(icon->cmd) + 10, 1);
|
char *cmd = calloc(strlen(icon->cmd) + 10, 1);
|
||||||
sprintf(cmd, "(%s&)", icon->cmd);
|
sprintf(cmd, "(%s&)", icon->cmd);
|
||||||
#if HAVE_SN
|
#if HAVE_SN
|
||||||
SnLauncherContext* ctx = 0;
|
SnLauncherContext* ctx;
|
||||||
Time time;
|
Time time;
|
||||||
if (startup_notifications) {
|
if (startup_notifications) {
|
||||||
ctx = sn_launcher_context_new(server.sn_dsp, server.screen);
|
ctx = sn_launcher_context_new(server.sn_dsp, server.screen);
|
||||||
|
|||||||
@@ -23,7 +23,8 @@ typedef struct Launcher {
|
|||||||
typedef struct LauncherIcon {
|
typedef struct LauncherIcon {
|
||||||
// always start with area
|
// always start with area
|
||||||
Area area;
|
Area area;
|
||||||
Imlib_Image image;
|
Imlib_Image icon_scaled;
|
||||||
|
Imlib_Image icon_original;
|
||||||
char *cmd;
|
char *cmd;
|
||||||
char *icon_name;
|
char *icon_name;
|
||||||
char *icon_path;
|
char *icon_path;
|
||||||
|
|||||||
22
src/panel.c
22
src/panel.c
@@ -354,7 +354,7 @@ int resize_panel(void *obj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Taskbar *taskbar = &panel->taskbar[i];
|
Taskbar *taskbar = &panel->taskbar[i];
|
||||||
GSList *l;
|
GList *l;
|
||||||
for (l = taskbar->area.list; l; l = l->next) {
|
for (l = taskbar->area.list; l; l = l->next) {
|
||||||
Area *child = l->data;
|
Area *child = l->data;
|
||||||
if (!child->on_screen)
|
if (!child->on_screen)
|
||||||
@@ -389,7 +389,7 @@ int resize_panel(void *obj)
|
|||||||
|
|
||||||
int requested_size = (2 * taskbar->area.bg->border.width) + (2 * taskbar->area.paddingxlr);
|
int requested_size = (2 * taskbar->area.bg->border.width) + (2 * taskbar->area.paddingxlr);
|
||||||
int items = 0;
|
int items = 0;
|
||||||
GSList *l = taskbar->area.list;
|
GList *l = taskbar->area.list;
|
||||||
if (taskbarname_enabled)
|
if (taskbarname_enabled)
|
||||||
l = l->next;
|
l = l->next;
|
||||||
for (; l; l = l->next) {
|
for (; l; l = l->next) {
|
||||||
@@ -482,29 +482,29 @@ void set_panel_items_order(Panel *p)
|
|||||||
int k, j;
|
int k, j;
|
||||||
|
|
||||||
if (p->area.list) {
|
if (p->area.list) {
|
||||||
g_slist_free(p->area.list);
|
g_list_free(p->area.list);
|
||||||
p->area.list = 0;
|
p->area.list = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (k=0 ; k < strlen(panel_items_order) ; k++) {
|
for (k=0 ; k < strlen(panel_items_order) ; k++) {
|
||||||
if (panel_items_order[k] == 'L') {
|
if (panel_items_order[k] == 'L') {
|
||||||
p->area.list = g_slist_append(p->area.list, &p->launcher);
|
p->area.list = g_list_append(p->area.list, &p->launcher);
|
||||||
p->launcher.area.resize = 1;
|
p->launcher.area.resize = 1;
|
||||||
}
|
}
|
||||||
if (panel_items_order[k] == 'T') {
|
if (panel_items_order[k] == 'T') {
|
||||||
for (j=0 ; j < p->nb_desktop ; j++)
|
for (j=0 ; j < p->nb_desktop ; j++)
|
||||||
p->area.list = g_slist_append(p->area.list, &p->taskbar[j]);
|
p->area.list = g_list_append(p->area.list, &p->taskbar[j]);
|
||||||
}
|
}
|
||||||
#ifdef ENABLE_BATTERY
|
#ifdef ENABLE_BATTERY
|
||||||
if (panel_items_order[k] == 'B')
|
if (panel_items_order[k] == 'B')
|
||||||
p->area.list = g_slist_append(p->area.list, &p->battery);
|
p->area.list = g_list_append(p->area.list, &p->battery);
|
||||||
#endif
|
#endif
|
||||||
int i = p - panel1;
|
int i = p - panel1;
|
||||||
if (panel_items_order[k] == 'S' && systray_on_monitor(i, nb_panel)) {
|
if (panel_items_order[k] == 'S' && systray_on_monitor(i, nb_panel)) {
|
||||||
p->area.list = g_slist_append(p->area.list, &systray);
|
p->area.list = g_list_append(p->area.list, &systray);
|
||||||
}
|
}
|
||||||
if (panel_items_order[k] == 'C')
|
if (panel_items_order[k] == 'C')
|
||||||
p->area.list = g_slist_append(p->area.list, &p->clock);
|
p->area.list = g_list_append(p->area.list, &p->clock);
|
||||||
}
|
}
|
||||||
init_rendering(&p->area, 0);
|
init_rendering(&p->area, 0);
|
||||||
}
|
}
|
||||||
@@ -629,7 +629,7 @@ void set_panel_background(Panel *p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// redraw panel's object
|
// redraw panel's object
|
||||||
GSList *l0;
|
GList *l0;
|
||||||
Area *a;
|
Area *a;
|
||||||
for (l0 = p->area.list; l0 ; l0 = l0->next) {
|
for (l0 = p->area.list; l0 ; l0 = l0->next) {
|
||||||
a = l0->data;
|
a = l0->data;
|
||||||
@@ -695,7 +695,7 @@ Taskbar *click_taskbar (Panel *panel, int x, int y)
|
|||||||
|
|
||||||
Task *click_task (Panel *panel, int x, int y)
|
Task *click_task (Panel *panel, int x, int y)
|
||||||
{
|
{
|
||||||
GSList *l0;
|
GList *l0;
|
||||||
Taskbar *tskbar;
|
Taskbar *tskbar;
|
||||||
|
|
||||||
if ( (tskbar = click_taskbar(panel, x, y)) ) {
|
if ( (tskbar = click_taskbar(panel, x, y)) ) {
|
||||||
@@ -797,7 +797,7 @@ Area* click_area(Panel *panel, int x, int y)
|
|||||||
Area* new_result = result;
|
Area* new_result = result;
|
||||||
do {
|
do {
|
||||||
result = new_result;
|
result = new_result;
|
||||||
GSList* it = result->list;
|
GList* it = result->list;
|
||||||
while (it) {
|
while (it) {
|
||||||
Area* a = it->data;
|
Area* a = it->data;
|
||||||
if (a->on_screen && x >= a->posx && x <= (a->posx + a->width)
|
if (a->on_screen && x >= a->posx && x <= (a->posx + a->width)
|
||||||
|
|||||||
@@ -98,7 +98,6 @@ void server_init_atoms ()
|
|||||||
server.atom._NET_SYSTEM_TRAY_ORIENTATION = XInternAtom(server.dsp, "_NET_SYSTEM_TRAY_ORIENTATION", False);
|
server.atom._NET_SYSTEM_TRAY_ORIENTATION = XInternAtom(server.dsp, "_NET_SYSTEM_TRAY_ORIENTATION", False);
|
||||||
server.atom._XEMBED = XInternAtom(server.dsp, "_XEMBED", False);
|
server.atom._XEMBED = XInternAtom(server.dsp, "_XEMBED", False);
|
||||||
server.atom._XEMBED_INFO = XInternAtom(server.dsp, "_XEMBED_INFO", False);
|
server.atom._XEMBED_INFO = XInternAtom(server.dsp, "_XEMBED_INFO", False);
|
||||||
server.atom._NET_WM_PID = XInternAtom(server.dsp, "_NET_WM_PID", True);
|
|
||||||
|
|
||||||
// drag 'n' drop
|
// drag 'n' drop
|
||||||
server.atom.XdndAware = XInternAtom(server.dsp, "XdndAware", False);
|
server.atom.XdndAware = XInternAtom(server.dsp, "XdndAware", False);
|
||||||
|
|||||||
@@ -15,8 +15,9 @@
|
|||||||
|
|
||||||
#ifdef HAVE_SN
|
#ifdef HAVE_SN
|
||||||
#include <libsn/sn.h>
|
#include <libsn/sn.h>
|
||||||
#endif
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
typedef struct Global_atom
|
typedef struct Global_atom
|
||||||
{
|
{
|
||||||
@@ -73,7 +74,6 @@ typedef struct Global_atom
|
|||||||
Atom _NET_SYSTEM_TRAY_ORIENTATION;
|
Atom _NET_SYSTEM_TRAY_ORIENTATION;
|
||||||
Atom _XEMBED;
|
Atom _XEMBED;
|
||||||
Atom _XEMBED_INFO;
|
Atom _XEMBED_INFO;
|
||||||
Atom _NET_WM_PID;
|
|
||||||
Atom _XSETTINGS_SCREEN;
|
Atom _XSETTINGS_SCREEN;
|
||||||
Atom _XSETTINGS_SETTINGS;
|
Atom _XSETTINGS_SETTINGS;
|
||||||
Atom XdndAware;
|
Atom XdndAware;
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ int refresh_systray;
|
|||||||
int systray_enabled;
|
int systray_enabled;
|
||||||
int systray_max_icon_size;
|
int systray_max_icon_size;
|
||||||
int systray_monitor;
|
int systray_monitor;
|
||||||
int chrono;
|
|
||||||
// background pixmap if we render ourselves the icons
|
// background pixmap if we render ourselves the icons
|
||||||
static Pixmap render_background;
|
static Pixmap render_background;
|
||||||
|
|
||||||
@@ -61,9 +61,8 @@ void default_systray()
|
|||||||
{
|
{
|
||||||
memset(&systray, 0, sizeof(Systraybar));
|
memset(&systray, 0, sizeof(Systraybar));
|
||||||
render_background = 0;
|
render_background = 0;
|
||||||
chrono = 0;
|
|
||||||
systray.alpha = 100;
|
systray.alpha = 100;
|
||||||
systray.sort = SYSTRAY_SORT_LEFT2RIGHT;
|
systray.sort = 3;
|
||||||
systray.area._draw_foreground = draw_systray;
|
systray.area._draw_foreground = draw_systray;
|
||||||
systray.area._on_change_layout = on_change_systray;
|
systray.area._on_change_layout = on_change_systray;
|
||||||
systray.area.size_mode = SIZE_BY_CONTENT;
|
systray.area.size_mode = SIZE_BY_CONTENT;
|
||||||
@@ -109,8 +108,7 @@ void init_systray_panel(void *p)
|
|||||||
GSList *l;
|
GSList *l;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (l = systray.list_icons; l ; l = l->next) {
|
for (l = systray.list_icons; l ; l = l->next) {
|
||||||
if (((TrayWindow*)l->data)->hide)
|
if (!((TrayWindow*)l->data)->hide)
|
||||||
continue;
|
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
@@ -148,8 +146,7 @@ int resize_systray(void *obj)
|
|||||||
sysbar->icon_size = systray_max_icon_size;
|
sysbar->icon_size = systray_max_icon_size;
|
||||||
count = 0;
|
count = 0;
|
||||||
for (l = systray.list_icons; l ; l = l->next) {
|
for (l = systray.list_icons; l ; l = l->next) {
|
||||||
if (((TrayWindow*)l->data)->hide)
|
if (!((TrayWindow*)l->data)->hide)
|
||||||
continue;
|
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
//printf("count %d\n", count);
|
//printf("count %d\n", count);
|
||||||
@@ -197,12 +194,11 @@ void on_change_systray (void *obj)
|
|||||||
GSList *l;
|
GSList *l;
|
||||||
for (i=1, l = systray.list_icons; l ; i++, l = l->next) {
|
for (i=1, l = systray.list_icons; l ; i++, l = l->next) {
|
||||||
traywin = (TrayWindow*)l->data;
|
traywin = (TrayWindow*)l->data;
|
||||||
if (traywin->hide)
|
if (traywin->hide) continue;
|
||||||
continue;
|
|
||||||
|
|
||||||
traywin->y = posy;
|
traywin->y = posy;
|
||||||
traywin->x = posx;
|
traywin->x = posx;
|
||||||
// printf("systray %d : pos %d, %d\n", traywin->tray_id, posx, posy);
|
//printf("systray %d : %d,%d\n", i, posx, posy);
|
||||||
traywin->width = sysbar->icon_size;
|
traywin->width = sysbar->icon_size;
|
||||||
traywin->height = sysbar->icon_size;
|
traywin->height = sysbar->icon_size;
|
||||||
if (panel_horizontal) {
|
if (panel_horizontal) {
|
||||||
@@ -340,39 +336,21 @@ static gint compare_traywindows(gconstpointer a, gconstpointer b)
|
|||||||
{
|
{
|
||||||
const TrayWindow * traywin_a = (TrayWindow*)a;
|
const TrayWindow * traywin_a = (TrayWindow*)a;
|
||||||
const TrayWindow * traywin_b = (TrayWindow*)b;
|
const TrayWindow * traywin_b = (TrayWindow*)b;
|
||||||
|
|
||||||
if (traywin_a->empty && !traywin_b->empty)
|
|
||||||
return 1;
|
|
||||||
if (!traywin_a->empty && traywin_b->empty)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (systray.sort == SYSTRAY_SORT_ASCENDING ||
|
|
||||||
systray.sort == SYSTRAY_SORT_DESCENDING) {
|
|
||||||
XTextProperty name_a, name_b;
|
XTextProperty name_a, name_b;
|
||||||
|
|
||||||
if (XGetWMName(server.dsp, traywin_a->tray_id, &name_a) == 0) {
|
if(XGetWMName(server.dsp, traywin_a->tray_id, &name_a) == 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else if (XGetWMName(server.dsp, traywin_b->tray_id, &name_b) == 0) {
|
else if(XGetWMName(server.dsp, traywin_b->tray_id, &name_b) == 0) {
|
||||||
XFree(name_a.value);
|
XFree(name_a.value);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
gint retval = g_ascii_strncasecmp((char*)name_a.value, (char*)name_b.value, -1) *
|
gint retval = g_ascii_strncasecmp((char*)name_a.value, (char*)name_b.value, -1) * systray.sort;
|
||||||
(systray.sort == SYSTRAY_SORT_ASCENDING ? 1 : -1);
|
|
||||||
XFree(name_a.value);
|
XFree(name_a.value);
|
||||||
XFree(name_b.value);
|
XFree(name_b.value);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (systray.sort == SYSTRAY_SORT_LEFT2RIGHT ||
|
|
||||||
systray.sort == SYSTRAY_SORT_RIGHT2LEFT) {
|
|
||||||
return (traywin_a->chrono - traywin_b->chrono) *
|
|
||||||
(systray.sort == SYSTRAY_SORT_LEFT2RIGHT ? 1 : -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -383,42 +361,12 @@ gboolean add_icon(Window id)
|
|||||||
Panel *panel = systray.area.panel;
|
Panel *panel = systray.area.panel;
|
||||||
int hide = 0;
|
int hide = 0;
|
||||||
|
|
||||||
int pid = 0;
|
|
||||||
{
|
|
||||||
Atom actual_type;
|
|
||||||
int actual_format;
|
|
||||||
unsigned long nitems;
|
|
||||||
unsigned long bytes_after;
|
|
||||||
unsigned char *prop = 0;
|
|
||||||
int ret = XGetWindowProperty(server.dsp, id, server.atom._NET_WM_PID, 0, 1024, False, AnyPropertyType, &actual_type, &actual_format, &nitems, &bytes_after, &prop);
|
|
||||||
if (ret == Success && prop) {
|
|
||||||
pid = prop[1] * 256;
|
|
||||||
pid += prop[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GSList *l;
|
GSList *l;
|
||||||
int num_empty_same_pid = 0;
|
|
||||||
for (l = systray.list_icons; l; l = l->next) {
|
for (l = systray.list_icons; l; l = l->next) {
|
||||||
if (((TrayWindow*)l->data)->tray_id == id)
|
if (((TrayWindow*)l->data)->tray_id == id)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (pid && ((TrayWindow*)l->data)->pid == pid && ((TrayWindow*)l->data)->empty)
|
|
||||||
num_empty_same_pid++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const int max_num_empty_same_pid = 0;
|
|
||||||
if (num_empty_same_pid > max_num_empty_same_pid) {
|
|
||||||
for (l = systray.list_icons; l; l = l->next) {
|
|
||||||
if (pid && ((TrayWindow*)l->data)->pid == pid && ((TrayWindow*)l->data)->empty) {
|
|
||||||
num_empty_same_pid++;
|
|
||||||
fprintf(stderr, "Removing tray icon %lu from misbehaving application with pid=%d\n", ((TrayWindow*)l->data)->tray_id, pid);
|
|
||||||
remove_icon((TrayWindow*)l->data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//printf("add_icon: %d, pid %d, %d\n", id, pid, num_empty_same_pid);
|
|
||||||
|
|
||||||
error = FALSE;
|
error = FALSE;
|
||||||
XWindowAttributes attr;
|
XWindowAttributes attr;
|
||||||
if ( XGetWindowAttributes(server.dsp, id, &attr) == False ) return FALSE;
|
if ( XGetWindowAttributes(server.dsp, id, &attr) == False ) return FALSE;
|
||||||
@@ -497,19 +445,16 @@ gboolean add_icon(Window id)
|
|||||||
traywin->hide = hide;
|
traywin->hide = hide;
|
||||||
traywin->depth = attr.depth;
|
traywin->depth = attr.depth;
|
||||||
traywin->damage = 0;
|
traywin->damage = 0;
|
||||||
traywin->empty = 0;
|
|
||||||
traywin->pid = pid;
|
|
||||||
traywin->chrono = chrono;
|
|
||||||
chrono++;
|
|
||||||
|
|
||||||
if (systray.area.on_screen == 0)
|
if (systray.area.on_screen == 0)
|
||||||
show(&systray.area);
|
show(&systray.area);
|
||||||
|
|
||||||
if (systray.sort == SYSTRAY_SORT_RIGHT2LEFT)
|
if (systray.sort == 3)
|
||||||
systray.list_icons = g_slist_prepend(systray.list_icons, traywin);
|
systray.list_icons = g_slist_prepend(systray.list_icons, traywin);
|
||||||
else
|
else if (systray.sort == 2)
|
||||||
systray.list_icons = g_slist_append(systray.list_icons, traywin);
|
systray.list_icons = g_slist_append(systray.list_icons, traywin);
|
||||||
systray.list_icons = g_slist_sort(systray.list_icons, compare_traywindows);
|
else
|
||||||
|
systray.list_icons = g_slist_insert_sorted(systray.list_icons, traywin, compare_traywindows);
|
||||||
//printf("add_icon id %lx, %d\n", id, g_slist_length(systray.list_icons));
|
//printf("add_icon id %lx, %d\n", id, g_slist_length(systray.list_icons));
|
||||||
|
|
||||||
if (FORCE_COMPOSITED_RENDERING || server.real_transparency || systray.alpha != 100 || systray.brightness != 0 || systray.saturation != 0) {
|
if (FORCE_COMPOSITED_RENDERING || server.real_transparency || systray.alpha != 100 || systray.brightness != 0 || systray.saturation != 0) {
|
||||||
@@ -536,7 +481,7 @@ void remove_icon(TrayWindow *traywin)
|
|||||||
|
|
||||||
// remove from our list
|
// remove from our list
|
||||||
systray.list_icons = g_slist_remove(systray.list_icons, traywin);
|
systray.list_icons = g_slist_remove(systray.list_icons, traywin);
|
||||||
//printf("remove_icon: %d\n", traywin->tray_id);
|
//printf("remove_icon id %lx, %d\n", traywin->id);
|
||||||
|
|
||||||
XSelectInput(server.dsp, traywin->tray_id, NoEventMask);
|
XSelectInput(server.dsp, traywin->tray_id, NoEventMask);
|
||||||
if (traywin->damage)
|
if (traywin->damage)
|
||||||
@@ -558,8 +503,7 @@ void remove_icon(TrayWindow *traywin)
|
|||||||
int count = 0;
|
int count = 0;
|
||||||
GSList *l;
|
GSList *l;
|
||||||
for (l = systray.list_icons; l; l = l->next) {
|
for (l = systray.list_icons; l; l = l->next) {
|
||||||
if (((TrayWindow*)l->data)->hide)
|
if (!((TrayWindow*)l->data)->hide)
|
||||||
continue;
|
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
@@ -602,7 +546,6 @@ void systray_render_icon_now(void* t)
|
|||||||
// we end up in this function only in real transparency mode or if systray_task_asb != 100 0 0
|
// we end up in this function only in real transparency mode or if systray_task_asb != 100 0 0
|
||||||
// we made also sure, that we always have a 32 bit visual, i.e. we can safely create 32 bit pixmaps here
|
// we made also sure, that we always have a 32 bit visual, i.e. we can safely create 32 bit pixmaps here
|
||||||
TrayWindow* traywin = t;
|
TrayWindow* traywin = t;
|
||||||
|
|
||||||
traywin->render_timeout = 0;
|
traywin->render_timeout = 0;
|
||||||
if ( traywin->width == 0 || traywin->height == 0 ) {
|
if ( traywin->width == 0 || traywin->height == 0 ) {
|
||||||
// reschedule rendering since the geometry information has not yet been processed (can happen on slow cpu)
|
// reschedule rendering since the geometry information has not yet been processed (can happen on slow cpu)
|
||||||
@@ -610,30 +553,6 @@ void systray_render_icon_now(void* t)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int empty = 1;
|
|
||||||
XImage *ximage = XGetImage(server.dsp, traywin->tray_id, 0, 0, traywin->width, traywin->height, AllPlanes, XYPixmap);
|
|
||||||
if (ximage) {
|
|
||||||
XColor color;
|
|
||||||
int x, y;
|
|
||||||
for (x = 0; empty && x < traywin->width; x++) {
|
|
||||||
for (y = 0; empty && y < traywin->height; y++) {
|
|
||||||
color.pixel = XGetPixel(ximage, x, y);
|
|
||||||
if (color.pixel != 0)
|
|
||||||
empty = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
XFree(ximage);
|
|
||||||
}
|
|
||||||
if (traywin->empty != empty) {
|
|
||||||
traywin->empty = empty;
|
|
||||||
systray.area.resize = 1;
|
|
||||||
panel_refresh = 1;
|
|
||||||
systray.list_icons = g_slist_sort(systray.list_icons, compare_traywindows);
|
|
||||||
}
|
|
||||||
//printf("systray_render_icon_now: %d empty %d\n", traywin->tray_id, empty);
|
|
||||||
if (empty)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// good systray icons support 32 bit depth, but some icons are still 24 bit.
|
// good systray icons support 32 bit depth, but some icons are still 24 bit.
|
||||||
// We create a heuristic mask for these icons, i.e. we get the rgb value in the top left corner, and
|
// We create a heuristic mask for these icons, i.e. we get the rgb value in the top left corner, and
|
||||||
// mask out all pixel with the same rgb value
|
// mask out all pixel with the same rgb value
|
||||||
@@ -717,8 +636,7 @@ void refresh_systray_icon()
|
|||||||
GSList *l;
|
GSList *l;
|
||||||
for (l = systray.list_icons; l ; l = l->next) {
|
for (l = systray.list_icons; l ; l = l->next) {
|
||||||
traywin = (TrayWindow*)l->data;
|
traywin = (TrayWindow*)l->data;
|
||||||
if (traywin->hide)
|
if (traywin->hide) continue;
|
||||||
continue;
|
|
||||||
systray_render_icon(traywin);
|
systray_render_icon(traywin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,6 @@
|
|||||||
// Flags for _XEMBED_INFO
|
// Flags for _XEMBED_INFO
|
||||||
#define XEMBED_MAPPED (1 << 0)
|
#define XEMBED_MAPPED (1 << 0)
|
||||||
|
|
||||||
enum { SYSTRAY_SORT_ASCENDING, SYSTRAY_SORT_DESCENDING, SYSTRAY_SORT_LEFT2RIGHT, SYSTRAY_SORT_RIGHT2LEFT };
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
// always start with area
|
// always start with area
|
||||||
@@ -44,9 +43,6 @@ typedef struct
|
|||||||
int depth;
|
int depth;
|
||||||
Damage damage;
|
Damage damage;
|
||||||
timeout* render_timeout;
|
timeout* render_timeout;
|
||||||
int empty;
|
|
||||||
int pid;
|
|
||||||
int chrono;
|
|
||||||
} TrayWindow;
|
} TrayWindow;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -50,9 +50,6 @@ Task *add_task (Window win)
|
|||||||
if (!win) return 0;
|
if (!win) return 0;
|
||||||
if (window_is_hidden(win)) return 0;
|
if (window_is_hidden(win)) return 0;
|
||||||
|
|
||||||
XSelectInput(server.dsp, win, PropertyChangeMask|StructureNotifyMask);
|
|
||||||
XFlush(server.dsp);
|
|
||||||
|
|
||||||
int monitor;
|
int monitor;
|
||||||
if (nb_panel > 1) {
|
if (nb_panel > 1) {
|
||||||
monitor = window_get_monitor (win);
|
monitor = window_get_monitor (win);
|
||||||
@@ -78,7 +75,8 @@ Task *add_task (Window win)
|
|||||||
get_title(&new_tsk);
|
get_title(&new_tsk);
|
||||||
get_icon(&new_tsk);
|
get_icon(&new_tsk);
|
||||||
|
|
||||||
//printf("new task %s win %u: desktop %d, monitor %d\n", new_tsk.title, win, new_tsk.desktop, monitor);
|
//printf("task %s : desktop %d, monitor %d\n", new_tsk->title, desktop, monitor);
|
||||||
|
XSelectInput (server.dsp, new_tsk.win, PropertyChangeMask|StructureNotifyMask);
|
||||||
|
|
||||||
GPtrArray* task_group = g_ptr_array_new();
|
GPtrArray* task_group = g_ptr_array_new();
|
||||||
Taskbar *tskbar;
|
Taskbar *tskbar;
|
||||||
@@ -111,7 +109,7 @@ Task *add_task (Window win)
|
|||||||
}
|
}
|
||||||
new_tsk2->icon_width = new_tsk.icon_width;
|
new_tsk2->icon_width = new_tsk.icon_width;
|
||||||
new_tsk2->icon_height = new_tsk.icon_height;
|
new_tsk2->icon_height = new_tsk.icon_height;
|
||||||
tskbar->area.list = g_slist_append(tskbar->area.list, new_tsk2);
|
tskbar->area.list = g_list_append(tskbar->area.list, new_tsk2);
|
||||||
tskbar->area.resize = 1;
|
tskbar->area.resize = 1;
|
||||||
g_ptr_array_add(task_group, new_tsk2);
|
g_ptr_array_add(task_group, new_tsk2);
|
||||||
//printf("add_task panel %d, desktop %d, task %s\n", i, j, new_tsk2->title);
|
//printf("add_task panel %d, desktop %d, task %s\n", i, j, new_tsk2->title);
|
||||||
@@ -169,7 +167,7 @@ void remove_task (Task *tsk)
|
|||||||
for (i=0; i<task_group->len; ++i) {
|
for (i=0; i<task_group->len; ++i) {
|
||||||
tsk2 = g_ptr_array_index(task_group, i);
|
tsk2 = g_ptr_array_index(task_group, i);
|
||||||
tskbar = tsk2->area.parent;
|
tskbar = tsk2->area.parent;
|
||||||
tskbar->area.list = g_slist_remove(tskbar->area.list, tsk2);
|
tskbar->area.list = g_list_remove(tskbar->area.list, tsk2);
|
||||||
tskbar->area.resize = 1;
|
tskbar->area.resize = 1;
|
||||||
if (tsk2 == task_active) task_active = 0;
|
if (tsk2 == task_active) task_active = 0;
|
||||||
if (tsk2 == task_drag) task_drag = 0;
|
if (tsk2 == task_drag) task_drag = 0;
|
||||||
@@ -424,15 +422,13 @@ Task *find_active_task(Task *current_task, Task *active_task)
|
|||||||
if (active_task == NULL)
|
if (active_task == NULL)
|
||||||
return current_task;
|
return current_task;
|
||||||
|
|
||||||
GSList *l0;
|
|
||||||
Task *tsk;
|
|
||||||
Taskbar* tskbar = current_task->area.parent;
|
Taskbar* tskbar = current_task->area.parent;
|
||||||
|
|
||||||
l0 = tskbar->area.list;
|
GList *l0 = tskbar->area.list;
|
||||||
if (taskbarname_enabled)
|
if (taskbarname_enabled)
|
||||||
l0 = l0->next;
|
l0 = l0->next;
|
||||||
for (; l0 ; l0 = l0->next) {
|
for (; l0 ; l0 = l0->next) {
|
||||||
tsk = l0->data;
|
Task *tsk = l0->data;
|
||||||
if (tsk->win == active_task->win)
|
if (tsk->win == active_task->win)
|
||||||
return tsk;
|
return tsk;
|
||||||
}
|
}
|
||||||
@@ -445,15 +441,13 @@ Task *next_task(Task *tsk)
|
|||||||
if (tsk == 0)
|
if (tsk == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
GSList *l0, *lfirst_tsk;
|
|
||||||
Task *tsk1;
|
|
||||||
Taskbar* tskbar = tsk->area.parent;
|
Taskbar* tskbar = tsk->area.parent;
|
||||||
|
|
||||||
l0 = tskbar->area.list;
|
GList *l0 = tskbar->area.list;
|
||||||
if (taskbarname_enabled) l0 = l0->next;
|
if (taskbarname_enabled) l0 = l0->next;
|
||||||
lfirst_tsk = l0;
|
GList *lfirst_tsk = l0;
|
||||||
for (; l0 ; l0 = l0->next) {
|
for (; l0 ; l0 = l0->next) {
|
||||||
tsk1 = l0->data;
|
Task *tsk1 = l0->data;
|
||||||
if (tsk1 == tsk) {
|
if (tsk1 == tsk) {
|
||||||
if (l0->next == 0) l0 = lfirst_tsk;
|
if (l0->next == 0) l0 = lfirst_tsk;
|
||||||
else l0 = l0->next;
|
else l0 = l0->next;
|
||||||
@@ -469,19 +463,18 @@ Task *prev_task(Task *tsk)
|
|||||||
if (tsk == 0)
|
if (tsk == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
GSList *l0, *lfirst_tsk;
|
|
||||||
Task *tsk1, *tsk2;
|
Task *tsk1, *tsk2;
|
||||||
Taskbar* tskbar = tsk->area.parent;
|
Taskbar* tskbar = tsk->area.parent;
|
||||||
|
|
||||||
tsk2 = 0;
|
tsk2 = 0;
|
||||||
l0 = tskbar->area.list;
|
GList *l0 = tskbar->area.list;
|
||||||
if (taskbarname_enabled) l0 = l0->next;
|
if (taskbarname_enabled) l0 = l0->next;
|
||||||
lfirst_tsk = l0;
|
GList *lfirst_tsk = l0;
|
||||||
for (; l0 ; l0 = l0->next) {
|
for (; l0 ; l0 = l0->next) {
|
||||||
tsk1 = l0->data;
|
tsk1 = l0->data;
|
||||||
if (tsk1 == tsk) {
|
if (tsk1 == tsk) {
|
||||||
if (l0 == lfirst_tsk) {
|
if (l0 == lfirst_tsk) {
|
||||||
l0 = g_slist_last ( l0 );
|
l0 = g_list_last ( l0 );
|
||||||
tsk2 = l0->data;
|
tsk2 = l0->data;
|
||||||
}
|
}
|
||||||
return tsk2;
|
return tsk2;
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ void cleanup_taskbar()
|
|||||||
}
|
}
|
||||||
free_area(&tskbar->area);
|
free_area(&tskbar->area);
|
||||||
// remove taskbar from the panel
|
// remove taskbar from the panel
|
||||||
panel->area.list = g_slist_remove(panel->area.list, tskbar);
|
panel->area.list = g_list_remove(panel->area.list, tskbar);
|
||||||
}
|
}
|
||||||
if (panel->taskbar) {
|
if (panel->taskbar) {
|
||||||
free(panel->taskbar);
|
free(panel->taskbar);
|
||||||
@@ -153,6 +153,7 @@ void init_taskbar_panel(void *p)
|
|||||||
panel->g_taskbar.area.parent = panel;
|
panel->g_taskbar.area.parent = panel;
|
||||||
panel->g_taskbar.area.panel = panel;
|
panel->g_taskbar.area.panel = panel;
|
||||||
panel->g_taskbar.area.size_mode = SIZE_BY_LAYOUT;
|
panel->g_taskbar.area.size_mode = SIZE_BY_LAYOUT;
|
||||||
|
panel->g_taskbar.area.alignment = ALIGN_CENTER;
|
||||||
panel->g_taskbar.area._resize = resize_taskbar;
|
panel->g_taskbar.area._resize = resize_taskbar;
|
||||||
panel->g_taskbar.area._draw_foreground = draw_taskbar;
|
panel->g_taskbar.area._draw_foreground = draw_taskbar;
|
||||||
panel->g_taskbar.area._on_change_layout = on_change_taskbar;
|
panel->g_taskbar.area._on_change_layout = on_change_taskbar;
|
||||||
@@ -334,7 +335,7 @@ int resize_taskbar(void *obj)
|
|||||||
resize_by_layout(obj, panel->g_task.maximum_width);
|
resize_by_layout(obj, panel->g_task.maximum_width);
|
||||||
|
|
||||||
text_width = panel->g_task.maximum_width;
|
text_width = panel->g_task.maximum_width;
|
||||||
GSList *l = taskbar->area.list;
|
GList *l = taskbar->area.list;
|
||||||
if (taskbarname_enabled) l = l->next;
|
if (taskbarname_enabled) l = l->next;
|
||||||
for (; l != NULL; l = l->next) {
|
for (; l != NULL; l = l->next) {
|
||||||
if (((Task *)l->data)->area.on_screen) {
|
if (((Task *)l->data)->area.on_screen) {
|
||||||
@@ -388,7 +389,7 @@ void set_taskbar_state(Taskbar *tskbar, int state)
|
|||||||
if (taskbarname_enabled && tskbar->bar_name.state_pix[state] == 0)
|
if (taskbarname_enabled && tskbar->bar_name.state_pix[state] == 0)
|
||||||
tskbar->bar_name.area.redraw = 1;
|
tskbar->bar_name.area.redraw = 1;
|
||||||
if (panel_mode == MULTI_DESKTOP && panel1[0].g_taskbar.background[TASKBAR_NORMAL] != panel1[0].g_taskbar.background[TASKBAR_ACTIVE]) {
|
if (panel_mode == MULTI_DESKTOP && panel1[0].g_taskbar.background[TASKBAR_NORMAL] != panel1[0].g_taskbar.background[TASKBAR_ACTIVE]) {
|
||||||
GSList *l = tskbar->area.list;
|
GList *l = tskbar->area.list;
|
||||||
if (taskbarname_enabled) l = l->next;
|
if (taskbarname_enabled) l = l->next;
|
||||||
for ( ; l ; l = l->next)
|
for ( ; l ; l = l->next)
|
||||||
set_task_redraw(l->data);
|
set_task_redraw(l->data);
|
||||||
@@ -511,7 +512,7 @@ int taskbar_needs_sort(Taskbar *taskbar)
|
|||||||
if (taskbar_sort_method == TASKBAR_NOSORT)
|
if (taskbar_sort_method == TASKBAR_NOSORT)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
GSList *i, *j;
|
GList *i, *j;
|
||||||
for (i = taskbar->area.list, j = i ? i->next : NULL; i && j; i = i->next, j = j->next) {
|
for (i = taskbar->area.list, j = i ? i->next : NULL; i && j; i = i->next, j = j->next) {
|
||||||
if (compare_tasks(i->data, j->data, taskbar) > 0) {
|
if (compare_tasks(i->data, j->data, taskbar) > 0) {
|
||||||
return 1;
|
return 1;
|
||||||
@@ -528,7 +529,7 @@ void sort_tasks(Taskbar *taskbar)
|
|||||||
if (!taskbar_needs_sort(taskbar)) {
|
if (!taskbar_needs_sort(taskbar)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
taskbar->area.list = g_slist_sort_with_data(taskbar->area.list, (GCompareDataFunc)compare_tasks, taskbar);
|
taskbar->area.list = g_list_sort_with_data(taskbar->area.list, (GCompareDataFunc)compare_tasks, taskbar);
|
||||||
taskbar->area.resize = 1;
|
taskbar->area.resize = 1;
|
||||||
panel_refresh = 1;
|
panel_refresh = 1;
|
||||||
((Panel*)taskbar->area.panel)->area.resize = 1;
|
((Panel*)taskbar->area.panel)->area.resize = 1;
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ void init_taskbarname_panel(void *p)
|
|||||||
tskbar->bar_name.name = g_strdup_printf("%d", j+1);
|
tskbar->bar_name.name = g_strdup_printf("%d", j+1);
|
||||||
|
|
||||||
// append the name at the beginning of taskbar
|
// append the name at the beginning of taskbar
|
||||||
tskbar->area.list = g_slist_append(tskbar->area.list, &tskbar->bar_name);
|
tskbar->area.list = g_list_append(tskbar->area.list, &tskbar->bar_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (l=list ; l ; l = l->next)
|
for (l=list ; l ; l = l->next)
|
||||||
@@ -103,7 +103,7 @@ void cleanup_taskbarname()
|
|||||||
XFreePixmap(server.dsp, tskbar->bar_name.state_pix[k]);
|
XFreePixmap(server.dsp, tskbar->bar_name.state_pix[k]);
|
||||||
tskbar->bar_name.state_pix[k] = 0;
|
tskbar->bar_name.state_pix[k] = 0;
|
||||||
}
|
}
|
||||||
tskbar->area.list = g_slist_remove(tskbar->area.list, &tskbar->bar_name);
|
tskbar->area.list = g_list_remove(tskbar->area.list, &tskbar->bar_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
19
src/tint.c
19
src/tint.c
@@ -470,8 +470,8 @@ void event_button_motion_notify (XEvent *e)
|
|||||||
} else {
|
} else {
|
||||||
// Swap the task_drag with the task on the event's location (if they differ)
|
// Swap the task_drag with the task on the event's location (if they differ)
|
||||||
if(event_task && event_task != task_drag) {
|
if(event_task && event_task != task_drag) {
|
||||||
GSList * drag_iter = g_slist_find(event_taskbar->area.list, task_drag);
|
GList * drag_iter = g_list_find(event_taskbar->area.list, task_drag);
|
||||||
GSList * task_iter = g_slist_find(event_taskbar->area.list, event_task);
|
GList * task_iter = g_list_find(event_taskbar->area.list, event_task);
|
||||||
if(drag_iter && task_iter) {
|
if(drag_iter && task_iter) {
|
||||||
gpointer temp = task_iter->data;
|
gpointer temp = task_iter->data;
|
||||||
task_iter->data = drag_iter->data;
|
task_iter->data = drag_iter->data;
|
||||||
@@ -488,14 +488,14 @@ void event_button_motion_notify (XEvent *e)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
Taskbar * drag_taskbar = (Taskbar*)task_drag->area.parent;
|
Taskbar * drag_taskbar = (Taskbar*)task_drag->area.parent;
|
||||||
drag_taskbar->area.list = g_slist_remove(drag_taskbar->area.list, task_drag);
|
drag_taskbar->area.list = g_list_remove(drag_taskbar->area.list, task_drag);
|
||||||
|
|
||||||
if(event_taskbar->area.posx > drag_taskbar->area.posx || event_taskbar->area.posy > drag_taskbar->area.posy) {
|
if(event_taskbar->area.posx > drag_taskbar->area.posx || event_taskbar->area.posy > drag_taskbar->area.posy) {
|
||||||
int i = (taskbarname_enabled) ? 1 : 0;
|
int i = (taskbarname_enabled) ? 1 : 0;
|
||||||
event_taskbar->area.list = g_slist_insert(event_taskbar->area.list, task_drag, i);
|
event_taskbar->area.list = g_list_insert(event_taskbar->area.list, task_drag, i);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
event_taskbar->area.list = g_slist_append(event_taskbar->area.list, task_drag);
|
event_taskbar->area.list = g_list_append(event_taskbar->area.list, task_drag);
|
||||||
|
|
||||||
// Move task to other desktop (but avoid the 'Window desktop changed' code in 'event_property_notify')
|
// Move task to other desktop (but avoid the 'Window desktop changed' code in 'event_property_notify')
|
||||||
task_drag->area.parent = event_taskbar;
|
task_drag->area.parent = event_taskbar;
|
||||||
@@ -619,7 +619,8 @@ void event_property_notify (XEvent *e)
|
|||||||
// Change name of desktops
|
// Change name of desktops
|
||||||
else if (at == server.atom._NET_DESKTOP_NAMES) {
|
else if (at == server.atom._NET_DESKTOP_NAMES) {
|
||||||
if (!taskbarname_enabled) return;
|
if (!taskbarname_enabled) return;
|
||||||
GSList *l, *list = server_get_name_of_desktop();
|
GSList *list = server_get_name_of_desktop();
|
||||||
|
GSList *l;
|
||||||
int j;
|
int j;
|
||||||
gchar *name;
|
gchar *name;
|
||||||
Taskbar *tskbar;
|
Taskbar *tskbar;
|
||||||
@@ -677,10 +678,9 @@ void event_property_notify (XEvent *e)
|
|||||||
// check ALLDESKTOP task => resize taskbar
|
// check ALLDESKTOP task => resize taskbar
|
||||||
Taskbar *tskbar;
|
Taskbar *tskbar;
|
||||||
Task *tsk;
|
Task *tsk;
|
||||||
GSList *l;
|
|
||||||
if (server.nb_desktop > old_desktop) {
|
if (server.nb_desktop > old_desktop) {
|
||||||
tskbar = &panel->taskbar[old_desktop];
|
tskbar = &panel->taskbar[old_desktop];
|
||||||
l = tskbar->area.list;
|
GList *l = tskbar->area.list;
|
||||||
if (taskbarname_enabled) l = l->next;
|
if (taskbarname_enabled) l = l->next;
|
||||||
for (; l ; l = l->next) {
|
for (; l ; l = l->next) {
|
||||||
tsk = l->data;
|
tsk = l->data;
|
||||||
@@ -694,7 +694,7 @@ void event_property_notify (XEvent *e)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
tskbar = &panel->taskbar[server.desktop];
|
tskbar = &panel->taskbar[server.desktop];
|
||||||
l = tskbar->area.list;
|
GList *l = tskbar->area.list;
|
||||||
if (taskbarname_enabled) l = l->next;
|
if (taskbarname_enabled) l = l->next;
|
||||||
for (; l ; l = l->next) {
|
for (; l ; l = l->next) {
|
||||||
tsk = l->data;
|
tsk = l->data;
|
||||||
@@ -727,7 +727,6 @@ void event_property_notify (XEvent *e)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tsk = task_get_task (win);
|
tsk = task_get_task (win);
|
||||||
//printf("change win = %u, task = %p\n", win, tsk);
|
|
||||||
if (!tsk) {
|
if (!tsk) {
|
||||||
if (at != server.atom._NET_WM_STATE)
|
if (at != server.atom._NET_WM_STATE)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -56,17 +56,13 @@ target_link_libraries( tint2conf ${X11_T2C_LIBRARIES}
|
|||||||
${RSVG_LIBRARIES} )
|
${RSVG_LIBRARIES} )
|
||||||
|
|
||||||
if ( NOT DATADIR )
|
if ( NOT DATADIR )
|
||||||
set(DATADIR share)
|
set( DATADIR share )
|
||||||
endif( NOT DATADIR )
|
endif( NOT DATADIR )
|
||||||
|
|
||||||
add_definitions( -DINSTALL_PREFIX=\"${CMAKE_INSTALL_PREFIX}\" )
|
add_definitions( -DINSTALL_PREFIX=\"${CMAKE_INSTALL_PREFIX}\" )
|
||||||
add_definitions( -DLOCALEDIR=\"${CMAKE_INSTALL_PREFIX}/${DATADIR}/locale\" )
|
|
||||||
add_definitions( -DGETTEXT_PACKAGE=\"tint2conf\" )
|
|
||||||
set_target_properties( tint2conf PROPERTIES COMPILE_FLAGS "-Wall -pthread" )
|
set_target_properties( tint2conf PROPERTIES COMPILE_FLAGS "-Wall -pthread" )
|
||||||
set_target_properties( tint2conf PROPERTIES LINK_FLAGS "-pthread" )
|
set_target_properties( tint2conf PROPERTIES LINK_FLAGS "-pthread" )
|
||||||
|
|
||||||
add_subdirectory(po)
|
|
||||||
|
|
||||||
install( TARGETS tint2conf DESTINATION bin )
|
install( TARGETS tint2conf DESTINATION bin )
|
||||||
install( FILES tint2conf.svg DESTINATION ${DATADIR}/icons/hicolor/scalable/apps )
|
install( FILES tint2conf.svg DESTINATION ${DATADIR}/icons/hicolor/scalable/apps )
|
||||||
install( FILES tint2conf.desktop DESTINATION ${DATADIR}/applications )
|
install( FILES tint2conf.desktop DESTINATION ${DATADIR}/applications )
|
||||||
|
|||||||
@@ -119,12 +119,26 @@ static const char *global_ui =
|
|||||||
" </popup>"
|
" </popup>"
|
||||||
"</ui>";
|
"</ui>";
|
||||||
|
|
||||||
|
|
||||||
|
// define menubar and toolbar action
|
||||||
|
static GtkActionEntry entries[] = {
|
||||||
|
{"ThemeMenu", NULL, _("Theme"), NULL, NULL, NULL},
|
||||||
|
{"ThemeAdd", GTK_STOCK_ADD, _("_Import theme..."), "<Control>N", _("Import theme"), G_CALLBACK(menuImport)},
|
||||||
|
{"ThemeDefault", GTK_STOCK_NEW, _("_Import default theme..."), NULL, _("Import default theme"), G_CALLBACK(menuImportDefault)},
|
||||||
|
{"ThemeSaveAs", GTK_STOCK_SAVE_AS, _("_Save as..."), NULL, _("Save theme as"), G_CALLBACK(menuSaveAs)},
|
||||||
|
{"ThemeDelete", GTK_STOCK_DELETE, _("_Delete"), NULL, _("Delete theme"), G_CALLBACK(menuDelete)},
|
||||||
|
{"ThemeProperties", GTK_STOCK_PROPERTIES, _("_Edit theme..."), NULL, _("Edit selected theme"), G_CALLBACK(edit_current_theme)},
|
||||||
|
{"ThemeQuit", GTK_STOCK_QUIT, _("_Quit"), "<control>Q", _("Quit"), G_CALLBACK(gtk_main_quit)},
|
||||||
|
{"EditMenu", NULL, "Edit", NULL, NULL, NULL},
|
||||||
|
{"EditRefresh", GTK_STOCK_REFRESH, _("Refresh"), NULL, _("Refresh"), G_CALLBACK(refresh_current_theme)},
|
||||||
|
{"EditRefreshAll", GTK_STOCK_REFRESH, _("Refresh all"), NULL, _("Refresh all"), G_CALLBACK(load_all_themes)},
|
||||||
|
{"HelpMenu", NULL, _("Help"), NULL, NULL, NULL},
|
||||||
|
{"HelpAbout", GTK_STOCK_ABOUT, _("_About"), "<Control>A", _("About"), G_CALLBACK(menuAbout)}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
|
|
||||||
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
|
|
||||||
textdomain(GETTEXT_PACKAGE);
|
|
||||||
|
|
||||||
GtkWidget *vBox = NULL, *scrollbar = NULL;
|
GtkWidget *vBox = NULL, *scrollbar = NULL;
|
||||||
GtkActionGroup *actionGroup;
|
GtkActionGroup *actionGroup;
|
||||||
|
|
||||||
@@ -153,23 +167,6 @@ int main(int argc, char **argv)
|
|||||||
gtk_container_add(GTK_CONTAINER(g_window), vBox);
|
gtk_container_add(GTK_CONTAINER(g_window), vBox);
|
||||||
|
|
||||||
actionGroup = gtk_action_group_new("menuActionGroup");
|
actionGroup = gtk_action_group_new("menuActionGroup");
|
||||||
|
|
||||||
// Menubar and toolbar entries
|
|
||||||
GtkActionEntry entries[] = {
|
|
||||||
{"ThemeMenu", NULL, _("Theme"), NULL, NULL, NULL},
|
|
||||||
{"ThemeAdd", GTK_STOCK_ADD, _("_Import theme..."), "<Control>N", _("Import theme"), G_CALLBACK(menuImport)},
|
|
||||||
{"ThemeDefault", GTK_STOCK_NEW, _("_Import default theme..."), NULL, _("Import default theme"), G_CALLBACK(menuImportDefault)},
|
|
||||||
{"ThemeSaveAs", GTK_STOCK_SAVE_AS, _("_Save as..."), NULL, _("Save theme as"), G_CALLBACK(menuSaveAs)},
|
|
||||||
{"ThemeDelete", GTK_STOCK_DELETE, _("_Delete"), NULL, _("Delete theme"), G_CALLBACK(menuDelete)},
|
|
||||||
{"ThemeProperties", GTK_STOCK_PROPERTIES, _("_Edit theme..."), NULL, _("Edit selected theme"), G_CALLBACK(edit_current_theme)},
|
|
||||||
{"ThemeQuit", GTK_STOCK_QUIT, _("_Quit"), "<control>Q", _("Quit"), G_CALLBACK(gtk_main_quit)},
|
|
||||||
{"EditMenu", NULL, _("Edit"), NULL, NULL, NULL},
|
|
||||||
{"EditRefresh", GTK_STOCK_REFRESH, _("Refresh"), NULL, _("Refresh"), G_CALLBACK(refresh_current_theme)},
|
|
||||||
{"EditRefreshAll", GTK_STOCK_REFRESH, _("Refresh all"), NULL, _("Refresh all"), G_CALLBACK(load_all_themes)},
|
|
||||||
{"HelpMenu", NULL, _("Help"), NULL, NULL, NULL},
|
|
||||||
{"HelpAbout", GTK_STOCK_ABOUT, _("_About"), "<Control>A", _("About"), G_CALLBACK(menuAbout)}
|
|
||||||
};
|
|
||||||
|
|
||||||
gtk_action_group_add_actions(actionGroup, entries, G_N_ELEMENTS(entries), NULL);
|
gtk_action_group_add_actions(actionGroup, entries, G_N_ELEMENTS(entries), NULL);
|
||||||
globalUIManager = gtk_ui_manager_new();
|
globalUIManager = gtk_ui_manager_new();
|
||||||
gtk_ui_manager_insert_action_group(globalUIManager, actionGroup, 0);
|
gtk_ui_manager_insert_action_group(globalUIManager, actionGroup, 0);
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
#include <glib/gi18n-lib.h>
|
#include <glib/gi18n-lib.h>
|
||||||
#else
|
#else
|
||||||
#define _(String) String
|
#define _(String) String
|
||||||
#define GETTEXT_PACKAGE "tint2conf"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SNAPSHOT_TICK 190
|
#define SNAPSHOT_TICK 190
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
include(FindGettext)
|
|
||||||
if (GETTEXT_FOUND)
|
|
||||||
set(GETTEXT_PACKAGE tint2conf)
|
|
||||||
file(GLOB POTFILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.po")
|
|
||||||
string(REPLACE ".po" " " LANGUAGES ${POTFILES})
|
|
||||||
message(STATUS "gettext found languages: ${LANGUAGES}")
|
|
||||||
string(REPLACE " " ";" LANGUAGES ${LANGUAGES})
|
|
||||||
if ("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}" VERSION_LESS "2.8.8")
|
|
||||||
GETTEXT_CREATE_TRANSLATIONS("${CMAKE_CURRENT_SOURCE_DIR}/tint2conf.pot" ALL ${POTFILES})
|
|
||||||
else()
|
|
||||||
foreach(LANG ${LANGUAGES})
|
|
||||||
GETTEXT_PROCESS_PO_FILES(${LANG} ALL PO_FILES ${LANG}.po)
|
|
||||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${LANG}.gmo"
|
|
||||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/${DATADIR}/locale/${LANG}/LC_MESSAGES"
|
|
||||||
RENAME "${GETTEXT_PACKAGE}.mo")
|
|
||||||
endforeach ()
|
|
||||||
endif()
|
|
||||||
else ()
|
|
||||||
message(STATUS "gettext not found")
|
|
||||||
endif ()
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
142
src/util/area.c
142
src/util/area.c
@@ -76,7 +76,7 @@ void init_rendering(void *obj, int pos)
|
|||||||
Area *a = (Area*)obj;
|
Area *a = (Area*)obj;
|
||||||
|
|
||||||
// initialize fixed position/size
|
// initialize fixed position/size
|
||||||
GSList *l;
|
GList *l;
|
||||||
for (l = a->list; l ; l = l->next) {
|
for (l = a->list; l ; l = l->next) {
|
||||||
Area *child = ((Area*)l->data);
|
Area *child = ((Area*)l->data);
|
||||||
if (panel_horizontal) {
|
if (panel_horizontal) {
|
||||||
@@ -102,7 +102,7 @@ void rendering(void *obj)
|
|||||||
Panel *panel = (Panel*)obj;
|
Panel *panel = (Panel*)obj;
|
||||||
|
|
||||||
size_by_content(&panel->area);
|
size_by_content(&panel->area);
|
||||||
size_by_layout(&panel->area, 0, 1);
|
size_by_layout(&panel->area, 1);
|
||||||
|
|
||||||
refresh(&panel->area);
|
refresh(&panel->area);
|
||||||
}
|
}
|
||||||
@@ -111,10 +111,11 @@ void rendering(void *obj)
|
|||||||
void size_by_content (Area *a)
|
void size_by_content (Area *a)
|
||||||
{
|
{
|
||||||
// don't resize hiden objects
|
// don't resize hiden objects
|
||||||
if (!a->on_screen) return;
|
if (!a->on_screen)
|
||||||
|
return;
|
||||||
|
|
||||||
// children node are resized before its parent
|
// children node are resized before its parent
|
||||||
GSList *l;
|
GList *l;
|
||||||
for (l = a->list; l ; l = l->next)
|
for (l = a->list; l ; l = l->next)
|
||||||
size_by_content(l->data);
|
size_by_content(l->data);
|
||||||
|
|
||||||
@@ -134,14 +135,21 @@ void size_by_content (Area *a)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void size_by_layout (Area *a, int pos, int level)
|
void size_by_layout (Area *a, int level)
|
||||||
{
|
{
|
||||||
// don't resize hiden objects
|
// don't resize hiden objects
|
||||||
if (!a->on_screen) return;
|
if (!a->on_screen)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (a == &panel1->taskbar[0]) {
|
||||||
|
printf("%s %d: Taskbar 0: y=%d, h=%d, b=%d\n", __FUNCTION__, __LINE__, a->posy, a->height, a->posy + a->height);
|
||||||
|
} else if (a == &panel1->taskbar[1]) {
|
||||||
|
printf("%s %d: Taskbar 1: y=%d, h=%d, b=%d\n", __FUNCTION__, __LINE__, a->posy, a->height, a->posy + a->height);
|
||||||
|
}
|
||||||
|
|
||||||
// parent node is resized before its children
|
// parent node is resized before its children
|
||||||
// calculate area's size
|
// calculate area's size
|
||||||
GSList *l;
|
GList *l;
|
||||||
if (a->resize && a->size_mode == SIZE_BY_LAYOUT) {
|
if (a->resize && a->size_mode == SIZE_BY_LAYOUT) {
|
||||||
a->resize = 0;
|
a->resize = 0;
|
||||||
|
|
||||||
@@ -156,13 +164,15 @@ void size_by_layout (Area *a, int pos, int level)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// update position of childs
|
// update position of children
|
||||||
pos += a->paddingxlr + a->bg->border.width;
|
if (a->list) {
|
||||||
int i=0;
|
if (a->alignment == ALIGN_LEFT) {
|
||||||
|
int pos = (panel_horizontal ? a->posx : a->posy) + a->bg->border.width + a->paddingxlr;
|
||||||
|
|
||||||
for (l = a->list; l ; l = l->next) {
|
for (l = a->list; l ; l = l->next) {
|
||||||
Area *child = ((Area*)l->data);
|
Area *child = ((Area*)l->data);
|
||||||
if (!child->on_screen) continue;
|
if (!child->on_screen)
|
||||||
i++;
|
continue;
|
||||||
|
|
||||||
if (panel_horizontal) {
|
if (panel_horizontal) {
|
||||||
if (pos != child->posx) {
|
if (pos != child->posx) {
|
||||||
@@ -170,8 +180,7 @@ void size_by_layout (Area *a, int pos, int level)
|
|||||||
child->posx = pos;
|
child->posx = pos;
|
||||||
child->on_changed = 1;
|
child->on_changed = 1;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
if (pos != child->posy) {
|
if (pos != child->posy) {
|
||||||
// pos changed => redraw
|
// pos changed => redraw
|
||||||
child->posy = pos;
|
child->posy = pos;
|
||||||
@@ -179,16 +188,78 @@ void size_by_layout (Area *a, int pos, int level)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*// position of each visible object
|
size_by_layout(child, level+1);
|
||||||
int k;
|
|
||||||
for (k=0 ; k < level ; k++) printf(" ");
|
|
||||||
printf("tree level %d, object %d, pos %d, %s\n", level, i, pos, (child->size_mode == SIZE_BY_LAYOUT) ? "SIZE_BY_LAYOUT" : "SIZE_BY_CONTENT");*/
|
|
||||||
size_by_layout(child, pos, level+1);
|
|
||||||
|
|
||||||
if (panel_horizontal)
|
pos += panel_horizontal ? child->width + a->paddingx : child->height + a->paddingx;
|
||||||
pos += child->width + a->paddingx;
|
}
|
||||||
else
|
} else if (a->alignment == ALIGN_RIGHT) {
|
||||||
pos += child->height + a->paddingx;
|
int pos = (panel_horizontal ? a->posx + a->width : a->posy + a->height) - a->bg->border.width - a->paddingxlr;
|
||||||
|
|
||||||
|
for (l = g_list_last(a->list); l ; l = l->prev) {
|
||||||
|
Area *child = ((Area*)l->data);
|
||||||
|
if (!child->on_screen)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pos -= panel_horizontal ? child->width : child->height;
|
||||||
|
|
||||||
|
if (panel_horizontal) {
|
||||||
|
if (pos != child->posx) {
|
||||||
|
// pos changed => redraw
|
||||||
|
child->posx = pos;
|
||||||
|
child->on_changed = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (pos != child->posy) {
|
||||||
|
// pos changed => redraw
|
||||||
|
child->posy = pos;
|
||||||
|
child->on_changed = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
size_by_layout(child, level+1);
|
||||||
|
|
||||||
|
pos -= a->paddingx;
|
||||||
|
}
|
||||||
|
} else if (a->alignment == ALIGN_CENTER) {
|
||||||
|
|
||||||
|
int children_size = 0;
|
||||||
|
|
||||||
|
for (l = a->list; l ; l = l->next) {
|
||||||
|
Area *child = ((Area*)l->data);
|
||||||
|
if (!child->on_screen)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
children_size += panel_horizontal ? child->width : child->height;
|
||||||
|
children_size += (l == a->list) ? 0 : a->paddingx;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pos = (panel_horizontal ? a->posx : a->posy) + a->bg->border.width + a->paddingxlr;
|
||||||
|
pos += ((panel_horizontal ? a->width : a->height) - children_size) / 2;
|
||||||
|
|
||||||
|
for (l = a->list; l ; l = l->next) {
|
||||||
|
Area *child = ((Area*)l->data);
|
||||||
|
if (!child->on_screen)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (panel_horizontal) {
|
||||||
|
if (pos != child->posx) {
|
||||||
|
// pos changed => redraw
|
||||||
|
child->posx = pos;
|
||||||
|
child->on_changed = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (pos != child->posy) {
|
||||||
|
// pos changed => redraw
|
||||||
|
child->posy = pos;
|
||||||
|
child->on_changed = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
size_by_layout(child, level+1);
|
||||||
|
|
||||||
|
pos += panel_horizontal ? child->width + a->paddingx : child->height + a->paddingx;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a->on_changed) {
|
if (a->on_changed) {
|
||||||
@@ -222,7 +293,7 @@ void refresh (Area *a)
|
|||||||
XCopyArea (server.dsp, a->pix, ((Panel *)a->panel)->temp_pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy);
|
XCopyArea (server.dsp, a->pix, ((Panel *)a->panel)->temp_pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy);
|
||||||
|
|
||||||
// and then refresh child object
|
// and then refresh child object
|
||||||
GSList *l;
|
GList *l;
|
||||||
for (l = a->list; l ; l = l->next)
|
for (l = a->list; l ; l = l->next)
|
||||||
refresh(l->data);
|
refresh(l->data);
|
||||||
}
|
}
|
||||||
@@ -236,7 +307,7 @@ int resize_by_layout(void *obj, int maximum_size)
|
|||||||
if (panel_horizontal) {
|
if (panel_horizontal) {
|
||||||
// detect free size for SIZE_BY_LAYOUT's Area
|
// detect free size for SIZE_BY_LAYOUT's Area
|
||||||
size = a->width - (2 * (a->paddingxlr + a->bg->border.width));
|
size = a->width - (2 * (a->paddingxlr + a->bg->border.width));
|
||||||
GSList *l;
|
GList *l;
|
||||||
for (l = a->list ; l ; l = l->next) {
|
for (l = a->list ; l ; l = l->next) {
|
||||||
child = (Area*)l->data;
|
child = (Area*)l->data;
|
||||||
if (child->on_screen && child->size_mode == SIZE_BY_CONTENT) {
|
if (child->on_screen && child->size_mode == SIZE_BY_CONTENT) {
|
||||||
@@ -278,7 +349,7 @@ int resize_by_layout(void *obj, int maximum_size)
|
|||||||
else {
|
else {
|
||||||
// detect free size for SIZE_BY_LAYOUT's Area
|
// detect free size for SIZE_BY_LAYOUT's Area
|
||||||
size = a->height - (2 * (a->paddingxlr + a->bg->border.width));
|
size = a->height - (2 * (a->paddingxlr + a->bg->border.width));
|
||||||
GSList *l;
|
GList *l;
|
||||||
for (l = a->list ; l ; l = l->next) {
|
for (l = a->list ; l ; l = l->next) {
|
||||||
child = (Area*)l->data;
|
child = (Area*)l->data;
|
||||||
if (child->on_screen && child->size_mode == SIZE_BY_CONTENT) {
|
if (child->on_screen && child->size_mode == SIZE_BY_CONTENT) {
|
||||||
@@ -291,7 +362,7 @@ int resize_by_layout(void *obj, int maximum_size)
|
|||||||
if (nb_by_content+nb_by_layout)
|
if (nb_by_content+nb_by_layout)
|
||||||
size -= ((nb_by_content+nb_by_layout-1) * a->paddingx);
|
size -= ((nb_by_content+nb_by_layout-1) * a->paddingx);
|
||||||
|
|
||||||
int height=0, modulo=0, old_height;
|
int height=0, modulo=0;
|
||||||
if (nb_by_layout) {
|
if (nb_by_layout) {
|
||||||
height = size / nb_by_layout;
|
height = size / nb_by_layout;
|
||||||
modulo = size % nb_by_layout;
|
modulo = size % nb_by_layout;
|
||||||
@@ -305,8 +376,13 @@ int resize_by_layout(void *obj, int maximum_size)
|
|||||||
for (l = a->list ; l ; l = l->next) {
|
for (l = a->list ; l ; l = l->next) {
|
||||||
child = (Area*)l->data;
|
child = (Area*)l->data;
|
||||||
if (child->on_screen && child->size_mode == SIZE_BY_LAYOUT) {
|
if (child->on_screen && child->size_mode == SIZE_BY_LAYOUT) {
|
||||||
old_height = child->height;
|
int old_height = child->height;
|
||||||
child->height = height;
|
child->height = height;
|
||||||
|
if (child == &panel1->taskbar[0]) {
|
||||||
|
printf("Taskbar 0: y=%d, h=%d, b=%d\n", child->posy, child->height, child->posy + child->height);
|
||||||
|
} else if (child == &panel1->taskbar[1]) {
|
||||||
|
printf("Taskbar 1: y=%d, h=%d, b=%d\n", child->posy, child->height, child->posy + child->height);
|
||||||
|
}
|
||||||
if (modulo) {
|
if (modulo) {
|
||||||
child->height++;
|
child->height++;
|
||||||
modulo--;
|
modulo--;
|
||||||
@@ -324,7 +400,7 @@ void set_redraw (Area *a)
|
|||||||
{
|
{
|
||||||
a->redraw = 1;
|
a->redraw = 1;
|
||||||
|
|
||||||
GSList *l;
|
GList *l;
|
||||||
for (l = a->list ; l ; l = l->next)
|
for (l = a->list ; l ; l = l->next)
|
||||||
set_redraw(l->data);
|
set_redraw(l->data);
|
||||||
}
|
}
|
||||||
@@ -438,7 +514,7 @@ void remove_area (Area *a)
|
|||||||
{
|
{
|
||||||
Area *parent = (Area*)a->parent;
|
Area *parent = (Area*)a->parent;
|
||||||
|
|
||||||
parent->list = g_slist_remove(parent->list, a);
|
parent->list = g_list_remove(parent->list, a);
|
||||||
set_redraw (parent);
|
set_redraw (parent);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -448,7 +524,7 @@ void add_area (Area *a)
|
|||||||
{
|
{
|
||||||
Area *parent = (Area*)a->parent;
|
Area *parent = (Area*)a->parent;
|
||||||
|
|
||||||
parent->list = g_slist_append(parent->list, a);
|
parent->list = g_list_append(parent->list, a);
|
||||||
set_redraw (parent);
|
set_redraw (parent);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -459,12 +535,12 @@ void free_area (Area *a)
|
|||||||
if (!a)
|
if (!a)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
GSList *l0;
|
GList *l0;
|
||||||
for (l0 = a->list; l0 ; l0 = l0->next)
|
for (l0 = a->list; l0 ; l0 = l0->next)
|
||||||
free_area (l0->data);
|
free_area (l0->data);
|
||||||
|
|
||||||
if (a->list) {
|
if (a->list) {
|
||||||
g_slist_free(a->list);
|
g_list_free(a->list);
|
||||||
a->list = 0;
|
a->list = 0;
|
||||||
}
|
}
|
||||||
if (a->pix) {
|
if (a->pix) {
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ typedef struct
|
|||||||
// SIZE_BY_CONTENT objects : clock, battery, launcher, systray
|
// SIZE_BY_CONTENT objects : clock, battery, launcher, systray
|
||||||
enum { SIZE_BY_LAYOUT, SIZE_BY_CONTENT };
|
enum { SIZE_BY_LAYOUT, SIZE_BY_CONTENT };
|
||||||
|
|
||||||
|
enum { ALIGN_LEFT = 0, ALIGN_CENTER = 1, ALIGN_RIGHT = 2 };
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
// coordinate relative to panel window
|
// coordinate relative to panel window
|
||||||
int posx, posy;
|
int posx, posy;
|
||||||
@@ -61,13 +63,15 @@ typedef struct {
|
|||||||
Background *bg;
|
Background *bg;
|
||||||
|
|
||||||
// list of child : Area object
|
// list of child : Area object
|
||||||
GSList *list;
|
GList *list;
|
||||||
|
|
||||||
// object visible on screen.
|
// object visible on screen.
|
||||||
// An object (like systray) could be enabled but hidden (because no tray icon).
|
// An object (like systray) could be enabled but hidden (because no tray icon).
|
||||||
int on_screen;
|
int on_screen;
|
||||||
// way to calculate the size (SIZE_BY_CONTENT or SIZE_BY_LAYOUT)
|
// way to calculate the size (SIZE_BY_CONTENT or SIZE_BY_LAYOUT)
|
||||||
int size_mode;
|
int size_mode;
|
||||||
|
|
||||||
|
int alignment;
|
||||||
// need to calculate position and width
|
// need to calculate position and width
|
||||||
int resize;
|
int resize;
|
||||||
// need redraw Pixmap
|
// need redraw Pixmap
|
||||||
@@ -96,7 +100,7 @@ void init_rendering(void *obj, int pos);
|
|||||||
|
|
||||||
void rendering(void *obj);
|
void rendering(void *obj);
|
||||||
void size_by_content (Area *a);
|
void size_by_content (Area *a);
|
||||||
void size_by_layout (Area *a, int pos, int level);
|
void size_by_layout (Area *a, int level);
|
||||||
// draw background and foreground
|
// draw background and foreground
|
||||||
void refresh (Area *a);
|
void refresh (Area *a);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user