Gradients: release memory
@@ -164,7 +164,7 @@ 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; - init_area_gradients(&battery->area); + instantiate_area_gradients(&battery->area); } void battery_init_fonts()
@@ -196,7 +196,7 @@ return;
clock->area.resize_needed = 1; clock->area.on_screen = TRUE; - init_area_gradients(&clock->area); + instantiate_area_gradients(&clock->area); if (time_tooltip_format) { clock->area._get_tooltip_text = clock_get_tooltip;
@@ -182,7 +182,7 @@ execp->backend->dwheel_command);
execp->area.resize_needed = TRUE; execp->area.on_screen = TRUE; - init_area_gradients(&execp->area); + instantiate_area_gradients(&execp->area); if (!execp->backend->timer) execp->backend->timer = add_timeout(10, 0, execp_timer_callback, execp, &execp->backend->timer);
@@ -108,7 +108,7 @@ return;
launcher->area.on_screen = TRUE; panel_refresh = TRUE; - init_area_gradients(&launcher->area); + instantiate_area_gradients(&launcher->area); launcher_load_themes(launcher); launcher_load_icons(launcher);@@ -450,7 +450,7 @@ launcherIcon->config_path = strdup(app->data);
add_area(&launcherIcon->area, (Area *)launcher); launcher->list_icons = g_slist_append(launcher->list_icons, launcherIcon); launcher_reload_icon(launcher, launcherIcon); - init_area_gradients(&launcherIcon->area); + instantiate_area_gradients(&launcherIcon->area); app = g_slist_next(app); } }
@@ -150,6 +150,9 @@ free(panel_window_name);
panel_window_name = NULL; free(panels); panels = NULL; + + free_area(&panel_config.area); + if (backgrounds) g_array_free(backgrounds, TRUE); backgrounds = NULL;@@ -195,6 +198,7 @@
panels = calloc(num_panels, sizeof(Panel)); for (int i = 0; i < num_panels; i++) { memcpy(&panels[i], &panel_config, sizeof(Panel)); + panels[i].area.gradients = g_list_copy(panel_config.area.gradients); } fprintf(stderr,@@ -219,7 +223,7 @@ p->area._resize = resize_panel;
p->area._clear = panel_clear_background; p->separator_list = NULL; init_panel_size_and_position(p); - init_area_gradients(&p->area); + instantiate_area_gradients(&p->area); // add children according to panel_items for (int k = 0; k < strlen(panel_items_order); k++) { if (panel_items_order[k] == 'L')
@@ -84,7 +84,7 @@ separator->area.resize_needed = 1;
separator->area.on_screen = TRUE; separator->area._resize = resize_separator; separator->area._draw_foreground = draw_separator; - init_area_gradients(&separator->area); + instantiate_area_gradients(&separator->area); } }
@@ -123,7 +123,7 @@ systray.area.bg = &g_array_index(backgrounds, Background, 0);
show(&systray.area); schedule_redraw(&systray.area); refresh_systray = TRUE; - init_area_gradients(&systray.area); + instantiate_area_gradients(&systray.area); } gboolean resize_systray(void *obj)
@@ -595,9 +595,9 @@ for (int i = 0; i < task_buttons->len; ++i) {
Task *task1 = g_ptr_array_index(task_buttons, i); task1->current_state = state; task1->area.bg = panels[0].g_task.background[state]; - free_area_gradients(&task1->area); - task1->area.gradients = panels[0].g_task.gradient[state]; - init_area_gradients(&task1->area); + free_area_gradient_instances(&task1->area); + task1->area.gradients = g_list_copy(panels[0].g_task.gradient[state]); + instantiate_area_gradients(&task1->area); schedule_redraw(&task1->area); if (state == TASK_ACTIVE && g_slist_find(urgent_list, task1)) del_urgent(task1);
@@ -116,6 +116,15 @@ g_slist_free(urgent_list);
urgent_list = NULL; stop_timeout(urgent_timeout); + + for (int state = 0; state < TASK_STATE_COUNT; state++) { + g_list_free(panel_config.g_task.gradient[state]); + } + + for (int state = 0; state < TASKBAR_STATE_COUNT; state++) { + g_list_free(panel_config.g_taskbar.gradient[state]); + g_list_free(panel_config.g_taskbar.gradient_name[state]); + } } void init_taskbar()@@ -306,14 +315,14 @@ memcpy(&taskbar->area, &panel->g_taskbar.area, sizeof(Area));
taskbar->desktop = j; if (j == server.desktop) { taskbar->area.bg = panel->g_taskbar.background[TASKBAR_ACTIVE]; - free_area_gradients(&taskbar->area); - taskbar->area.gradients = panel->g_taskbar.gradient[TASKBAR_ACTIVE]; - init_area_gradients(&taskbar->area); + free_area_gradient_instances(&taskbar->area); + taskbar->area.gradients = g_list_copy(panel->g_taskbar.gradient[TASKBAR_ACTIVE]); + instantiate_area_gradients(&taskbar->area); } else { taskbar->area.bg = panel->g_taskbar.background[TASKBAR_NORMAL]; - free_area_gradients(&taskbar->area); - taskbar->area.gradients = panel->g_taskbar.gradient[TASKBAR_NORMAL]; - init_area_gradients(&taskbar->area); + free_area_gradient_instances(&taskbar->area); + taskbar->area.gradients = g_list_copy(panel->g_taskbar.gradient[TASKBAR_NORMAL]); + instantiate_area_gradients(&taskbar->area); } }@@ -486,15 +495,15 @@
void set_taskbar_state(Taskbar *taskbar, TaskbarState state) { taskbar->area.bg = panels[0].g_taskbar.background[state]; - free_area_gradients(&taskbar->area); - taskbar->area.gradients = panels[0].g_taskbar.gradient[state]; - init_area_gradients(&taskbar->area); + free_area_gradient_instances(&taskbar->area); + taskbar->area.gradients = g_list_copy(panels[0].g_taskbar.gradient[state]); + instantiate_area_gradients(&taskbar->area); if (taskbarname_enabled) { taskbar->bar_name.area.bg = panels[0].g_taskbar.background_name[state]; - free_area_gradients(&taskbar->bar_name.area); - taskbar->bar_name.area.gradients = panels[0].g_taskbar.gradient_name[state]; - init_area_gradients(&taskbar->bar_name.area); + free_area_gradient_instances(&taskbar->bar_name.area); + taskbar->bar_name.area.gradients = g_list_copy(panels[0].g_taskbar.gradient_name[state]); + instantiate_area_gradients(&taskbar->bar_name.area); } update_taskbar_visibility(taskbar);
@@ -62,10 +62,10 @@ taskbar->bar_name.area.has_mouse_over_effect = panel_config.mouse_effects;
taskbar->bar_name.area.has_mouse_press_effect = panel_config.mouse_effects; if (j == server.desktop) { taskbar->bar_name.area.bg = panel->g_taskbar.background_name[TASKBAR_ACTIVE]; - taskbar->bar_name.area.gradients = panel->g_taskbar.gradient_name[TASKBAR_ACTIVE]; + taskbar->bar_name.area.gradients = g_list_copy(panel->g_taskbar.gradient_name[TASKBAR_ACTIVE]); } else { taskbar->bar_name.area.bg = panel->g_taskbar.background_name[TASKBAR_NORMAL]; - taskbar->bar_name.area.gradients = panel->g_taskbar.gradient_name[TASKBAR_NORMAL]; + taskbar->bar_name.area.gradients = g_list_copy(panel->g_taskbar.gradient_name[TASKBAR_NORMAL]); } // use desktop number if name is missing@@ -78,7 +78,7 @@ }
// append the name at the beginning of taskbar taskbar->area.children = g_list_append(taskbar->area.children, &taskbar->bar_name); - init_area_gradients(&taskbar->bar_name.area); + instantiate_area_gradients(&taskbar->bar_name.area); } for (l = list; l; l = l->next)
@@ -536,7 +536,7 @@ {
Area *area = (Area *)a; Area *parent = (Area *)area->parent; - free_area_gradients(a); + free_area_gradient_instances(a); if (parent) { parent->children = g_list_remove(parent->children, area);@@ -589,7 +589,11 @@ }
if (mouse_over_area == a) { mouse_over_area = NULL; } - free_area_gradients(a); + free_area_gradient_instances(a); + if (debug_gradients) + fprintf(stderr, YELLOW "freeing gradient list %p" RESET "\n", (void*)a->gradients); + g_list_free(a->gradients); + a->gradients = NULL; } void mouse_over(Area *area, int pressed)@@ -887,7 +891,7 @@ instantiate_gradient_offsets(gi, control->offsets_y);
instantiate_gradient_offsets(gi, control->offsets_r); } -void free_gradient_point(GradientInstance *gi, ControlPoint *control) +void free_gradient_instance_point(GradientInstance *gi, ControlPoint *control) { free_gradient_offsets(gi, &control->offsets_x); free_gradient_offsets(gi, &control->offsets_y);@@ -904,18 +908,18 @@ instantiate_gradient_point(gi, &g->from);
instantiate_gradient_point(gi, &g->to); } -void free_gradient(GradientInstance *gi) +void free_gradient_instance(GradientInstance *gi) { if (gi->pattern) { cairo_pattern_destroy(gi->pattern); gi->pattern = NULL; } - free_gradient_point(gi, &gi->gradient_class->from); - free_gradient_point(gi, &gi->gradient_class->to); + free_gradient_instance_point(gi, &gi->gradient_class->from); + free_gradient_instance_point(gi, &gi->gradient_class->to); gi->gradient_class = NULL; } -void init_area_gradients(Area *area) +void instantiate_area_gradients(Area *area) { g_assert_null(area->gradient_instances); if (debug_gradients)@@ -928,13 +932,13 @@ area->gradient_instances = g_list_append(area->gradient_instances, gi);
} } -void free_area_gradients(Area *area) +void free_area_gradient_instances(Area *area) { if (debug_gradients) fprintf(stderr, "Freeing gradients for area %s\n", area->name); for (GList *l = area->gradient_instances; l; l = l->next) { GradientInstance *gi = (GradientInstance *)l->data; - free_gradient(gi); + free_gradient_instance(gi); } g_list_free_full(area->gradient_instances, free); area->gradient_instances = NULL;
@@ -311,8 +311,8 @@ // Useful so that a click at the edge of the screen is still handled by task buttons etc., even if technically
// they are outside the drawing area of the button. gboolean full_width_area_is_under_mouse(void *obj, int x, int y); -void init_area_gradients(Area *area); -void free_area_gradients(Area *area); +void instantiate_area_gradients(Area *area); +void free_area_gradient_instances(Area *area); void area_dump_geometry(Area *area, int indent);