fixed config reload SIGUSR1. added systray = 1 parameter to enable systray

git-svn-id: http://tint2.googlecode.com/svn/trunk@242 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
This commit is contained in:
lorthiois@bbsoft.fr
2009-10-30 17:18:44 +00:00
parent 51b9ce356a
commit c763cf7172
12 changed files with 161 additions and 107 deletions

View File

@@ -32,8 +32,8 @@
#include "battery.h" #include "battery.h"
#include "clock.h" #include "clock.h"
PangoFontDescription *bat1_font_desc; PangoFontDescription *bat1_font_desc=0;
PangoFontDescription *bat2_font_desc; PangoFontDescription *bat2_font_desc=0;
struct batstate battery_state; struct batstate battery_state;
int battery_enabled; int battery_enabled;
@@ -41,8 +41,11 @@ static char buf_bat_percentage[10];
static char buf_bat_time[20]; static char buf_bat_time[20];
int8_t battery_low_status; int8_t battery_low_status;
char *battery_low_cmd; char *battery_low_cmd=0;
char *path_energy_now, *path_energy_full, *path_current_now, *path_status; char *path_energy_now=0;
char *path_energy_full=0;
char *path_current_now=0;
char *path_status=0;
void init_battery() void init_battery()
@@ -55,7 +58,6 @@ void init_battery()
if (!battery_enabled) return; if (!battery_enabled) return;
path_energy_now = path_energy_full = path_current_now = path_status = 0;
directory = g_dir_open("/sys/class/power_supply", 0, &error); directory = g_dir_open("/sys/class/power_supply", 0, &error);
if (error) if (error)
g_error_free(error); g_error_free(error);
@@ -75,7 +77,7 @@ void init_battery()
if (directory) if (directory)
g_dir_close(directory); g_dir_close(directory);
if (!battery_dir) { if (!battery_dir) {
battery_enabled = 0; cleanup_battery();
fprintf(stderr, "ERROR: battery applet can't found power_supply\n"); fprintf(stderr, "ERROR: battery applet can't found power_supply\n");
return; return;
} }
@@ -107,13 +109,8 @@ void init_battery()
fp3 = fopen(path_current_now, "r"); fp3 = fopen(path_current_now, "r");
fp4 = fopen(path_status, "r"); fp4 = fopen(path_status, "r");
if (fp1 == NULL || fp2 == NULL || fp3 == NULL || fp4 == NULL) { if (fp1 == NULL || fp2 == NULL || fp3 == NULL || fp4 == NULL) {
battery_enabled = 0; cleanup_battery();
fprintf(stderr, "ERROR: battery applet can't open energy_now\n"); fprintf(stderr, "ERROR: battery applet can't open energy_now\n");
g_free(path_energy_now);
g_free(path_energy_full);
g_free(path_current_now);
g_free(path_status);
path_energy_now = path_energy_full = path_current_now = path_status = 0;
} }
fclose(fp1); fclose(fp1);
fclose(fp2); fclose(fp2);
@@ -126,6 +123,29 @@ void init_battery()
} }
void cleanup_battery()
{
battery_enabled = 0;
if (bat1_font_desc)
pango_font_description_free(bat1_font_desc);
if (bat2_font_desc)
pango_font_description_free(bat2_font_desc);
if (path_energy_now)
g_free(path_energy_now);
if (path_energy_full)
g_free(path_energy_full);
if (path_current_now)
g_free(path_current_now);
if (path_status)
g_free(path_status);
if (battery_low_cmd)
g_free(battery_low_cmd);
battery_low_cmd = path_energy_now = path_energy_full = path_current_now = path_status = 0;
bat1_font_desc = bat2_font_desc = 0;
}
void init_battery_panel(void *p) void init_battery_panel(void *p)
{ {
Panel *panel = (Panel*)p; Panel *panel = (Panel*)p;

View File

@@ -62,6 +62,7 @@ void update_battery();
void init_battery(); void init_battery();
void init_battery_panel(void *panel); void init_battery_panel(void *panel);
void cleanup_battery();
void draw_battery(void *obj, cairo_t *c, int active); void draw_battery(void *obj, cairo_t *c, int active);

View File

@@ -32,16 +32,17 @@
#include "clock.h" #include "clock.h"
char *time1_format; char *time1_format=0;
char *time2_format; char *time2_format=0;
char *clock_lclick_command; char *clock_lclick_command=0;
char *clock_rclick_command; char *clock_rclick_command=0;
struct timeval time_clock; struct timeval time_clock;
int time_precision; int time_precision;
PangoFontDescription *time1_font_desc; PangoFontDescription *time1_font_desc=0;
PangoFontDescription *time2_font_desc; PangoFontDescription *time2_font_desc=0;
static char buf_time[40]; static char buf_time[40];
static char buf_date[40]; static char buf_date[40];
int clock_enabled;
void init_precision() void init_precision()
@@ -78,6 +79,7 @@ void init_clock_panel(void *p)
clock->area._resize = resize_clock; clock->area._resize = resize_clock;
clock->area.resize = 1; clock->area.resize = 1;
clock->area.redraw = 1; clock->area.redraw = 1;
clock->area.on_screen = 1;
strftime(buf_time, sizeof(buf_time), time1_format, localtime(&time_clock.tv_sec)); strftime(buf_time, sizeof(buf_time), time1_format, localtime(&time_clock.tv_sec));
get_text_size(time1_font_desc, &time_height_ink, &time_height, panel->area.height, buf_time, strlen(buf_time)); get_text_size(time1_font_desc, &time_height_ink, &time_height, panel->area.height, buf_time, strlen(buf_time));
@@ -110,6 +112,27 @@ void init_clock_panel(void *p)
} }
void cleanup_clock()
{
clock_enabled = 0;
if (time1_font_desc)
pango_font_description_free(time1_font_desc);
if (time2_font_desc)
pango_font_description_free(time2_font_desc);
if (time1_format)
g_free(time1_format);
if (time2_format)
g_free(time2_format);
if (clock_lclick_command)
g_free(clock_lclick_command);
if (clock_rclick_command)
g_free(clock_rclick_command);
time1_font_desc = time2_font_desc = 0;
time1_format = time2_format = 0;
clock_lclick_command = clock_rclick_command = 0;
}
void draw_clock (void *obj, cairo_t *c, int active) void draw_clock (void *obj, cairo_t *c, int active)
{ {
Clock *clock = obj; Clock *clock = obj;

View File

@@ -32,12 +32,14 @@ extern PangoFontDescription *time1_font_desc;
extern PangoFontDescription *time2_font_desc; extern PangoFontDescription *time2_font_desc;
extern char *clock_lclick_command; extern char *clock_lclick_command;
extern char *clock_rclick_command; extern char *clock_rclick_command;
extern int clock_enabled;
// initialize clock : y position, precision, ... // initialize clock : y position, precision, ...
void init_clock(); void init_clock();
void init_clock_panel(void *panel); void init_clock_panel(void *panel);
void init_precision(); void init_precision();
void cleanup_clock();
void draw_clock (void *obj, cairo_t *c, int active); void draw_clock (void *obj, cairo_t *c, int active);

View File

@@ -77,6 +77,13 @@ void init_config()
// append full transparency background // append full transparency background
list_back = g_slist_append(0, calloc(1, sizeof(Area))); list_back = g_slist_append(0, calloc(1, sizeof(Area)));
// tint2 could reload config, so we cleanup objects
cleanup_systray();
cleanup_battery();
cleanup_clock();
cleanup_tooltip();
// panel's default value
memset(&panel_config, 0, sizeof(Panel)); memset(&panel_config, 0, sizeof(Panel));
panel_config.g_task.alpha = 100; panel_config.g_task.alpha = 100;
panel_config.g_task.alpha_active = 100; panel_config.g_task.alpha_active = 100;
@@ -199,6 +206,11 @@ void add_entry (char *key, char *value)
panel_config.monitor = atoi (value); panel_config.monitor = atoi (value);
if (panel_config.monitor > 0) panel_config.monitor -= 1; if (panel_config.monitor > 0) panel_config.monitor -= 1;
} }
if (panel_config.monitor > (server.nb_monitor-1)) {
// server.nb_monitor minimum value is 1 (see get_monitors())
fprintf(stderr, "warning : monitor not found. tint2 default to all monitors.\n");
panel_config.monitor = 0;
}
} }
else if (strcmp (key, "panel_size") == 0) { else if (strcmp (key, "panel_size") == 0) {
extract_values(value, &value1, &value2, &value3); extract_values(value, &value1, &value2, &value3);
@@ -289,9 +301,8 @@ void add_entry (char *key, char *value)
} }
else if (strcmp (key, "battery_low_cmd") == 0) { else if (strcmp (key, "battery_low_cmd") == 0) {
#ifdef ENABLE_BATTERY #ifdef ENABLE_BATTERY
if (battery_low_cmd) g_free(battery_low_cmd); if (strlen(value) > 0)
if (strlen(value) > 0) battery_low_cmd = strdup (value); battery_low_cmd = strdup (value);
else battery_low_cmd = 0;
#endif #endif
} }
else if (strcmp (key, "bat1_font") == 0) { else if (strcmp (key, "bat1_font") == 0) {
@@ -335,20 +346,14 @@ void add_entry (char *key, char *value)
/* Clock */ /* Clock */
else if (strcmp (key, "time1_format") == 0) { else if (strcmp (key, "time1_format") == 0) {
if (time1_format) g_free(time1_format);
if (strlen(value) > 0) { if (strlen(value) > 0) {
time1_format = strdup (value); time1_format = strdup (value);
panel_config.clock.area.on_screen = 1; clock_enabled = 1;
}
else {
time1_format = 0;
panel_config.clock.area.on_screen = 0;
} }
} }
else if (strcmp (key, "time2_format") == 0) { else if (strcmp (key, "time2_format") == 0) {
if (time2_format) g_free(time2_format); if (strlen(value) > 0)
if (strlen(value) > 0) time2_format = strdup (value); time2_format = strdup (value);
else time2_format = 0;
} }
else if (strcmp (key, "time1_font") == 0) { else if (strcmp (key, "time1_font") == 0) {
if (save_file_config) old_time1_font = strdup (value); if (save_file_config) old_time1_font = strdup (value);
@@ -379,14 +384,12 @@ void add_entry (char *key, char *value)
memcpy(&panel_config.clock.area.pix.border, &a->pix.border, sizeof(Border)); memcpy(&panel_config.clock.area.pix.border, &a->pix.border, sizeof(Border));
} }
else if (strcmp(key, "clock_lclick_command") == 0) { else if (strcmp(key, "clock_lclick_command") == 0) {
if (clock_lclick_command) g_free(clock_lclick_command); if (strlen(value) > 0)
if (strlen(value) > 0) clock_lclick_command = strdup(value); clock_lclick_command = strdup(value);
else clock_lclick_command = 0;
} }
else if (strcmp(key, "clock_rclick_command") == 0) { else if (strcmp(key, "clock_rclick_command") == 0) {
if (clock_rclick_command) g_free(clock_rclick_command); if (strlen(value) > 0)
if (strlen(value) > 0) clock_rclick_command = strdup(value); clock_rclick_command = strdup(value);
else clock_rclick_command = 0;
} }
/* Taskbar */ /* Taskbar */
@@ -482,12 +485,15 @@ void add_entry (char *key, char *value)
} }
/* Systray */ /* Systray */
else if (strcmp (key, "systray") == 0) {
if(atoi(value) == 1)
systray_enabled = 1;
}
else if (strcmp (key, "systray_padding") == 0) { else if (strcmp (key, "systray_padding") == 0) {
extract_values(value, &value1, &value2, &value3); extract_values(value, &value1, &value2, &value3);
systray.area.paddingxlr = systray.area.paddingx = atoi (value1); systray.area.paddingxlr = systray.area.paddingx = atoi (value1);
if (value2) systray.area.paddingy = atoi (value2); if (value2) systray.area.paddingy = atoi (value2);
if (value3) systray.area.paddingx = atoi (value3); if (value3) systray.area.paddingx = atoi (value3);
systray.area.on_screen = 1;
} }
else if (strcmp (key, "systray_background_id") == 0) { else if (strcmp (key, "systray_background_id") == 0) {
int id = atoi (value); int id = atoi (value);
@@ -638,29 +644,6 @@ void add_entry (char *key, char *value)
} }
void config_finish ()
{
if (panel_config.monitor > (server.nb_monitor-1)) {
// server.nb_monitor minimum value is 1 (see get_monitors())
// and panel_config->monitor is higher
fprintf(stderr, "warning : monitor not found. tint2 default to all monitors.\n");
panel_config.monitor = 0;
}
// TODO: user can configure layout => ordered objects in panel.area.list
// clock and systray before taskbar because resize(clock) can resize others object ??
init_tooltip();
init_clock();
#ifdef ENABLE_BATTERY
init_battery();
#endif
init_systray();
init_panel();
cleanup_config();
}
int config_read () int config_read ()
{ {
const gchar * const * system_dirs; const gchar * const * system_dirs;

View File

@@ -16,7 +16,6 @@ void init_config();
void cleanup_config(); void cleanup_config();
int config_read_file (const char *path); int config_read_file (const char *path);
int config_read (); int config_read ();
void config_finish ();
void save_config (); void save_config ();
#endif #endif

View File

@@ -71,6 +71,13 @@ void init_panel()
int i, old_nb_panel; int i, old_nb_panel;
Panel *new_panel, *p; Panel *new_panel, *p;
init_tooltip();
init_systray();
init_clock();
#ifdef ENABLE_BATTERY
init_battery();
#endif
cleanup_taskbar(); cleanup_taskbar();
for (i=0 ; i < nb_panel ; i++) { for (i=0 ; i < nb_panel ; i++) {
free_area(&panel1[i].area); free_area(&panel1[i].area);
@@ -123,7 +130,7 @@ void init_panel()
init_panel_size_and_position(p); init_panel_size_and_position(p);
// add childs // add childs
if (p->clock.area.on_screen) { if (clock_enabled) {
init_clock_panel(p); init_clock_panel(p);
p->area.list = g_slist_append(p->area.list, &p->clock); p->area.list = g_slist_append(p->area.list, &p->clock);
} }

View File

@@ -43,20 +43,21 @@ Window net_sel_win = None, hint_win = None;
// freedesktop specification doesn't allow multi systray // freedesktop specification doesn't allow multi systray
Systraybar systray; Systraybar systray;
int refresh_systray; int refresh_systray;
int systray_enabled;
void init_systray() void init_systray()
{ {
if (systray.area.on_screen) start_net();
systray.area.on_screen = init_net();
if (!systray.area.on_screen) if (!systray_enabled)
return; return;
systray.area._draw_foreground = draw_systray; systray.area._draw_foreground = draw_systray;
systray.area._resize = resize_systray; systray.area._resize = resize_systray;
systray.area.resize = 1; systray.area.resize = 1;
systray.area.redraw = 1; systray.area.redraw = 1;
systray.area.on_screen = 1;
refresh_systray = 0; refresh_systray = 0;
} }
@@ -80,17 +81,9 @@ void init_systray_panel(void *p)
void cleanup_systray() void cleanup_systray()
{ {
if (systray.list_icons) { systray_enabled = 0;
// remove_icon change systray.list_icons systray.area.on_screen = 0;
while(systray.list_icons)
remove_icon((TrayWindow*)systray.list_icons->data);
g_slist_free(systray.list_icons);
systray.list_icons = 0;
}
free_area(&systray.area); free_area(&systray.area);
cleanup_net();
} }
@@ -177,8 +170,18 @@ void resize_systray(void *obj)
// *********************************************** // ***********************************************
// systray protocol // systray protocol
int init_net() void start_net()
{ {
if (net_sel_win) {
// protocol already started
if (!systray_enabled)
stop_net();
return;
}
else
if (!systray_enabled)
return;
Window win = XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN); Window win = XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN);
// freedesktop systray specification // freedesktop systray specification
@@ -201,7 +204,7 @@ int init_net()
fprintf(stderr, " pid=%d", pid); fprintf(stderr, " pid=%d", pid);
} }
fprintf(stderr, "\n"); fprintf(stderr, "\n");
return 0; return;
} }
// init systray protocol // init systray protocol
@@ -214,10 +217,12 @@ int init_net()
XSetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN, net_sel_win, CurrentTime); XSetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN, net_sel_win, CurrentTime);
if (XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN) != net_sel_win) { if (XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN) != net_sel_win) {
stop_net();
fprintf(stderr, "tint2 : can't get systray manager\n"); fprintf(stderr, "tint2 : can't get systray manager\n");
return 0; return;
} }
//fprintf(stderr, "tint2 : systray started\n");
XClientMessageEvent ev; XClientMessageEvent ev;
ev.type = ClientMessage; ev.type = ClientMessage;
ev.window = server.root_win; ev.window = server.root_win;
@@ -229,12 +234,21 @@ int init_net()
ev.data.l[3] = 0; ev.data.l[3] = 0;
ev.data.l[4] = 0; ev.data.l[4] = 0;
XSendEvent(server.dsp, server.root_win, False, StructureNotifyMask, (XEvent*)&ev); XSendEvent(server.dsp, server.root_win, False, StructureNotifyMask, (XEvent*)&ev);
return 1;
} }
void cleanup_net() void stop_net()
{ {
//fprintf(stderr, "tint2 : systray stopped\n");
if (systray.list_icons) {
// remove_icon change systray.list_icons
while(systray.list_icons)
remove_icon((TrayWindow*)systray.list_icons->data);
g_slist_free(systray.list_icons);
systray.list_icons = 0;
}
if (net_sel_win != None) { if (net_sel_win != None) {
XDestroyWindow(server.dsp, net_sel_win); XDestroyWindow(server.dsp, net_sel_win);
net_sel_win = None; net_sel_win = None;

View File

@@ -38,10 +38,11 @@ typedef struct
} TrayWindow; } TrayWindow;
// net_sel_win != None when protocol started
extern Window net_sel_win; extern Window net_sel_win;
extern Systraybar systray; extern Systraybar systray;
extern int refresh_systray; extern int refresh_systray;
extern int systray_enabled;
void init_systray(); void init_systray();
void init_systray_panel(void *p); void init_systray_panel(void *p);
@@ -52,8 +53,8 @@ void resize_systray(void *obj);
// systray protocol // systray protocol
// many tray icon doesn't manage stop/restart of the systray manager // many tray icon doesn't manage stop/restart of the systray manager
int init_net(); void start_net();
void cleanup_net(); void stop_net();
void net_message(XClientMessageEvent *e); void net_message(XClientMessageEvent *e);
gboolean add_icon(Window id); gboolean add_icon(Window id);

View File

@@ -125,35 +125,18 @@ void init (int argc, char *argv[])
void cleanup() void cleanup()
{ {
cleanup_systray(); cleanup_systray();
stop_net();
cleanup_panel(); cleanup_panel();
cleanup_tooltip();
cleanup_clock();
#ifdef ENABLE_BATTERY
cleanup_battery();
#endif
if (default_icon) { if (default_icon) {
imlib_context_set_image(default_icon); imlib_context_set_image(default_icon);
imlib_free_image(); imlib_free_image();
} }
if (g_tooltip.window) {
XDestroyWindow(server.dsp, g_tooltip.window);
g_tooltip.window = 0;
}
if (g_tooltip.font_desc) {
pango_font_description_free(g_tooltip.font_desc);
g_tooltip.font_desc = 0;
}
if (time1_font_desc) pango_font_description_free(time1_font_desc);
if (time2_font_desc) pango_font_description_free(time2_font_desc);
if (time1_format) g_free(time1_format);
if (time2_format) g_free(time2_format);
#ifdef ENABLE_BATTERY
if (bat1_font_desc) pango_font_description_free(bat1_font_desc);
if (bat2_font_desc) pango_font_description_free(bat2_font_desc);
if (battery_low_cmd) g_free(battery_low_cmd);
if (path_energy_now) g_free(path_energy_now);
if (path_energy_full) g_free(path_energy_full);
if (path_current_now) g_free(path_current_now);
if (path_status) g_free(path_status);
#endif
if (clock_lclick_command) g_free(clock_lclick_command);
if (clock_rclick_command) g_free(clock_rclick_command);
if (config_path) g_free(config_path); if (config_path) g_free(config_path);
if (thumbnail_path) g_free(thumbnail_path); if (thumbnail_path) g_free(thumbnail_path);
@@ -730,7 +713,8 @@ int main (int argc, char *argv[])
cleanup(); cleanup();
exit(1); exit(1);
} }
config_finish(); init_panel();
cleanup_config();
if (thumbnail_path) { if (thumbnail_path) {
// usage: tint2 -j <file> for internal use // usage: tint2 -j <file> for internal use
printf("file %s\n", thumbnail_path); printf("file %s\n", thumbnail_path);

View File

@@ -59,6 +59,25 @@ void init_tooltip()
} }
void cleanup_tooltip()
{
tooltip_hide();
g_tooltip.enabled = False;
if (g_tooltip.task) {
alarm(0);
g_tooltip.task = 0;
}
if (g_tooltip.window) {
XDestroyWindow(server.dsp, g_tooltip.window);
g_tooltip.window = 0;
}
if (g_tooltip.font_desc) {
pango_font_description_free(g_tooltip.font_desc);
g_tooltip.font_desc = 0;
}
}
void tooltip_sighandler(int sig) void tooltip_sighandler(int sig)
{ {
if (g_tooltip.current_state == TOOLTIP_ABOUT_TO_SHOW) if (g_tooltip.current_state == TOOLTIP_ABOUT_TO_SHOW)

View File

@@ -47,6 +47,7 @@ extern Tooltip g_tooltip;
void init_tooltip(); void init_tooltip();
void cleanup_tooltip();
void tooltip_sighandler(int sig); void tooltip_sighandler(int sig);
void tooltip_trigger_show(Task* task, int x, int y); void tooltip_trigger_show(Task* task, int x, int y);
void tooltip_show(); void tooltip_show();