Memory management review: match char-malloc/strdup-free, gchar-g_str*/g_free; set pointers to null after free; initialize fonts/backgrounds correctly when missing from config

git-svn-id: http://tint2.googlecode.com/svn/trunk@748 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
This commit is contained in:
o9000 2015-04-11 09:51:10 +00:00 committed by mrovi9000@gmail.com
parent 321ccc0794
commit af003d0e19
18 changed files with 228 additions and 148 deletions

View file

@ -56,10 +56,10 @@ static char buf_bat_time[20];
int8_t battery_low_status;
unsigned char battery_low_cmd_sent;
char *battery_low_cmd;
char *path_energy_now;
char *path_energy_full;
char *path_current_now;
char *path_status;
gchar *path_energy_now;
gchar *path_energy_full;
gchar *path_current_now;
gchar *path_status;
int battery_found;
#if defined(__OpenBSD__) || defined(__NetBSD__)
@ -126,17 +126,19 @@ void default_battery()
battery_found = 0;
percentage_hide = 101;
battery_low_cmd_sent = 0;
battery_timeout = 0;
bat1_font_desc = 0;
bat2_font_desc = 0;
battery_low_cmd = 0;
path_energy_now = 0;
path_energy_full = 0;
path_current_now = 0;
path_status = 0;
battery_timeout = NULL;
bat1_font_desc = NULL;
bat2_font_desc = NULL;
battery_low_cmd = NULL;
path_energy_now = NULL;
path_energy_full = NULL;
path_current_now = NULL;
path_status = NULL;
battery_state.percentage = 0;
battery_state.time.hours = 0;
battery_state.time.minutes = 0;
battery_state.time.seconds = 0;
battery_state.state = BATTERY_UNKNOWN;
#if defined(__OpenBSD__) || defined(__NetBSD__)
apm_fd = -1;
#endif
@ -145,21 +147,21 @@ void default_battery()
void cleanup_battery()
{
pango_font_description_free(bat1_font_desc);
bat1_font_desc = 0;
bat1_font_desc = NULL;
pango_font_description_free(bat2_font_desc);
bat2_font_desc = 0;
bat2_font_desc = NULL;
g_free(path_energy_now);
path_energy_now = 0;
path_energy_now = NULL;
g_free(path_energy_full);
path_energy_full = 0;
path_energy_full = NULL;
g_free(path_current_now);
path_current_now = 0;
path_current_now = NULL;
g_free(path_status);
path_status = 0;
g_free(battery_low_cmd);
battery_low_cmd = 0;
path_status = NULL;
free(battery_low_cmd);
battery_low_cmd = NULL;
stop_timeout(battery_timeout);
battery_timeout = 0;
battery_timeout = NULL;
battery_found = 0;
#if defined(__OpenBSD__) || defined(__NetBSD__)
@ -191,7 +193,7 @@ void init_battery()
GDir *directory = 0;
GError *error = NULL;
const char *entryname;
char *battery_dir = 0;
gchar *battery_dir = 0;
directory = g_dir_open("/sys/class/power_supply", 0, &error);
if (error) {
@ -286,6 +288,11 @@ void init_battery_panel(void *p)
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);
if (battery->area.bg == 0)
battery->area.bg = &g_array_index(backgrounds, Background, 0);

View file

@ -53,32 +53,43 @@ static timeout* clock_timeout;
void default_clock()
{
clock_enabled = 0;
clock_timeout = 0;
time1_format = 0;
time1_timezone = 0;
time2_format = 0;
time2_timezone = 0;
time_tooltip_format = 0;
time_tooltip_timezone = 0;
clock_lclick_command = 0;
clock_rclick_command = 0;
time1_font_desc = 0;
time2_font_desc = 0;
clock_timeout = NULL;
time1_format = NULL;
time1_timezone = NULL;
time2_format = NULL;
time2_timezone = NULL;
time_tooltip_format = NULL;
time_tooltip_timezone = NULL;
clock_lclick_command = NULL;
clock_rclick_command = NULL;
time1_font_desc = NULL;
time2_font_desc = NULL;
}
void cleanup_clock()
{
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 (time_tooltip_format) g_free(time_tooltip_format);
if (time1_timezone) g_free(time1_timezone);
if (time2_timezone) g_free(time2_timezone);
if (time_tooltip_timezone) g_free(time_tooltip_timezone);
if (clock_lclick_command) g_free(clock_lclick_command);
if (clock_rclick_command) g_free(clock_rclick_command);
if (clock_timeout) stop_timeout(clock_timeout);
pango_font_description_free(time1_font_desc);
time1_font_desc = NULL;
pango_font_description_free(time2_font_desc);
time2_font_desc = NULL;
free(time1_format);
time1_format = NULL;
free(time2_format);
time2_format = NULL;
free(time_tooltip_format);
time_tooltip_format = NULL;
free(time1_timezone);
time1_timezone = NULL;
free(time2_timezone);
time2_timezone = NULL;
free(time_tooltip_timezone);
time_tooltip_timezone = NULL;
free(clock_lclick_command);
clock_lclick_command = NULL;
free(clock_rclick_command);
clock_rclick_command = NULL;
stop_timeout(clock_timeout);
clock_timeout = NULL;
}
@ -138,7 +149,7 @@ int time_format_needs_sec_ticks(char *time_format)
void init_clock()
{
if (clock_timeout == 0) {
if (!clock_timeout) {
if (time_format_needs_sec_ticks(time1_format) ||
time_format_needs_sec_ticks(time2_format)) {
clock_timeout = add_timeout(10, 1000, update_clocks_sec, 0);
@ -154,7 +165,11 @@ void init_clock_panel(void *p)
Panel *panel =(Panel*)p;
Clock *clock = &panel->clock;
if (clock->area.bg == 0)
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->area.parent = p;
clock->area.panel = p;
@ -162,7 +177,7 @@ void init_clock_panel(void *p)
clock->area.size_mode = SIZE_BY_CONTENT;
clock->area._resize = resize_clock;
// check consistency
if (time1_format == 0)
if (!time1_format)
return;
clock->area.resize = 1;

View file

@ -72,15 +72,17 @@ static int new_config_file;
void default_config()
{
config_path = 0;
snapshot_path = 0;
config_path = NULL;
snapshot_path = NULL;
new_config_file = 0;
}
void cleanup_config()
{
if (config_path) g_free(config_path);
if (snapshot_path) g_free(snapshot_path);
free(config_path);
config_path = NULL;
free(snapshot_path);
snapshot_path = NULL;
}
@ -158,7 +160,7 @@ void load_launcher_app_dir(const char *path)
gchar *file = g_build_filename(path, name, NULL);
if (!g_file_test(file, G_FILE_TEST_IS_DIR) &&
g_str_has_suffix(file, ".desktop")) {
panel_config.launcher.list_apps = g_slist_append(panel_config.launcher.list_apps, (char *)strdup(file));
panel_config.launcher.list_apps = g_slist_append(panel_config.launcher.list_apps, strdup(file));
} else if (g_file_test(file, G_FILE_TEST_IS_DIR)) {
load_launcher_app_dir(file);
}
@ -373,12 +375,13 @@ void add_entry (char *key, char *value)
if (new_config_file == 0) {
clock_enabled = 1;
if (panel_items_order) {
char* tmp = g_strconcat(panel_items_order, "C", NULL);
g_free( panel_items_order );
panel_items_order = tmp;
gchar* tmp = g_strconcat(panel_items_order, "C", NULL);
free(panel_items_order);
panel_items_order = strdup(tmp);
g_free(tmp);
}
else
panel_items_order = g_strdup("C");
panel_items_order = strdup("C");
}
if (strlen(value) > 0) {
time1_format = strdup (value);
@ -581,12 +584,13 @@ void add_entry (char *key, char *value)
if (new_config_file == 0 && systray_enabled == 0) {
systray_enabled = 1;
if (panel_items_order) {
char* tmp = g_strconcat(panel_items_order, "S", NULL);
g_free( panel_items_order );
panel_items_order = tmp;
gchar* tmp = g_strconcat(panel_items_order, "S", NULL);
free(panel_items_order);
panel_items_order = strdup(tmp);
g_free(tmp);
}
else
panel_items_order = g_strdup("S");
panel_items_order = strdup("S");
}
extract_values(value, &value1, &value2, &value3);
systray.area.paddingxlr = systray.area.paddingx = atoi (value1);
@ -734,12 +738,13 @@ void add_entry (char *key, char *value)
systray_enabled = atoi(value);
if (systray_enabled) {
if (panel_items_order) {
char* tmp = g_strconcat(panel_items_order, "S", NULL);
g_free( panel_items_order );
panel_items_order = tmp;
gchar* tmp = g_strconcat(panel_items_order, "S", NULL);
free(panel_items_order);
panel_items_order = strdup(tmp);
g_free(tmp);
}
else
panel_items_order = g_strdup("S");
panel_items_order = strdup("S");
}
}
}
@ -749,12 +754,13 @@ void add_entry (char *key, char *value)
battery_enabled = atoi(value);
if (battery_enabled) {
if (panel_items_order) {
char* tmp = g_strconcat(panel_items_order, "B", NULL);
g_free( panel_items_order );
panel_items_order = tmp;
gchar* tmp = g_strconcat(panel_items_order, "B", NULL);
free(panel_items_order);
panel_items_order = strdup(tmp);
g_free(tmp);
}
else
panel_items_order = g_strdup("B");
panel_items_order = strdup("B");
}
}
}
@ -771,7 +777,7 @@ void add_entry (char *key, char *value)
int config_read ()
{
const gchar * const * system_dirs;
char *path1;
gchar *path1;
gint i;
// follow XDG specification
@ -786,7 +792,7 @@ int config_read ()
g_free(path1);
// copy tint2rc from system directory to user directory
char *path2 = 0;
gchar *path2 = 0;
system_dirs = g_get_system_config_dirs();
for (i = 0; system_dirs[i]; i++) {
path2 = g_build_filename(system_dirs[i], "tint2", "tint2rc", NULL);
@ -798,7 +804,7 @@ int config_read ()
if (path2) {
// copy file in user directory (path1)
char *dir = g_build_filename (g_get_user_config_dir(), "tint2", NULL);
gchar *dir = g_build_filename (g_get_user_config_dir(), "tint2", NULL);
if (!g_file_test (dir, G_FILE_TEST_IS_DIR)) g_mkdir(dir, 0777);
g_free(dir);
@ -836,12 +842,13 @@ int config_read_file (const char *path)
if (new_config_file == 0) {
taskbar_enabled = 1;
if (panel_items_order) {
char* tmp = g_strconcat( "T", panel_items_order, NULL );
g_free(panel_items_order);
panel_items_order = tmp;
gchar* tmp = g_strconcat("T", panel_items_order, NULL);
free(panel_items_order);
panel_items_order = strdup(tmp);
g_free(tmp);
}
else
panel_items_order = g_strdup("T");
panel_items_order = strdup("T");
}
return 1;

View file

@ -228,7 +228,7 @@ void load_theme_from_fs_dir(IconTheme *theme, char *dir_name)
IconTheme *load_theme_from_fs(char *name, IconTheme *theme)
{
char *dir_name = NULL;
gchar *dir_name = NULL;
const GSList *location;
for (location = get_icon_locations(); location; location = g_slist_next(location)) {
gchar *path = (gchar*) location->data;
@ -255,7 +255,7 @@ IconTheme *load_theme(char *name)
if (name == NULL)
return NULL;
char *file_name = NULL;
gchar *file_name = NULL;
const GSList *location;
for (location = get_icon_locations(); location; location = g_slist_next(location)) {
gchar *path = (gchar*) location->data;

View file

@ -96,7 +96,7 @@ void init_launcher_panel(void *p)
launcher->area._resize = resize_launcher;
launcher->area.resize = 1;
launcher->area.redraw = 1;
if (launcher->area.bg == 0)
if (!launcher->area.bg)
launcher->area.bg = &g_array_index(backgrounds, Background, 0);
// check consistency
@ -118,20 +118,26 @@ void cleanup_launcher()
if (xsettings_client)
xsettings_client_destroy(xsettings_client);
xsettings_client = NULL;
for (i = 0; i < nb_panel; i++) {
Panel *panel = &panel1[i];
Launcher *launcher = &panel->launcher;
cleanup_launcher_theme(launcher);
}
for (l = panel_config.launcher.list_apps; l ; l = l->next) {
free(l->data);
}
g_slist_free(panel_config.launcher.list_apps);
panel_config.launcher.list_apps = NULL;
free(icon_theme_name_config);
icon_theme_name_config = NULL;
free(icon_theme_name_xsettings);
icon_theme_name_xsettings = NULL;
launcher_enabled = 0;
}
@ -153,9 +159,9 @@ void cleanup_launcher_theme(Launcher *launcher)
free(launcherIcon);
}
g_slist_free(launcher->list_icons);
launcher->list_icons = NULL;
free_themes(launcher->list_themes);
launcher->list_icons = NULL;
launcher->list_themes = NULL;
}

View file

@ -82,7 +82,7 @@ void default_panel()
task_dragged = 0;
panel_horizontal = 1;
panel_position = CENTER;
panel_items_order = 0;
panel_items_order = NULL;
panel_autohide = 0;
panel_autohide_show_timeout = 0;
panel_autohide_hide_timeout = 0;
@ -106,11 +106,10 @@ void default_panel()
void cleanup_panel()
{
if (!panel1) return;
if (!panel1)
return;
cleanup_taskbar();
// taskbarname_font_desc freed here because cleanup_taskbarname() called on _NET_NUMBER_OF_DESKTOPS
if (taskbarname_font_desc) pango_font_description_free(taskbarname_font_desc);
int i;
Panel *p;
@ -118,17 +117,28 @@ void cleanup_panel()
p = &panel1[i];
free_area(&p->area);
if (p->temp_pmap) XFreePixmap(server.dsp, p->temp_pmap);
if (p->hidden_pixmap) XFreePixmap(server.dsp, p->hidden_pixmap);
if (p->main_win) XDestroyWindow(server.dsp, p->main_win);
if (p->temp_pmap)
XFreePixmap(server.dsp, p->temp_pmap);
p->temp_pmap = 0;
if (p->hidden_pixmap)
XFreePixmap(server.dsp, p->hidden_pixmap);
p->hidden_pixmap = 0;
if (p->main_win)
XDestroyWindow(server.dsp, p->main_win);
p->main_win = 0;
}
if (panel_items_order) g_free(panel_items_order);
free(panel_items_order);
panel_items_order = NULL;
free(panel_window_name);
if (panel1) free(panel1);
panel_window_name = NULL;
free(panel1);
panel1 = NULL;
if (backgrounds)
g_array_free(backgrounds, 1);
if (panel_config.g_task.font_desc) pango_font_description_free(panel_config.g_task.font_desc);
backgrounds = NULL;
pango_font_description_free(panel_config.g_task.font_desc);
panel_config.g_task.font_desc = NULL;
}
void init_panel()
@ -168,7 +178,7 @@ void init_panel()
if (panel_config.monitor < 0)
p->monitor = i;
if ( p->area.bg == 0 )
if (!p->area.bg)
p->area.bg = &g_array_index(backgrounds, Background, 0);
p->area.parent = p;
p->area.panel = p;

View file

@ -68,6 +68,8 @@ 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"
// tint2 use one panel per monitor and one taskbar per desktop.

View file

@ -83,7 +83,7 @@ void server_init_atoms ()
server.atom.__SWM_VROOT = XInternAtom(server.dsp, "__SWM_VROOT", False);
server.atom._MOTIF_WM_HINTS = XInternAtom(server.dsp, "_MOTIF_WM_HINTS", False);
server.atom.WM_HINTS = XInternAtom(server.dsp, "WM_HINTS", False);
char *name = g_strdup_printf("_XSETTINGS_S%d", DefaultScreen(server.dsp));
gchar *name = g_strdup_printf("_XSETTINGS_S%d", DefaultScreen(server.dsp));
server.atom._XSETTINGS_SCREEN = XInternAtom(server.dsp, name, False);
g_free(name);
server.atom._XSETTINGS_SETTINGS = XInternAtom(server.dsp, "_XSETTINGS_SETTINGS", False);
@ -116,16 +116,24 @@ void server_init_atoms ()
void cleanup_server()
{
if (server.colormap) XFreeColormap(server.dsp, server.colormap);
if (server.colormap32) XFreeColormap(server.dsp, server.colormap32);
if (server.colormap)
XFreeColormap(server.dsp, server.colormap);
server.colormap = 0;
if (server.colormap32)
XFreeColormap(server.dsp, server.colormap32);
server.colormap32 = 0;
if (server.monitor) {
int i;
for (i=0; i<server.nb_monitor; ++i)
if (server.monitor[i].names)
for (i = 0; i < server.nb_monitor; ++i) {
g_strfreev(server.monitor[i].names);
free(server.monitor);
server.monitor[i].names = NULL;
}
if (server.gc) XFreeGC(server.dsp, server.gc);
free(server.monitor);
server.monitor = NULL;
}
if (server.gc)
XFreeGC(server.dsp, server.gc);
server.gc = NULL;
server.disable_transparency = 0;
}
@ -294,7 +302,7 @@ void get_monitors()
server.monitor[i].y = crtc_info->y;
server.monitor[i].width = crtc_info->width;
server.monitor[i].height = crtc_info->height;
server.monitor[i].names = malloc((crtc_info->noutput+1) * sizeof(char*));
server.monitor[i].names = malloc((crtc_info->noutput+1) * sizeof(gchar*));
for (j=0; j<crtc_info->noutput; ++j) {
XRROutputInfo* output_info = XRRGetOutputInfo(server.dsp, res, crtc_info->outputs[j]);
printf("xRandr: Linking output %s with crtc %d\n", output_info->name, i);

View file

@ -97,7 +97,7 @@ typedef struct Monitor
int y;
int width;
int height;
char** names;
gchar** names;
} Monitor;

View file

@ -100,7 +100,7 @@ void init_systray_panel(void *p)
{
systray.area.parent = p;
systray.area.panel = p;
if (systray.area.bg == 0)
if (!systray.area.bg)
systray.area.bg = &g_array_index(backgrounds, Background, 0);
GSList *l;
@ -308,7 +308,7 @@ void stop_net()
remove_icon((TrayWindow*)systray.list_icons->data);
g_slist_free(systray.list_icons);
systray.list_icons = 0;
systray.list_icons = NULL;
}
if (net_sel_win != None) {

View file

@ -618,7 +618,7 @@ void add_urgent(Task *tsk)
// not yet in the list, so we have to add it
urgent_list = g_slist_prepend(urgent_list, tsk);
if (urgent_timeout == 0)
if (!urgent_timeout)
urgent_timeout = add_timeout(10, 1000, blink_urgent, 0);
Panel *panel = tsk->area.panel;
@ -630,8 +630,8 @@ void add_urgent(Task *tsk)
void del_urgent(Task *tsk)
{
urgent_list = g_slist_remove(urgent_list, tsk);
if (urgent_list == 0) {
if (!urgent_list) {
stop_timeout(urgent_timeout);
urgent_timeout = 0;
urgent_timeout = NULL;
}
}

View file

@ -55,9 +55,9 @@ void free_ptr_array(gpointer data) { g_ptr_array_free(data, 1); }
void default_taskbar()
{
win_to_task_table = 0;
urgent_timeout = 0;
urgent_list = 0;
win_to_task_table = NULL;
urgent_timeout = NULL;
urgent_list = NULL;
taskbar_enabled = 0;
taskbar_distribute_size = 0;
hide_inactive_tasks = 0;
@ -83,13 +83,17 @@ void cleanup_taskbar()
taskbar_remove_task(key, 0, 0);
}
}
g_hash_table_destroy(win_to_task_table);
win_to_task_table = NULL;
}
for (i = 0 ; i < nb_panel; i++) {
panel = &panel1[i];
for (j = 0; j < panel->nb_desktop; j++) {
tskbar = &panel->taskbar[j];
for (k = 0; k < TASKBAR_STATE_COUNT; ++k) {
if (tskbar->state_pix[k]) XFreePixmap(server.dsp, tskbar->state_pix[k]);
if (tskbar->state_pix[k])
XFreePixmap(server.dsp, tskbar->state_pix[k]);
tskbar->state_pix[k] = 0;
}
free_area(&tskbar->area);
// remove taskbar from the panel
@ -97,14 +101,15 @@ void cleanup_taskbar()
}
if (panel->taskbar) {
free(panel->taskbar);
panel->taskbar = 0;
panel->taskbar = NULL;
}
}
if (win_to_task_table) {
g_hash_table_destroy(win_to_task_table);
win_to_task_table = 0;
}
g_slist_free(urgent_list);
urgent_list = NULL;
stop_timeout(urgent_timeout);
urgent_timeout = NULL;
}
@ -131,6 +136,8 @@ void init_taskbar_panel(void *p)
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 == 0)
panel->g_task.area.bg = &g_array_index(backgrounds, Background, 0);

View file

@ -27,7 +27,7 @@ typedef struct {
Area area;
Pixmap state_pix[TASKBAR_STATE_COUNT];
char *name;
gchar *name;
int posy;
} Taskbarname;

View file

@ -41,7 +41,7 @@ Color taskbarname_active_font;
void default_taskbarname()
{
taskbarname_enabled = 0;
taskbarname_font_desc = 0;
taskbarname_font_desc = NULL;
}
@ -51,7 +51,11 @@ void init_taskbarname_panel(void *p)
Taskbar *tskbar;
int j;
if (!taskbarname_enabled) return;
if (!taskbarname_enabled)
return;
if (!taskbarname_font_desc)
taskbarname_font_desc = pango_font_description_from_string(DEFAULT_FONT);
GSList *l, *list = server_get_name_of_desktop();
for (j=0, l=list ; j < panel->nb_desktop ; j++) {
@ -91,14 +95,20 @@ void cleanup_taskbarname()
panel = &panel1[i];
for (j = 0; j < panel->nb_desktop; j++) {
tskbar = &panel->taskbar[j];
if (tskbar->bar_name.name) g_free(tskbar->bar_name.name);
g_free(tskbar->bar_name.name);
tskbar->bar_name.name = NULL;
free_area(&tskbar->bar_name.area);
for (k = 0; k < TASKBAR_STATE_COUNT; ++k) {
if (tskbar->bar_name.state_pix[k]) XFreePixmap(server.dsp, tskbar->bar_name.state_pix[k]);
if (tskbar->bar_name.state_pix[k])
XFreePixmap(server.dsp, tskbar->bar_name.state_pix[k]);
tskbar->bar_name.state_pix[k] = 0;
}
tskbar->area.list = g_slist_remove(tskbar->area.list, &tskbar->bar_name);
}
}
pango_font_description_free(taskbarname_font_desc);
taskbarname_font_desc = NULL;
}

View file

@ -271,12 +271,15 @@ void cleanup()
if (default_icon) {
imlib_context_set_image(default_icon);
imlib_free_image();
default_icon = NULL;
}
imlib_context_disconnect_display();
cleanup_server();
cleanup_timeout();
if (server.dsp) XCloseDisplay(server.dsp);
if (server.dsp)
XCloseDisplay(server.dsp);
server.dsp = NULL;
#ifdef HAVE_SN
if (startup_notifications) {

View file

@ -51,17 +51,20 @@ void default_tooltip()
void cleanup_tooltip()
{
stop_tooltip_timeout();
tooltip_hide(0);
tooltip_copy_text(0);
if (g_tooltip.window) XDestroyWindow(server.dsp, g_tooltip.window);
if (g_tooltip.font_desc) pango_font_description_free(g_tooltip.font_desc);
tooltip_hide(NULL);
tooltip_copy_text(NULL);
if (g_tooltip.window)
XDestroyWindow(server.dsp, g_tooltip.window);
g_tooltip.window = 0;
pango_font_description_free(g_tooltip.font_desc);
g_tooltip.font_desc = NULL;
}
void init_tooltip()
{
if (!g_tooltip.font_desc)
g_tooltip.font_desc = pango_font_description_from_string("sans 10");
g_tooltip.font_desc = pango_font_description_from_string(DEFAULT_FONT);
if (g_tooltip.bg == 0)
g_tooltip.bg = &g_array_index(backgrounds, Background, 0);
@ -72,7 +75,8 @@ void init_tooltip()
attr.background_pixel = 0;
attr.border_pixel = 0;
unsigned long mask = CWEventMask|CWColormap|CWBorderPixel|CWBackPixel|CWOverrideRedirect;
if (g_tooltip.window) XDestroyWindow(server.dsp, g_tooltip.window);
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);
}
@ -296,10 +300,8 @@ void start_hide_timeout()
void stop_tooltip_timeout()
{
if (g_tooltip.timeout) {
stop_timeout(g_tooltip.timeout);
g_tooltip.timeout = 0;
}
g_tooltip.timeout = NULL;
}
@ -309,6 +311,6 @@ void tooltip_copy_text(Area* area)
if (area && area->_get_tooltip_text)
g_tooltip.tooltip_text = strdup(area->_get_tooltip_text(area));
else
g_tooltip.tooltip_text = 0;
g_tooltip.tooltip_text = NULL;
g_tooltip.area = area;
}

View file

@ -456,6 +456,9 @@ void add_area (Area *a)
void free_area (Area *a)
{
if (!a)
return;
GSList *l0;
for (l0 = a->list; l0 ; l0 = l0->next)
free_area (l0->data);

View file

@ -64,8 +64,8 @@ void stop_multi_timeout(timeout* t);
void default_timeout()
{
timeout_list = 0;
multi_timeouts = 0;
timeout_list = NULL;
multi_timeouts = NULL;
}
void cleanup_timeout()
@ -79,7 +79,7 @@ void cleanup_timeout()
}
if (multi_timeouts) {
g_hash_table_destroy(multi_timeouts);
multi_timeouts = 0;
multi_timeouts = NULL;
}
}