From: Thierry Lorthiois Date: Sun, 7 Nov 2010 12:59:51 +0000 (+0000) Subject: XSETTINGS manager : reload icons when theme changed (gnome, xfce, ...). X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=90eae1e7be4621a84a0253c3048790523f0c8375;p=chaz%2Ftint2 XSETTINGS manager : reload icons when theme changed (gnome, xfce, ...). --- diff --git a/src/launcher/launcher.c b/src/launcher/launcher.c index 6e49ba7..0cb9fc8 100644 --- a/src/launcher/launcher.c +++ b/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 @@ void init_launcher_panel(void *p) 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 @@ void cleanup_launcher() 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 @@ void test_launcher_read_theme_file() 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 @@ void launcher_load_themes(Launcher *launcher) 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 @@ void launcher_load_themes(Launcher *launcher) 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 @@ char *icon_path(Launcher *launcher, const char *icon_name, int size) // 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 @@ char *icon_path(Launcher *launcher, const char *icon_name, int size) 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; diff --git a/src/launcher/launcher.h b/src/launcher/launcher.h index ddbc6e8..10a9151 100644 --- a/src/launcher/launcher.h +++ b/src/launcher/launcher.h @@ -16,7 +16,7 @@ typedef struct Launcher { 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 @@ void default_launcher(); 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(); diff --git a/src/launcher/xsettings-client.c b/src/launcher/xsettings-client.c index fba7939..be569e6 100644 --- a/src/launcher/xsettings-client.c +++ b/src/launcher/xsettings-client.c @@ -51,27 +51,21 @@ void xsettings_notify_cb (const char *name, XSettingsAction action, XSettingsSet //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 @@ static void read_settings (XSettingsClient *client) 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); diff --git a/src/launcher/xsettings-client.h b/src/launcher/xsettings-client.h index 2e95a54..5a40e0e 100644 --- a/src/launcher/xsettings-client.h +++ b/src/launcher/xsettings-client.h @@ -39,29 +39,16 @@ typedef enum 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 } diff --git a/src/tint.c b/src/tint.c index 794aefb..0e8cad8 100644 --- a/src/tint.c +++ b/src/tint.c @@ -480,6 +480,8 @@ void event_property_notify (XEvent *e) 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 @@ start: 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) {