XSETTINGS manager : reload icons when theme changed (gnome, xfce, ...). git-svn-id: http://tint2.googlecode.com/svn/trunk@589 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
5 files changed,
81 insertions(+),
86 deletions(-)
M
src/launcher/launcher.c
→
src/launcher/launcher.c
@@ -36,7 +36,6 @@ int launcher_enabled;
int launcher_max_icon_size; char *icon_theme_name; XSettingsClient *xsettings_client; -GSList *icon_themes; #define ICON_FALLBACK "exec"@@ -53,10 +52,8 @@ void default_launcher()
{ launcher_enabled = 0; launcher_max_icon_size = 0; - icon_themes = 0; icon_theme_name = 0; xsettings_client = NULL; - printf("default_launcher\n"); }@@ -90,23 +87,7 @@ launcher->area.on_screen = 1;
panel_refresh = 1; launcher_load_themes(launcher); - - // Load apps (.desktop style launcher items) - GSList* app = launcher->list_apps; - while (app != NULL) { - DesktopEntry entry; - launcher_read_desktop_file(app->data, &entry); - if (entry.exec) { - LauncherIcon *launcherIcon = calloc(1, sizeof(LauncherIcon)); - launcherIcon->is_app_desktop = 1; - launcherIcon->cmd = strdup(entry.exec); - launcherIcon->icon_name = entry.icon ? strdup(entry.icon) : strdup(ICON_FALLBACK); - launcherIcon->icon_size = 1; - free_desktop_entry(&entry); - launcher->list_icons = g_slist_append(launcher->list_icons, launcherIcon); - } - app = g_slist_next(app); - } + launcher_load_icons(launcher); }@@ -118,38 +99,45 @@ if (xsettings_client)
xsettings_client_destroy(xsettings_client); for (i = 0 ; i < nb_panel ; i++) { Panel *panel = &panel1[i]; - Launcher *launcher = &panel->launcher; - free_area(&launcher->area); + Launcher *launcher = &panel->launcher; + cleanup_launcher_theme(launcher); + GSList *l; - for (l = launcher->list_icons; l ; l = l->next) { - LauncherIcon *launcherIcon = (LauncherIcon*)l->data; - if (launcherIcon) { - free_icon(launcherIcon->icon_scaled); - free_icon(launcherIcon->icon_original); - free(launcherIcon->icon_name); - free(launcherIcon->icon_path); - free(launcherIcon->cmd); - } - free(launcherIcon); - } - g_slist_free(launcher->list_icons); - for (l = launcher->list_apps; l ; l = l->next) { free(l->data); } g_slist_free(launcher->list_apps); + launcher->list_apps = NULL; + } + g_free(icon_theme_name); + launcher_enabled = 0; +} - for (l = launcher->icon_themes; l ; l = l->next) { - IconTheme *theme = (IconTheme*) l->data; - free_icon_theme(theme); - free(theme); + +void cleanup_launcher_theme(Launcher *launcher) +{ + free_area(&launcher->area); + GSList *l; + for (l = launcher->list_icons; l ; l = l->next) { + LauncherIcon *launcherIcon = (LauncherIcon*)l->data; + if (launcherIcon) { + free_icon(launcherIcon->icon_scaled); + free_icon(launcherIcon->icon_original); + free(launcherIcon->icon_name); + free(launcherIcon->icon_path); + free(launcherIcon->cmd); } - g_slist_free(launcher->icon_themes); + free(launcherIcon); + } + g_slist_free(launcher->list_icons); - launcher->list_apps = launcher->list_icons = launcher->icon_themes = NULL; + for (l = launcher->list_themes; l ; l = l->next) { + IconTheme *theme = (IconTheme*) l->data; + free_icon_theme(theme); + free(theme); } - g_free(icon_theme_name); - launcher_enabled = 0; + g_slist_free(launcher->list_themes); + launcher->list_icons = launcher->list_themes = NULL; }@@ -657,7 +645,30 @@ }
fprintf(stdout, "\033[0m"); } -// Populates the icon_themes list + +// Populates the list_icons list +void launcher_load_icons(Launcher *launcher) +{ + // Load apps (.desktop style launcher items) + GSList* app = launcher->list_apps; + while (app != NULL) { + DesktopEntry entry; + launcher_read_desktop_file(app->data, &entry); + if (entry.exec) { + LauncherIcon *launcherIcon = calloc(1, sizeof(LauncherIcon)); + launcherIcon->is_app_desktop = 1; + launcherIcon->cmd = strdup(entry.exec); + launcherIcon->icon_name = entry.icon ? strdup(entry.icon) : strdup(ICON_FALLBACK); + launcherIcon->icon_size = 1; + free_desktop_entry(&entry); + launcher->list_icons = g_slist_append(launcher->list_icons, launcherIcon); + } + app = g_slist_next(app); + } +} + + +// Populates the list_themes list void launcher_load_themes(Launcher *launcher) { // load the user theme, all the inherited themes recursively (DFS), and the hicolor theme@@ -667,7 +678,7 @@ fprintf(stderr, "Missing launcher theme, default to 'hicolor'.\n");
icon_theme_name = "hicolor"; } else - fprintf(stderr, "Loading %s : ", icon_theme_name); + fprintf(stderr, "Loading %s. Icon theme :", icon_theme_name); GSList *queue = g_slist_append(NULL, strdup(icon_theme_name)); GSList *queued = g_slist_append(NULL, strdup(icon_theme_name));@@ -692,10 +703,10 @@
char *name = queue->data; queue = g_slist_remove(queue, name); - fprintf(stderr, "icon theme '%s', ", name); + fprintf(stderr, " '%s',", name); IconTheme *theme = load_theme(name); if (theme != NULL) { - launcher->icon_themes = g_slist_append(launcher->icon_themes, theme); + launcher->list_themes = g_slist_append(launcher->list_themes, theme); GSList* item = theme->list_inherits; int pos = 0;@@ -792,7 +803,7 @@ extensions = g_slist_append(extensions, "xpm");
// Stage 1: exact size match GSList *theme; - for (theme = launcher->icon_themes; theme; theme = g_slist_next(theme)) { + for (theme = launcher->list_themes; theme; theme = g_slist_next(theme)) { GSList *dir; for (dir = ((IconTheme*)theme->data)->list_directories; dir; dir = g_slist_next(dir)) { if (directory_matches_size((IconThemeDir*)dir->data, size)) {@@ -832,7 +843,7 @@ int minimal_size = INT_MAX;
char *best_file_name = NULL; int next_larger_size = -1; char *next_larger = NULL; - for (theme = launcher->icon_themes; theme; theme = g_slist_next(theme)) { + for (theme = launcher->list_themes; theme; theme = g_slist_next(theme)) { GSList *dir; for (dir = ((IconTheme*)theme->data)->list_directories; dir; dir = g_slist_next(dir)) { GSList *base;
M
src/launcher/launcher.h
→
src/launcher/launcher.h
@@ -16,7 +16,7 @@ // always start with area
Area area; GSList *list_apps; // List of char*, each is a path to a app.desktop file GSList *list_icons; // List of LauncherIcon* - GSList *icon_themes; // List of IconTheme* + GSList *list_themes; // List of IconTheme* } Launcher; typedef struct LauncherIcon {@@ -67,10 +67,15 @@ // initialize launcher : y position, precision, ...
void init_launcher(); void init_launcher_panel(void *panel); void cleanup_launcher(); +void cleanup_launcher_theme(Launcher *launcher); int resize_launcher(void *obj); void draw_launcher (void *obj, cairo_t *c); +// Populates the list_themes list +void launcher_load_themes(Launcher *launcher); +// Populates the list_icons list +void launcher_load_icons(Launcher *launcher); void launcher_action(LauncherIcon *icon); void test_launcher_read_desktop_file();
M
src/launcher/xsettings-client.c
→
src/launcher/xsettings-client.c
@@ -51,27 +51,21 @@ {
//printf("xsettings_notify_cb\n"); if ((action == XSETTINGS_ACTION_NEW || action == XSETTINGS_ACTION_CHANGED) && name != NULL && setting != NULL) { if (!strcmp(name, "Net/IconThemeName") && setting->type == XSETTINGS_TYPE_STRING) { - printf("XSETTINGS_ACTION %s\n", setting->data.v_string); if (icon_theme_name) { if (strcmp(icon_theme_name, setting->data.v_string) == 0) return; g_free(icon_theme_name); } icon_theme_name = strdup(setting->data.v_string); - /* - cleanup_launcher(); + int i; - Panel *p; - for (i=0 ; i < nb_panel ; i++) { - p = &panel1[i]; - init_launcher_panel(p); + for (i = 0 ; i < nb_panel ; i++) { + Launcher *launcher = &panel1[i].launcher; + cleanup_launcher_theme(launcher); + launcher_load_themes(launcher); + launcher_load_icons(launcher); + launcher->area.resize = 1; } - /* - MBTrayApp *mb = (MBTrayApp *)data; - mb->theme_name = strdup(setting->data.v_string); - if (mb->theme_cb) - mb->theme_cb(mb, mb->theme_name); - */ } } }@@ -361,7 +355,6 @@ int (*old_handler) (Display *, XErrorEvent *);
XSettingsList *old_list = client->settings; client->settings = NULL; - printf("read_settings 1\n"); old_handler = XSetErrorHandler (ignore_errors); result = XGetWindowProperty (client->display, client->manager_window, server.atom._XSETTINGS_SETTINGS, 0, LONG_MAX, False, server.atom._XSETTINGS_SETTINGS, &type, &format, &n_items, &bytes_after, &data);
M
src/launcher/xsettings-client.h
→
src/launcher/xsettings-client.h
@@ -39,29 +39,16 @@ XSETTINGS_ACTION_CHANGED,
XSETTINGS_ACTION_DELETED } XSettingsAction; -typedef void (*XSettingsNotifyFunc) (const char *name, - XSettingsAction action, - XSettingsSetting *setting, - void *cb_data); -typedef void (*XSettingsWatchFunc) (Window window, - Bool is_start, - long mask, - void *cb_data); +typedef void (*XSettingsNotifyFunc) (const char *name, XSettingsAction action, XSettingsSetting *setting, void *cb_data); +typedef void (*XSettingsWatchFunc) (Window window, Bool is_start, long mask, void *cb_data); -XSettingsClient *xsettings_client_new (Display *display, - int screen, - XSettingsNotifyFunc notify, - XSettingsWatchFunc watch, - void *cb_data); -void xsettings_client_destroy (XSettingsClient *client); -Bool xsettings_client_process_event (XSettingsClient *client, - XEvent *xev); +XSettingsClient *xsettings_client_new (Display *display, int screen, XSettingsNotifyFunc notify, XSettingsWatchFunc watch, void *cb_data); +void xsettings_client_destroy (XSettingsClient *client); +Bool xsettings_client_process_event (XSettingsClient *client, XEvent *xev); void xsettings_notify_cb (const char *name, XSettingsAction action, XSettingsSetting *setting, void *data); -XSettingsResult xsettings_client_get_setting (XSettingsClient *client, - const char *name, - XSettingsSetting **setting); +XSettingsResult xsettings_client_get_setting (XSettingsClient *client, const char *name, XSettingsSetting **setting); #ifdef __cplusplus }
M
src/tint.c
→
src/tint.c
@@ -480,6 +480,8 @@ Task *tsk;
Window win = e->xproperty.window; Atom at = e->xproperty.atom; + if (xsettings_client) + xsettings_client_process_event(xsettings_client, e); if (win == server.root_win) { if (!server.got_root_win) { XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask);@@ -804,9 +806,6 @@ // Wait for X Event or a Timer
if (select(x11_fd+1, &fdset, 0, 0, timeout) > 0) { while (XPending (server.dsp)) { XNextEvent(server.dsp, &e); - if (xsettings_client != NULL) { - xsettings_client_process_event(xsettings_client, &e); - } panel = get_panel(e.xany.window); if (panel && panel_autohide) {