all repos — tint2 @ fc5269d610caf49393ccce1642879774b9911269

fork of the tint2 desktop panel for my custom setup - only minimized windows across all desktops for the taskbar

XSETTINGS manager : reload icons when theme changed (gnome, xfce, ...).

git-svn-id: http://tint2.googlecode.com/svn/trunk@589 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
thilor77 thilor77@121b4492-b84c-0410-8b4c-0d4edfb3f3cc
commit

fc5269d610caf49393ccce1642879774b9911269

parent

da27293d22a13f1fd994968f1c8eb8a184bd76ba

M src/launcher/launcher.csrc/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.hsrc/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.csrc/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.hsrc/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.csrc/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) {