XSETTINGS manager : reload icons when theme changed (gnome, xfce, ...).
git-svn-id: http://tint2.googlecode.com/svn/trunk@589 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
This commit is contained in:
parent
da27293d22
commit
fc5269d610
5 changed files with 82 additions and 87 deletions
|
@ -36,7 +36,6 @@ int launcher_enabled;
|
||||||
int launcher_max_icon_size;
|
int launcher_max_icon_size;
|
||||||
char *icon_theme_name;
|
char *icon_theme_name;
|
||||||
XSettingsClient *xsettings_client;
|
XSettingsClient *xsettings_client;
|
||||||
GSList *icon_themes;
|
|
||||||
|
|
||||||
#define ICON_FALLBACK "exec"
|
#define ICON_FALLBACK "exec"
|
||||||
|
|
||||||
|
@ -53,10 +52,8 @@ void default_launcher()
|
||||||
{
|
{
|
||||||
launcher_enabled = 0;
|
launcher_enabled = 0;
|
||||||
launcher_max_icon_size = 0;
|
launcher_max_icon_size = 0;
|
||||||
icon_themes = 0;
|
|
||||||
icon_theme_name = 0;
|
icon_theme_name = 0;
|
||||||
xsettings_client = NULL;
|
xsettings_client = NULL;
|
||||||
printf("default_launcher\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -90,23 +87,7 @@ void init_launcher_panel(void *p)
|
||||||
panel_refresh = 1;
|
panel_refresh = 1;
|
||||||
|
|
||||||
launcher_load_themes(launcher);
|
launcher_load_themes(launcher);
|
||||||
|
launcher_load_icons(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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -118,41 +99,48 @@ void cleanup_launcher()
|
||||||
xsettings_client_destroy(xsettings_client);
|
xsettings_client_destroy(xsettings_client);
|
||||||
for (i = 0 ; i < nb_panel ; i++) {
|
for (i = 0 ; i < nb_panel ; i++) {
|
||||||
Panel *panel = &panel1[i];
|
Panel *panel = &panel1[i];
|
||||||
Launcher *launcher = &panel->launcher;
|
Launcher *launcher = &panel->launcher;
|
||||||
free_area(&launcher->area);
|
cleanup_launcher_theme(launcher);
|
||||||
|
|
||||||
GSList *l;
|
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) {
|
for (l = launcher->list_apps; l ; l = l->next) {
|
||||||
free(l->data);
|
free(l->data);
|
||||||
}
|
}
|
||||||
g_slist_free(launcher->list_apps);
|
g_slist_free(launcher->list_apps);
|
||||||
|
launcher->list_apps = NULL;
|
||||||
for (l = launcher->icon_themes; l ; l = l->next) {
|
|
||||||
IconTheme *theme = (IconTheme*) l->data;
|
|
||||||
free_icon_theme(theme);
|
|
||||||
free(theme);
|
|
||||||
}
|
|
||||||
g_slist_free(launcher->icon_themes);
|
|
||||||
|
|
||||||
launcher->list_apps = launcher->list_icons = launcher->icon_themes = NULL;
|
|
||||||
}
|
}
|
||||||
g_free(icon_theme_name);
|
g_free(icon_theme_name);
|
||||||
launcher_enabled = 0;
|
launcher_enabled = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
free(launcherIcon);
|
||||||
|
}
|
||||||
|
g_slist_free(launcher->list_icons);
|
||||||
|
|
||||||
|
for (l = launcher->list_themes; l ; l = l->next) {
|
||||||
|
IconTheme *theme = (IconTheme*) l->data;
|
||||||
|
free_icon_theme(theme);
|
||||||
|
free(theme);
|
||||||
|
}
|
||||||
|
g_slist_free(launcher->list_themes);
|
||||||
|
launcher->list_icons = launcher->list_themes = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int resize_launcher(void *obj)
|
int resize_launcher(void *obj)
|
||||||
{
|
{
|
||||||
Launcher *launcher = obj;
|
Launcher *launcher = obj;
|
||||||
|
@ -657,7 +645,30 @@ void test_launcher_read_theme_file()
|
||||||
fprintf(stdout, "\033[0m");
|
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)
|
void launcher_load_themes(Launcher *launcher)
|
||||||
{
|
{
|
||||||
// load the user theme, all the inherited themes recursively (DFS), and the hicolor theme
|
// 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";
|
icon_theme_name = "hicolor";
|
||||||
}
|
}
|
||||||
else
|
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 *queue = g_slist_append(NULL, strdup(icon_theme_name));
|
||||||
GSList *queued = 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;
|
char *name = queue->data;
|
||||||
queue = g_slist_remove(queue, name);
|
queue = g_slist_remove(queue, name);
|
||||||
|
|
||||||
fprintf(stderr, "icon theme '%s', ", name);
|
fprintf(stderr, " '%s',", name);
|
||||||
IconTheme *theme = load_theme(name);
|
IconTheme *theme = load_theme(name);
|
||||||
if (theme != NULL) {
|
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;
|
GSList* item = theme->list_inherits;
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
|
@ -792,7 +803,7 @@ char *icon_path(Launcher *launcher, const char *icon_name, int size)
|
||||||
|
|
||||||
// Stage 1: exact size match
|
// Stage 1: exact size match
|
||||||
GSList *theme;
|
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;
|
GSList *dir;
|
||||||
for (dir = ((IconTheme*)theme->data)->list_directories; dir; dir = g_slist_next(dir)) {
|
for (dir = ((IconTheme*)theme->data)->list_directories; dir; dir = g_slist_next(dir)) {
|
||||||
if (directory_matches_size((IconThemeDir*)dir->data, size)) {
|
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;
|
char *best_file_name = NULL;
|
||||||
int next_larger_size = -1;
|
int next_larger_size = -1;
|
||||||
char *next_larger = NULL;
|
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;
|
GSList *dir;
|
||||||
for (dir = ((IconTheme*)theme->data)->list_directories; dir; dir = g_slist_next(dir)) {
|
for (dir = ((IconTheme*)theme->data)->list_directories; dir; dir = g_slist_next(dir)) {
|
||||||
GSList *base;
|
GSList *base;
|
||||||
|
|
|
@ -16,7 +16,7 @@ typedef struct Launcher {
|
||||||
Area area;
|
Area area;
|
||||||
GSList *list_apps; // List of char*, each is a path to a app.desktop file
|
GSList *list_apps; // List of char*, each is a path to a app.desktop file
|
||||||
GSList *list_icons; // List of LauncherIcon*
|
GSList *list_icons; // List of LauncherIcon*
|
||||||
GSList *icon_themes; // List of IconTheme*
|
GSList *list_themes; // List of IconTheme*
|
||||||
} Launcher;
|
} Launcher;
|
||||||
|
|
||||||
typedef struct LauncherIcon {
|
typedef struct LauncherIcon {
|
||||||
|
@ -67,10 +67,15 @@ void default_launcher();
|
||||||
void init_launcher();
|
void init_launcher();
|
||||||
void init_launcher_panel(void *panel);
|
void init_launcher_panel(void *panel);
|
||||||
void cleanup_launcher();
|
void cleanup_launcher();
|
||||||
|
void cleanup_launcher_theme(Launcher *launcher);
|
||||||
|
|
||||||
int resize_launcher(void *obj);
|
int resize_launcher(void *obj);
|
||||||
void draw_launcher (void *obj, cairo_t *c);
|
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 launcher_action(LauncherIcon *icon);
|
||||||
|
|
||||||
void test_launcher_read_desktop_file();
|
void test_launcher_read_desktop_file();
|
||||||
|
|
|
@ -51,27 +51,21 @@ void xsettings_notify_cb (const char *name, XSettingsAction action, XSettingsSet
|
||||||
//printf("xsettings_notify_cb\n");
|
//printf("xsettings_notify_cb\n");
|
||||||
if ((action == XSETTINGS_ACTION_NEW || action == XSETTINGS_ACTION_CHANGED) && name != NULL && setting != NULL) {
|
if ((action == XSETTINGS_ACTION_NEW || action == XSETTINGS_ACTION_CHANGED) && name != NULL && setting != NULL) {
|
||||||
if (!strcmp(name, "Net/IconThemeName") && setting->type == XSETTINGS_TYPE_STRING) {
|
if (!strcmp(name, "Net/IconThemeName") && setting->type == XSETTINGS_TYPE_STRING) {
|
||||||
printf("XSETTINGS_ACTION %s\n", setting->data.v_string);
|
|
||||||
if (icon_theme_name) {
|
if (icon_theme_name) {
|
||||||
if (strcmp(icon_theme_name, setting->data.v_string) == 0)
|
if (strcmp(icon_theme_name, setting->data.v_string) == 0)
|
||||||
return;
|
return;
|
||||||
g_free(icon_theme_name);
|
g_free(icon_theme_name);
|
||||||
}
|
}
|
||||||
icon_theme_name = strdup(setting->data.v_string);
|
icon_theme_name = strdup(setting->data.v_string);
|
||||||
/*
|
|
||||||
cleanup_launcher();
|
|
||||||
int i;
|
int i;
|
||||||
Panel *p;
|
for (i = 0 ; i < nb_panel ; i++) {
|
||||||
for (i=0 ; i < nb_panel ; i++) {
|
Launcher *launcher = &panel1[i].launcher;
|
||||||
p = &panel1[i];
|
cleanup_launcher_theme(launcher);
|
||||||
init_launcher_panel(p);
|
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;
|
XSettingsList *old_list = client->settings;
|
||||||
client->settings = NULL;
|
client->settings = NULL;
|
||||||
printf("read_settings 1\n");
|
|
||||||
|
|
||||||
old_handler = XSetErrorHandler (ignore_errors);
|
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);
|
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);
|
||||||
|
|
|
@ -39,29 +39,16 @@ typedef enum
|
||||||
XSETTINGS_ACTION_DELETED
|
XSETTINGS_ACTION_DELETED
|
||||||
} XSettingsAction;
|
} XSettingsAction;
|
||||||
|
|
||||||
typedef void (*XSettingsNotifyFunc) (const char *name,
|
typedef void (*XSettingsNotifyFunc) (const char *name, XSettingsAction action, XSettingsSetting *setting, void *cb_data);
|
||||||
XSettingsAction action,
|
typedef void (*XSettingsWatchFunc) (Window window, Bool is_start, long mask, void *cb_data);
|
||||||
XSettingsSetting *setting,
|
|
||||||
void *cb_data);
|
|
||||||
typedef void (*XSettingsWatchFunc) (Window window,
|
|
||||||
Bool is_start,
|
|
||||||
long mask,
|
|
||||||
void *cb_data);
|
|
||||||
|
|
||||||
XSettingsClient *xsettings_client_new (Display *display,
|
XSettingsClient *xsettings_client_new (Display *display, int screen, XSettingsNotifyFunc notify, XSettingsWatchFunc watch, void *cb_data);
|
||||||
int screen,
|
void xsettings_client_destroy (XSettingsClient *client);
|
||||||
XSettingsNotifyFunc notify,
|
Bool xsettings_client_process_event (XSettingsClient *client, XEvent *xev);
|
||||||
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);
|
void xsettings_notify_cb (const char *name, XSettingsAction action, XSettingsSetting *setting, void *data);
|
||||||
|
|
||||||
XSettingsResult xsettings_client_get_setting (XSettingsClient *client,
|
XSettingsResult xsettings_client_get_setting (XSettingsClient *client, const char *name, XSettingsSetting **setting);
|
||||||
const char *name,
|
|
||||||
XSettingsSetting **setting);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -480,6 +480,8 @@ void event_property_notify (XEvent *e)
|
||||||
Window win = e->xproperty.window;
|
Window win = e->xproperty.window;
|
||||||
Atom at = e->xproperty.atom;
|
Atom at = e->xproperty.atom;
|
||||||
|
|
||||||
|
if (xsettings_client)
|
||||||
|
xsettings_client_process_event(xsettings_client, e);
|
||||||
if (win == server.root_win) {
|
if (win == server.root_win) {
|
||||||
if (!server.got_root_win) {
|
if (!server.got_root_win) {
|
||||||
XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask);
|
XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask);
|
||||||
|
@ -804,9 +806,6 @@ start:
|
||||||
if (select(x11_fd+1, &fdset, 0, 0, timeout) > 0) {
|
if (select(x11_fd+1, &fdset, 0, 0, timeout) > 0) {
|
||||||
while (XPending (server.dsp)) {
|
while (XPending (server.dsp)) {
|
||||||
XNextEvent(server.dsp, &e);
|
XNextEvent(server.dsp, &e);
|
||||||
if (xsettings_client != NULL) {
|
|
||||||
xsettings_client_process_event(xsettings_client, &e);
|
|
||||||
}
|
|
||||||
|
|
||||||
panel = get_panel(e.xany.window);
|
panel = get_panel(e.xany.window);
|
||||||
if (panel && panel_autohide) {
|
if (panel && panel_autohide) {
|
||||||
|
|
Loading…
Reference in a new issue