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 "clock.h"
PangoFontDescription *bat1_font_desc;
PangoFontDescription *bat2_font_desc;
PangoFontDescription *bat1_font_desc=0;
PangoFontDescription *bat2_font_desc=0;
struct batstate battery_state;
int battery_enabled;
@ -41,8 +41,11 @@ static char buf_bat_percentage[10];
static char buf_bat_time[20];
int8_t battery_low_status;
char *battery_low_cmd;
char *path_energy_now, *path_energy_full, *path_current_now, *path_status;
char *battery_low_cmd=0;
char *path_energy_now=0;
char *path_energy_full=0;
char *path_current_now=0;
char *path_status=0;
void init_battery()
@ -55,7 +58,6 @@ void init_battery()
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);
if (error)
g_error_free(error);
@ -75,7 +77,7 @@ void init_battery()
if (directory)
g_dir_close(directory);
if (!battery_dir) {
battery_enabled = 0;
cleanup_battery();
fprintf(stderr, "ERROR: battery applet can't found power_supply\n");
return;
}
@ -107,13 +109,8 @@ void init_battery()
fp3 = fopen(path_current_now, "r");
fp4 = fopen(path_status, "r");
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");
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(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)
{
Panel *panel = (Panel*)p;

View file

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

View file

@ -32,16 +32,17 @@
#include "clock.h"
char *time1_format;
char *time2_format;
char *clock_lclick_command;
char *clock_rclick_command;
char *time1_format=0;
char *time2_format=0;
char *clock_lclick_command=0;
char *clock_rclick_command=0;
struct timeval time_clock;
int time_precision;
PangoFontDescription *time1_font_desc;
PangoFontDescription *time2_font_desc;
PangoFontDescription *time1_font_desc=0;
PangoFontDescription *time2_font_desc=0;
static char buf_time[40];
static char buf_date[40];
int clock_enabled;
void init_precision()
@ -78,6 +79,7 @@ void init_clock_panel(void *p)
clock->area._resize = resize_clock;
clock->area.resize = 1;
clock->area.redraw = 1;
clock->area.on_screen = 1;
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));
@ -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)
{
Clock *clock = obj;

View file

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

View file

@ -77,6 +77,13 @@ void init_config()
// append full transparency background
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));
panel_config.g_task.alpha = 100;
panel_config.g_task.alpha_active = 100;
@ -199,6 +206,11 @@ void add_entry (char *key, char *value)
panel_config.monitor = atoi (value);
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) {
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) {
#ifdef ENABLE_BATTERY
if (battery_low_cmd) g_free(battery_low_cmd);
if (strlen(value) > 0) battery_low_cmd = strdup (value);
else battery_low_cmd = 0;
if (strlen(value) > 0)
battery_low_cmd = strdup (value);
#endif
}
else if (strcmp (key, "bat1_font") == 0) {
@ -335,20 +346,14 @@ void add_entry (char *key, char *value)
/* Clock */
else if (strcmp (key, "time1_format") == 0) {
if (time1_format) g_free(time1_format);
if (strlen(value) > 0) {
time1_format = strdup (value);
panel_config.clock.area.on_screen = 1;
}
else {
time1_format = 0;
panel_config.clock.area.on_screen = 0;
clock_enabled = 1;
}
}
else if (strcmp (key, "time2_format") == 0) {
if (time2_format) g_free(time2_format);
if (strlen(value) > 0) time2_format = strdup (value);
else time2_format = 0;
if (strlen(value) > 0)
time2_format = strdup (value);
}
else if (strcmp (key, "time1_font") == 0) {
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));
}
else if (strcmp(key, "clock_lclick_command") == 0) {
if (clock_lclick_command) g_free(clock_lclick_command);
if (strlen(value) > 0) clock_lclick_command = strdup(value);
else clock_lclick_command = 0;
if (strlen(value) > 0)
clock_lclick_command = strdup(value);
}
else if (strcmp(key, "clock_rclick_command") == 0) {
if (clock_rclick_command) g_free(clock_rclick_command);
if (strlen(value) > 0) clock_rclick_command = strdup(value);
else clock_rclick_command = 0;
if (strlen(value) > 0)
clock_rclick_command = strdup(value);
}
/* Taskbar */
@ -482,12 +485,15 @@ void add_entry (char *key, char *value)
}
/* Systray */
else if (strcmp (key, "systray") == 0) {
if(atoi(value) == 1)
systray_enabled = 1;
}
else if (strcmp (key, "systray_padding") == 0) {
extract_values(value, &value1, &value2, &value3);
systray.area.paddingxlr = systray.area.paddingx = atoi (value1);
if (value2) systray.area.paddingy = atoi (value2);
if (value3) systray.area.paddingx = atoi (value3);
systray.area.on_screen = 1;
}
else if (strcmp (key, "systray_background_id") == 0) {
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 ()
{
const gchar * const * system_dirs;

View file

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

View file

@ -71,6 +71,13 @@ void init_panel()
int i, old_nb_panel;
Panel *new_panel, *p;
init_tooltip();
init_systray();
init_clock();
#ifdef ENABLE_BATTERY
init_battery();
#endif
cleanup_taskbar();
for (i=0 ; i < nb_panel ; i++) {
free_area(&panel1[i].area);
@ -123,7 +130,7 @@ void init_panel()
init_panel_size_and_position(p);
// add childs
if (p->clock.area.on_screen) {
if (clock_enabled) {
init_clock_panel(p);
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
Systraybar systray;
int refresh_systray;
int systray_enabled;
void init_systray()
{
if (systray.area.on_screen)
systray.area.on_screen = init_net();
start_net();
if (!systray.area.on_screen)
if (!systray_enabled)
return;
systray.area._draw_foreground = draw_systray;
systray.area._resize = resize_systray;
systray.area.resize = 1;
systray.area.redraw = 1;
systray.area.on_screen = 1;
refresh_systray = 0;
}
@ -80,17 +81,9 @@ void init_systray_panel(void *p)
void cleanup_systray()
{
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;
}
systray_enabled = 0;
systray.area.on_screen = 0;
free_area(&systray.area);
cleanup_net();
}
@ -177,8 +170,18 @@ void resize_systray(void *obj)
// ***********************************************
// 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);
// freedesktop systray specification
@ -201,7 +204,7 @@ int init_net()
fprintf(stderr, " pid=%d", pid);
}
fprintf(stderr, "\n");
return 0;
return;
}
// init systray protocol
@ -214,10 +217,12 @@ int init_net()
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) {
stop_net();
fprintf(stderr, "tint2 : can't get systray manager\n");
return 0;
return;
}
//fprintf(stderr, "tint2 : systray started\n");
XClientMessageEvent ev;
ev.type = ClientMessage;
ev.window = server.root_win;
@ -229,12 +234,21 @@ int init_net()
ev.data.l[3] = 0;
ev.data.l[4] = 0;
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) {
XDestroyWindow(server.dsp, net_sel_win);
net_sel_win = None;

View file

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

View file

@ -125,35 +125,18 @@ void init (int argc, char *argv[])
void cleanup()
{
cleanup_systray();
stop_net();
cleanup_panel();
cleanup_tooltip();
cleanup_clock();
#ifdef ENABLE_BATTERY
cleanup_battery();
#endif
if (default_icon) {
imlib_context_set_image(default_icon);
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 (thumbnail_path) g_free(thumbnail_path);
@ -730,7 +713,8 @@ int main (int argc, char *argv[])
cleanup();
exit(1);
}
config_finish();
init_panel();
cleanup_config();
if (thumbnail_path) {
// usage: tint2 -j <file> for internal use
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)
{
if (g_tooltip.current_state == TOOLTIP_ABOUT_TO_SHOW)

View file

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