all repos — tint2 @ 9a85f7f2c55cad0736379bdd7c999e141ac1ca33

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

Use default desktop font (Gtk/FontName from XSettings) when the font is not specified in the config file
o9000 mrovi9000@gmail.com
commit

9a85f7f2c55cad0736379bdd7c999e141ac1ca33

parent

1b545f6bbe71b6e7a360d6605fe91583f2d2e528

M ChangeLogChangeLog

@@ -1,6 +1,7 @@

-2015-12-05 master +2015-12-12 master - Enhancements: - Support for NETWM viewports (as in Compiz) (issue #94) + - The default desktop font (Gtk/FontName from XSettings) is used when a font is not specified in the config file - New plugin: executor - New taskbar sort order: least-recently-used (lru), most-recently-used (mru) 2015-11-12 0.12.3
M sample/tint2rcsample/tint2rc

@@ -105,7 +105,6 @@ task_urgent_icon_asb = 100 0 0

task_iconified_icon_asb = 100 0 0 # Fonts -task_font = sans 9 task_font_color = #FFFFFF 90 task_active_font_color = #FFFFFF 90 task_urgent_font_color = #FFFFFF 90

@@ -127,9 +126,7 @@ systray_icon_asb = 100 0 0

# Clock time1_format = %H:%M -time1_font = sans bold 8 time2_format = %A %d %B -time2_font = sans 8 clock_font_color = #FFFFFF 100 clock_padding = 1 0 clock_background_id = 0

@@ -140,15 +137,12 @@ tooltip_padding = 2 2

tooltip_show_timeout = 0.5 tooltip_hide_timeout = 0.1 tooltip_background_id = 5 -tooltip_font = sans 9 tooltip_font_color = #222222 100 # Battery battery_low_status = 10 battery_low_cmd = notify-send "battery low" battery_hide = 101 -bat1_font = sans 8 -bat2_font = sans 7 battery_font_color = #FFFFFF 100 battery_padding = 1 0 battery_background_id = 0
M src/battery/battery.csrc/battery/battery.c

@@ -31,7 +31,9 @@ #include "battery.h"

#include "timer.h" #include "common.h" +gboolean bat1_has_font; PangoFontDescription *bat1_font_desc; +gboolean bat2_has_font; PangoFontDescription *bat2_font_desc; struct BatteryState battery_state; gboolean battery_enabled;

@@ -53,6 +55,8 @@ char *battery_rclick_command;

char *battery_uwheel_command; char *battery_dwheel_command; gboolean battery_found; + +void battery_init_fonts(); void update_battery_tick(void *arg) {

@@ -91,8 +95,7 @@ battery_low_cmd_sent) {

battery_low_cmd_sent = FALSE; } - int i; - for (i = 0; i < num_panels; i++) { + for (int i = 0; i < num_panels; i++) { // Show/hide if needed if (!battery_found) { if (panels[i].battery.area.on_screen) {

@@ -131,7 +134,9 @@ battery_found = FALSE;

percentage_hide = 101; battery_low_cmd_sent = FALSE; battery_timeout = NULL; + bat1_has_font = FALSE; bat1_font_desc = NULL; + bat2_has_font = FALSE; bat2_font_desc = NULL; ac_connected_cmd = NULL; ac_disconnected_cmd = NULL;

@@ -209,10 +214,7 @@

if (!battery_enabled) return; - if (!bat1_font_desc) - bat1_font_desc = pango_font_description_from_string(DEFAULT_FONT); - if (!bat2_font_desc) - bat2_font_desc = pango_font_description_from_string(DEFAULT_FONT); + battery_init_fonts(); if (!battery->area.bg) battery->area.bg = &g_array_index(backgrounds, Background, 0);

@@ -229,6 +231,42 @@ battery_uwheel_command || battery_dwheel_command;

battery->area.has_mouse_press_effect = battery->area.has_mouse_over_effect; if (battery_tooltip_enabled) battery->area._get_tooltip_text = battery_get_tooltip; +} + +void battery_init_fonts() +{ + if (!bat1_font_desc) { + bat1_font_desc = pango_font_description_from_string(get_default_font()); + pango_font_description_set_size(bat1_font_desc, + pango_font_description_get_size(bat1_font_desc) - PANGO_SCALE); + } + if (!bat2_font_desc) { + bat2_font_desc = pango_font_description_from_string(get_default_font()); + pango_font_description_set_size(bat2_font_desc, + pango_font_description_get_size(bat2_font_desc) - PANGO_SCALE); + } +} + +void battery_default_font_changed() +{ + if (!battery_enabled) + return; + if (bat1_has_font && bat2_has_font) + return; + if (!bat1_has_font) { + pango_font_description_free(bat1_font_desc); + bat1_font_desc = NULL; + } + if (!bat2_has_font) { + pango_font_description_free(bat2_font_desc); + bat2_font_desc = NULL; + } + battery_init_fonts(); + for (int i = 0; i < num_panels; i++) { + panels[i].battery.area.resize_needed = TRUE; + panels[i].battery.area.redraw_needed = TRUE; + } + panel_refresh = TRUE; } int update_battery()
M src/battery/battery.hsrc/battery/battery.h

@@ -47,7 +47,9 @@ gboolean ac_connected;

} BatteryState; extern struct BatteryState battery_state; +extern gboolean bat1_has_font; extern PangoFontDescription *bat1_font_desc; +extern gboolean bat2_has_font; extern PangoFontDescription *bat2_font_desc; extern gboolean battery_enabled; extern gboolean battery_tooltip_enabled;

@@ -103,6 +105,7 @@ void init_battery_panel(void *panel);

void reinit_battery(); void draw_battery(void *obj, cairo_t *c); +void battery_default_font_changed(); gboolean resize_battery(void *obj);
M src/clock/clock.csrc/clock/clock.c

@@ -43,13 +43,17 @@ char *clock_rclick_command;

char *clock_uwheel_command; char *clock_dwheel_command; struct timeval time_clock; +gboolean time1_has_font; PangoFontDescription *time1_font_desc; +gboolean time2_has_font; PangoFontDescription *time2_font_desc; static char buf_time[256]; static char buf_date[256]; static char buf_tooltip[512]; int clock_enabled; static timeout *clock_timeout; + +void clock_init_fonts(); void default_clock() {

@@ -66,7 +70,9 @@ clock_mclick_command = NULL;

clock_rclick_command = NULL; clock_uwheel_command = NULL; clock_dwheel_command = NULL; + time1_has_font = FALSE; time1_font_desc = NULL; + time2_has_font = FALSE; time2_font_desc = NULL; }

@@ -175,12 +181,9 @@ {

Panel *panel = (Panel *)p; Clock *clock = &panel->clock; - if (!time1_font_desc) - time1_font_desc = pango_font_description_from_string(DEFAULT_FONT); - if (!time2_font_desc) - time2_font_desc = pango_font_description_from_string(DEFAULT_FONT); if (!clock->area.bg) clock->area.bg = &g_array_index(backgrounds, Background, 0); + clock_init_fonts(); clock->area.parent = p; clock->area.panel = p; clock->area.has_mouse_press_effect = clock->area.has_mouse_over_effect =

@@ -202,6 +205,43 @@ strftime(buf_tooltip, sizeof(buf_tooltip), time_tooltip_format, clock_gettime_for_tz(time_tooltip_timezone));

} } +void clock_init_fonts() +{ + if (!time1_font_desc) { + time1_font_desc = pango_font_description_from_string(get_default_font()); + pango_font_description_set_weight(time1_font_desc, PANGO_WEIGHT_BOLD); + pango_font_description_set_size(time1_font_desc, + pango_font_description_get_size(time1_font_desc) - PANGO_SCALE); + } + if (!time2_font_desc) { + time2_font_desc = pango_font_description_from_string(get_default_font()); + pango_font_description_set_size(time2_font_desc, + pango_font_description_get_size(time2_font_desc) - PANGO_SCALE); + } +} + +void clock_default_font_changed() +{ + if (!clock_enabled) + return; + if (time1_has_font && time2_has_font) + return; + if (!time1_has_font) { + pango_font_description_free(time1_font_desc); + time1_font_desc = NULL; + } + if (!time2_has_font) { + pango_font_description_free(time2_font_desc); + time2_font_desc = NULL; + } + clock_init_fonts(); + for (int i = 0; i < num_panels; i++) { + panels[i].clock.area.resize_needed = TRUE; + panels[i].clock.area.redraw_needed = TRUE; + } + panel_refresh = TRUE; +} + void draw_clock(void *obj, cairo_t *c) { Clock *clock = obj;

@@ -323,3 +363,4 @@ break;

} tint_exec(command); } +
M src/clock/clock.hsrc/clock/clock.h

@@ -28,7 +28,9 @@ extern char *time2_format;

extern char *time2_timezone; extern char *time_tooltip_format; extern char *time_tooltip_timezone; +extern gboolean time1_has_font; extern PangoFontDescription *time1_font_desc; +extern gboolean time2_has_font; extern PangoFontDescription *time2_font_desc; extern char *clock_lclick_command; extern char *clock_mclick_command;

@@ -46,6 +48,7 @@

// initialize clock : y position, precision, ... void init_clock(); void init_clock_panel(void *panel); +void clock_default_font_changed(); void draw_clock(void *obj, cairo_t *c);
M src/config.csrc/config.c

@@ -467,10 +467,12 @@ #endif

} else if (strcmp(key, "bat1_font") == 0) { #ifdef ENABLE_BATTERY bat1_font_desc = pango_font_description_from_string(value); + bat1_has_font = TRUE; #endif } else if (strcmp(key, "bat2_font") == 0) { #ifdef ENABLE_BATTERY bat2_font_desc = pango_font_description_from_string(value); + bat2_has_font = TRUE; #endif } else if (strcmp(key, "battery_font_color") == 0) { #ifdef ENABLE_BATTERY

@@ -545,6 +547,7 @@ } else if (strcmp(key, "execp_font") == 0) {

Execp *execp = get_or_create_last_execp(); pango_font_description_free(execp->backend->font_desc); execp->backend->font_desc = pango_font_description_from_string(value); + execp->backend->has_font = TRUE; } else if (strcmp(key, "execp_font_color") == 0) { Execp *execp = get_or_create_last_execp(); extract_values(value, &value1, &value2, &value3);

@@ -635,6 +638,7 @@ if (strlen(value) > 0)

time2_format = strdup(value); } else if (strcmp(key, "time1_font") == 0) { time1_font_desc = pango_font_description_from_string(value); + time1_has_font = TRUE; } else if (strcmp(key, "time1_timezone") == 0) { if (strlen(value) > 0) time1_timezone = strdup(value);

@@ -643,6 +647,7 @@ if (strlen(value) > 0)

time2_timezone = strdup(value); } else if (strcmp(key, "time2_font") == 0) { time2_font_desc = pango_font_description_from_string(value); + time2_has_font = TRUE; } else if (strcmp(key, "clock_font_color") == 0) { extract_values(value, &value1, &value2, &value3); get_color(value1, panel_config.clock.font.rgb);

@@ -729,6 +734,7 @@ id = (id < backgrounds->len && id >= 0) ? id : 0;

panel_config.g_taskbar.background_name[TASKBAR_ACTIVE] = &g_array_index(backgrounds, Background, id); } else if (strcmp(key, "taskbar_name_font") == 0) { panel_config.taskbarname_font_desc = pango_font_description_from_string(value); + panel_config.taskbarname_has_font = TRUE; } else if (strcmp(key, "taskbar_name_font_color") == 0) { extract_values(value, &value1, &value2, &value3); get_color(value1, taskbarname_font.rgb);

@@ -795,6 +801,7 @@ if (value3)

panel_config.g_task.area.paddingx = atoi(value3); } else if (strcmp(key, "task_font") == 0) { panel_config.g_task.font_desc = pango_font_description_from_string(value); + panel_config.g_task.has_font = TRUE; } else if (g_regex_match_simple("task.*_font_color", key, 0, 0)) { gchar **split = g_regex_split_simple("_", key, 0, 0); int status = g_strv_length(split) == 3 ? TASK_NORMAL : get_task_status(split[1]);
M src/execplugin/execplugin.csrc/execplugin/execplugin.c

@@ -20,6 +20,7 @@ #include "common.h"

void execp_timer_callback(void *arg); char *execp_get_tooltip(void *obj); +void execp_init_fonts(); void default_execp() {

@@ -122,12 +123,11 @@ g_list_free_full(to_remove, destroy_execp);

} } + execp_init_fonts(); for (GList *l = panel_config.execp_list; l; l = l->next) { Execp *execp = l->data; // Set missing config options - if (!execp->backend->font_desc) - execp->backend->font_desc = pango_font_description_from_string(DEFAULT_FONT); if (!execp->backend->bg) execp->backend->bg = &g_array_index(backgrounds, Background, 0); execp->backend->buf_capacity = 1024;

@@ -172,6 +172,44 @@

if (!execp->backend->timer) execp->backend->timer = add_timeout(10, 0, execp_timer_callback, execp, &execp->backend->timer); } +} + +void execp_init_fonts() +{ + for (GList *l = panel_config.execp_list; l; l = l->next) { + Execp *execp = l->data; + if (!execp->backend->font_desc) + execp->backend->font_desc = pango_font_description_from_string(get_default_font()); + } +} + +void execp_default_font_changed() +{ + gboolean needs_update = FALSE; + for (GList *l = panel_config.execp_list; l; l = l->next) { + Execp *execp = l->data; + + if (!execp->backend->has_font) { + pango_font_description_free(execp->backend->font_desc); + execp->backend->font_desc = NULL; + needs_update = TRUE; + } + } + if (!needs_update) + return; + + execp_init_fonts(); + for (int i = 0; i < num_panels; i++) { + for (GList *l = panels[i].execp_list; l; l = l->next) { + Execp *execp = l->data; + + if (!execp->backend->has_font) { + execp->area.resize_needed = TRUE; + execp->area.redraw_needed = TRUE; + } + } + } + panel_refresh = TRUE; } void cleanup_execp()
M src/execplugin/execplugin.hsrc/execplugin/execplugin.h

@@ -29,6 +29,7 @@ int icon_w;

int icon_h; char *tooltip; gboolean centered; + gboolean has_font; PangoFontDescription *font_desc; Color font_color; int continuous;

@@ -135,5 +136,7 @@ // Called to check if new output from the command can be read.

// No command might be running. // Returns 1 if the output has been updated and a redraw is needed. gboolean read_execp(void *obj); + +void execp_default_font_changed(); #endif // EXECPLUGIN_H
M src/launcher/launcher.csrc/launcher/launcher.c

@@ -51,7 +51,6 @@ int launcher_brightness;

char *icon_theme_name_config; char *icon_theme_name_xsettings; int launcher_icon_theme_override; -XSettingsClient *xsettings_client; int startup_notifications; Background *launcher_icon_bg;

@@ -69,17 +68,12 @@ launcher_brightness = 0;

icon_theme_name_config = NULL; icon_theme_name_xsettings = NULL; launcher_icon_theme_override = 0; - xsettings_client = NULL; startup_notifications = 0; launcher_icon_bg = NULL; } void init_launcher() { - if (launcher_enabled) { - // if XSETTINGS manager running, tint2 read the icon_theme_name. - xsettings_client = xsettings_client_new(server.dsp, server.screen, xsettings_notify_cb, NULL, NULL); - } } void init_launcher_panel(void *p)

@@ -115,10 +109,6 @@ void cleanup_launcher()

{ int i; GSList *l; - - if (xsettings_client) - xsettings_client_destroy(xsettings_client); - xsettings_client = NULL; for (i = 0; i < num_panels; i++) { Panel *panel = &panels[i];

@@ -488,3 +478,19 @@ : icon_theme_name_xsettings ? icon_theme_name_xsettings : "hicolor")

: (icon_theme_name_xsettings ? icon_theme_name_xsettings : icon_theme_name_config ? icon_theme_name_config : "hicolor")); } + +void launcher_default_icon_theme_changed() +{ + if (!launcher_enabled) + return; + if (launcher_icon_theme_override && icon_theme_name_config) + return; + for (int i = 0; i < num_panels; i++) { + Launcher *launcher = &panels[i].launcher; + cleanup_launcher_theme(launcher); + launcher_load_themes(launcher); + launcher_load_icons(launcher); + launcher->area.resize_needed = 1; + } + panel_refresh = TRUE; +}
M src/launcher/launcher.hsrc/launcher/launcher.h

@@ -44,7 +44,6 @@ extern int launcher_brightness;

extern char *icon_theme_name_xsettings; // theme name extern char *icon_theme_name_config; extern int launcher_icon_theme_override; -extern XSettingsClient *xsettings_client; extern int startup_notifications; extern Background *launcher_icon_bg;

@@ -59,6 +58,7 @@ void cleanup_launcher_theme(Launcher *launcher);

gboolean resize_launcher(void *obj); void draw_launcher(void *obj, cairo_t *c); +void launcher_default_icon_theme_changed(); // Populates the list_icons list void launcher_load_icons(Launcher *launcher);
M src/launcher/xsettings-client.csrc/launcher/xsettings-client.c

@@ -46,24 +46,25 @@ };

void xsettings_notify_cb(const char *name, XSettingsAction action, XSettingsSetting *setting, void *data) { - // 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) { + if (strcmp(name, "Net/IconThemeName") == 0 && setting->type == XSETTINGS_TYPE_STRING) { + fprintf(stderr, "xsettings: %s = %s\n", name, setting->data.v_string); if (icon_theme_name_xsettings) { if (strcmp(icon_theme_name_xsettings, setting->data.v_string) == 0) return; free(icon_theme_name_xsettings); } icon_theme_name_xsettings = strdup(setting->data.v_string); - - int i; - for (i = 0; i < num_panels; i++) { - Launcher *launcher = &panels[i].launcher; - cleanup_launcher_theme(launcher); - launcher_load_themes(launcher); - launcher_load_icons(launcher); - launcher->area.resize_needed = 1; + default_icon_theme_changed(); + } else if (strcmp(name, "Gtk/FontName") == 0 && setting->type == XSETTINGS_TYPE_STRING) { + fprintf(stderr, "xsettings: %s = %s\n", name, setting->data.v_string); + if (default_font) { + if (strcmp(default_font, setting->data.v_string) == 0) + return; + free(default_font); } + default_font = strdup(setting->data.v_string); + default_font_changed(); } } }

@@ -341,7 +342,6 @@ int format;

unsigned long n_items; unsigned long bytes_after; unsigned char *data; - int result; int (*old_handler)(Display *, XErrorEvent *);

@@ -349,7 +349,7 @@ XSettingsList *old_list = client->settings;

client->settings = NULL; old_handler = XSetErrorHandler(ignore_errors); - result = XGetWindowProperty(client->display, + int result = XGetWindowProperty(client->display, client->manager_window, server.atom._XSETTINGS_SETTINGS, 0,

@@ -401,9 +401,7 @@ XSettingsNotifyFunc notify,

XSettingsWatchFunc watch, void *cb_data) { - XSettingsClient *client; - - client = calloc(1, sizeof *client); + XSettingsClient *client = calloc(1, sizeof *client); if (!client) return NULL;

@@ -422,15 +420,18 @@

check_manager_window(client); if (client->manager_window == None) { - printf("NO XSETTINGS manager, tint2 use config 'launcher_icon_theme'.\n"); + printf("No XSETTINGS manager, tint2 uses config option 'launcher_icon_theme'.\n"); free(client); return NULL; - } else + } else { return client; + } } void xsettings_client_destroy(XSettingsClient *client) { + if (!client) + return; if (client->watch) client->watch(RootWindow(client->display, client->screen), False, 0, client->cb_data); if (client->manager_window && client->watch)
M src/panel.csrc/panel.c

@@ -72,6 +72,7 @@

GArray *backgrounds; Imlib_Image default_icon; +char *default_font = NULL; void default_panel() {

@@ -1013,3 +1014,25 @@ {

relayout(&panel->area); draw_tree(&panel->area); } + +const char *get_default_font() +{ + if (default_font) + return default_font; + return DEFAULT_FONT; +} + +void default_icon_theme_changed() +{ + launcher_default_icon_theme_changed(); +} + +void default_font_changed() +{ + battery_default_font_changed(); + clock_default_font_changed(); + execp_default_font_changed(); + taskbar_default_font_changed(); + taskbarname_default_font_changed(); + tooltip_default_font_changed(); +}
M src/panel.hsrc/panel.h

@@ -83,8 +83,9 @@ extern char *panel_items_order;

extern int max_tick_urgent; extern GArray *backgrounds; extern Imlib_Image default_icon; -// TODO maybe this should be a config option #define DEFAULT_FONT "sans 10" +extern char *default_font; +extern XSettingsClient *xsettings_client; typedef struct Panel { Area area;

@@ -114,6 +115,7 @@

// Array of Taskbar, with num_desktops items Taskbar *taskbar; int num_desktops; + gboolean taskbarname_has_font; PangoFontDescription *taskbarname_font_desc; Clock clock;

@@ -178,5 +180,10 @@ void autohide_show(void *p);

void autohide_hide(void *p); void autohide_trigger_show(Panel *p); void autohide_trigger_hide(Panel *p); + +const char *get_default_font(); + +void default_icon_theme_changed(); +void default_font_changed(); #endif
M src/taskbar/task.hsrc/taskbar/task.h

@@ -44,6 +44,7 @@ int config_background_mask;

// starting position for text ~ task_padding + task_border + icon_size double text_posx, text_height; + gboolean has_font; PangoFontDescription *font_desc; Color font[TASK_STATE_COUNT]; int config_font_mask;
M src/taskbar/taskbar.csrc/taskbar/taskbar.c

@@ -48,6 +48,8 @@ gboolean hide_task_diff_monitor;

TaskbarSortMethod taskbar_sort_method; Alignment taskbar_alignment; +void taskbar_init_fonts(); + guint win_hash(gconstpointer key) { return *((const Window *)key);

@@ -139,10 +141,9 @@ if (!panel->g_taskbar.background_name[TASKBAR_NORMAL]) {

panel->g_taskbar.background_name[TASKBAR_NORMAL] = &g_array_index(backgrounds, Background, 0); panel->g_taskbar.background_name[TASKBAR_ACTIVE] = &g_array_index(backgrounds, Background, 0); } - if (!panel->g_task.font_desc) - panel->g_task.font_desc = pango_font_description_from_string(DEFAULT_FONT); if (!panel->g_task.area.bg) panel->g_task.area.bg = &g_array_index(backgrounds, Background, 0); + taskbar_init_fonts(); // taskbar name panel->g_taskbar.area_name.panel = panel;

@@ -285,6 +286,46 @@ }

init_taskbarname_panel(panel); } +void taskbar_init_fonts() +{ + for (int i = 0; i < num_panels; i++) { + if (!panels[i].g_task.font_desc) { + panels[i].g_task.font_desc = pango_font_description_from_string(get_default_font()); + pango_font_description_set_size(panels[i].g_task.font_desc, + pango_font_description_get_size(panels[i].g_task.font_desc) - PANGO_SCALE); + } + } +} + +void taskbar_default_font_changed() +{ + if (!taskbar_enabled) + return; + + gboolean needs_update = FALSE; + for (int i = 0; i < num_panels; i++) { + if (!panels[i].g_task.has_font) { + pango_font_description_free(panels[i].g_task.font_desc); + panels[i].g_task.font_desc = NULL; + needs_update = TRUE; + } + } + if (!needs_update) + return; + taskbar_init_fonts(); + for (int i = 0; i < num_panels; i++) { + for (int j = 0; j < panels[i].num_desktops; j++) { + Taskbar *taskbar = &panels[i].taskbar[j]; + for (GList *c = taskbar->area.children; c; c = c->next) { + Task *t = c->data; + t->area.resize_needed = TRUE; + t->area.redraw_needed = TRUE; + } + } + } + panel_refresh = TRUE; +} + void taskbar_remove_task(gpointer key, gpointer value, gpointer user_data) { remove_task(task_get_task(*(Window *)key));

@@ -317,8 +358,7 @@ if (!win)

return; GList *win_list = g_hash_table_get_keys(win_to_task); - GList *it; - for (it = win_list; it; it = it->next) { + for (GList *it = win_list; it; it = it->next) { int i; for (i = 0; i < num_results; i++) if (*((Window *)it->data) == win[i])
M src/taskbar/taskbar.hsrc/taskbar/taskbar.h

@@ -84,4 +84,6 @@

void sort_taskbar_for_win(Window win); void sort_tasks(Taskbar *taskbar); +void taskbar_default_font_changed(); + #endif
M src/taskbar/taskbarname.csrc/taskbar/taskbarname.c

@@ -33,14 +33,14 @@ #include "server.h"

#include "taskbarname.h" int taskbarname_enabled; -PangoFontDescription *taskbarname_font_desc; Color taskbarname_font; Color taskbarname_active_font; + +void taskbarname_init_fonts(); void default_taskbarname() { taskbarname_enabled = 0; - taskbarname_font_desc = NULL; } void init_taskbarname_panel(void *p)

@@ -52,8 +52,7 @@

if (!taskbarname_enabled) return; - if (!panel_config.taskbarname_font_desc) - panel_config.taskbarname_font_desc = pango_font_description_from_string(DEFAULT_FONT); + taskbarname_init_fonts(); GSList *l, *list = get_desktop_names(); for (j = 0, l = list; j < panel->num_desktops; j++) {

@@ -81,6 +80,34 @@

for (l = list; l; l = l->next) g_free(l->data); g_slist_free(list); +} + +void taskbarname_init_fonts() +{ + if (!panel_config.taskbarname_font_desc) + panel_config.taskbarname_font_desc = pango_font_description_from_string(get_default_font()); +} + +void taskbarname_default_font_changed() +{ + if (!taskbar_enabled) + return; + if (!taskbarname_enabled) + return; + if (panel_config.taskbarname_has_font) + return; + + pango_font_description_free(panel_config.taskbarname_font_desc); + panel_config.taskbarname_font_desc = NULL; + taskbarname_init_fonts(); + for (int i = 0; i < num_panels; i++) { + for (int j = 0; j < panels[i].num_desktops; j++) { + Taskbar *taskbar = &panels[i].taskbar[j]; + taskbar->bar_name.area.resize_needed = TRUE; + taskbar->bar_name.area.redraw_needed = TRUE; + } + } + panel_refresh = TRUE; } void cleanup_taskbarname()
M src/taskbar/taskbarname.hsrc/taskbar/taskbarname.h

@@ -21,4 +21,6 @@ void draw_taskbarname(void *obj, cairo_t *c);

gboolean resize_taskbarname(void *obj); +void taskbarname_default_font_changed(); + #endif
M src/tint.csrc/tint.c

@@ -59,6 +59,7 @@ Atom dnd_selection;

Atom dnd_atom; int dnd_sent_request; char *dnd_launcher_exec; +XSettingsClient *xsettings_client = NULL; timeout *detect_compositor_timer = NULL; int detect_compositor_timer_counter = 0;

@@ -124,7 +125,7 @@ default_tooltip();

default_execp(); default_panel(); - // read options + // Read command line arguments for (int i = 1; i < argc; ++i) { int error = 0; if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) {

@@ -157,7 +158,7 @@ printf("Usage: tint2 [[-c] <config_file>]\n");

exit(1); } } - // Set signal handler + // Set signal handlers signal_pending = 0; struct sigaction sa = {.sa_handler = signal_handler}; struct sigaction sa_chld = {.sa_handler = SIG_DFL, .sa_flags = SA_NOCLDWAIT};

@@ -166,16 +167,6 @@ sigaction(SIGINT, &sa, 0);

sigaction(SIGTERM, &sa, 0); sigaction(SIGHUP, &sa, 0); sigaction(SIGCHLD, &sa_chld, 0); - - // BSD does not support pselect(), therefore we have to use select and hope that we do not - // end up in a race condition there (see 'man select()' on a linux machine for more information) - // block all signals, such that no race conditions occur before pselect in our main loop - // sigset_t block_mask; - // sigaddset(&block_mask, SIGINT); - // sigaddset(&block_mask, SIGTERM); - // sigaddset(&block_mask, SIGHUP); - // sigaddset(&block_mask, SIGUSR1); - // sigprocmask(SIG_BLOCK, &block_mask, 0); } static int sn_pipe_valid = 0;

@@ -267,6 +258,8 @@ get_monitors();

get_desktops(); server.disable_transparency = 0; + + xsettings_client = xsettings_client_new(server.dsp, server.screen, xsettings_notify_cb, NULL, NULL); } void init_X11_post_config()

@@ -301,12 +294,9 @@ imlib_context_set_visual(server.visual);

imlib_context_set_colormap(server.colormap); // load default icon - gchar *path; - const gchar *const *data_dirs; - data_dirs = g_get_system_data_dirs(); - int i; - for (i = 0; data_dirs[i] != NULL; i++) { - path = g_build_filename(data_dirs[i], "tint2", "default_icon.png", NULL); + const gchar *const *data_dirs = g_get_system_data_dirs(); + for (int i = 0; data_dirs[i] != NULL; i++) { + gchar *path = g_build_filename(data_dirs[i], "tint2", "default_icon.png", NULL); if (g_file_test(path, G_FILE_TEST_EXISTS)) default_icon = imlib_load_image(path); g_free(path);

@@ -332,6 +322,9 @@ imlib_free_image();

default_icon = NULL; } imlib_context_disconnect_display(); + + xsettings_client_destroy(xsettings_client); + xsettings_client = NULL; cleanup_server(); cleanup_timeout();
M src/tooltip/tooltip.csrc/tooltip/tooltip.c

@@ -35,6 +35,8 @@ void start_show_timeout();

void start_hide_timeout(); void stop_tooltip_timeout(); +void tooltip_init_fonts(); + Tooltip g_tooltip; void default_tooltip()

@@ -63,10 +65,9 @@ }

void init_tooltip() { - if (!g_tooltip.font_desc) - g_tooltip.font_desc = pango_font_description_from_string(DEFAULT_FONT); if (!g_tooltip.bg) g_tooltip.bg = &g_array_index(backgrounds, Background, 0); + tooltip_init_fonts(); XSetWindowAttributes attr; attr.override_redirect = True;

@@ -77,9 +78,38 @@ attr.border_pixel = 0;

unsigned long mask = CWEventMask | CWColormap | CWBorderPixel | CWBackPixel | CWOverrideRedirect; if (g_tooltip.window) XDestroyWindow(server.dsp, g_tooltip.window); - g_tooltip.window = - XCreateWindow(server.dsp, server.root_win, 0, 0, 100, 20, 0, server.depth, InputOutput, server.visual, mask, &attr); + g_tooltip.window = XCreateWindow(server.dsp, + server.root_win, + 0, + 0, + 100, + 20, + 0, + server.depth, + InputOutput, + server.visual, + mask, + &attr); } + +void tooltip_init_fonts() +{ + if (!g_tooltip.font_desc) + g_tooltip.font_desc = pango_font_description_from_string(get_default_font()); +} + +void tooltip_default_font_changed() +{ + if (g_tooltip.has_font) + return; + if (!g_tooltip.has_font) { + pango_font_description_free(g_tooltip.font_desc); + g_tooltip.font_desc = NULL; + } + tooltip_init_fonts(); + tooltip_update(); +} + void tooltip_trigger_show(Area *area, Panel *p, XEvent *e) {
M src/tooltip/tooltip.hsrc/tooltip/tooltip.h

@@ -32,6 +32,7 @@ int hide_timeout_msec;

Bool mapped; int paddingx; int paddingy; + gboolean has_font; PangoFontDescription *font_desc; Color font_color; Background *bg;

@@ -53,5 +54,6 @@ void tooltip_update();

void tooltip_trigger_hide(); void tooltip_hide(void * /*arg*/); void tooltip_copy_text(Area *area); +void tooltip_default_font_changed(); #endif // TOOLTIP_H