]> Dogcows Code - chaz/tint2/commitdiff
XSETTINGS manager : reload icons when theme changed (gnome, xfce, ...).
authorThierry Lorthiois <lorthiois@bbsoft.fr>
Sun, 7 Nov 2010 12:59:51 +0000 (12:59 +0000)
committerThierry Lorthiois <lorthiois@bbsoft.fr>
Sun, 7 Nov 2010 12:59:51 +0000 (12:59 +0000)
src/launcher/launcher.c
src/launcher/launcher.h
src/launcher/xsettings-client.c
src/launcher/xsettings-client.h
src/tint.c

index 6e49ba7ec75c7a8a072e6d41ed4d231b23cd93bc..0cb9fc88157a800355f2efd73b54cdfbebf89747 100644 (file)
@@ -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;
index ddbc6e82017c833f82323807ae69fbc2499f082a..10a915101bf9677dc4e9f5ada1688a0999cee919 100644 (file)
@@ -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();
index fba79395096cbb0efbae902ce79d685ff81e1b97..be569e6d2d339aa7597f58782e481ab87af8901e 100644 (file)
@@ -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);
index 2e95a54d619042af9715b662929d7675d9ad19cc..5a40e0ec94f5eee252bb5c72708a8863415f1f6e 100644 (file)
@@ -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
 }
index 794aefbefee0ca97efb5ff8f8bfd1ac2a74345c8..0e8cad8adadf6614da927ea4f337df658d4ff8fa 100644 (file)
@@ -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) {
This page took 0.037617 seconds and 4 git commands to generate.