Changes from Owen Taylor which allow GIMP to compile with

new GTK changes.  ChangeLog is more specific.

-Shawn
This commit is contained in:
Shawn Amundson 1997-12-18 06:30:11 +00:00
parent 92f0e489b6
commit 81eb53df7b
41 changed files with 165 additions and 102 deletions

View File

@ -1,3 +1,24 @@
Wed Dec 17 23:51:30 CST 1997 Shawn T. Amundson <amundson@gimp.org>
* All these changes are from Owen Taylor to make GIMP work
with reference changes make in GTK. This mainly affects
functions gtk_pixmap_destroy, gdk_colormap_destroy,
gdk_font(set)_free; they have disappeared and where
changed to *_unref. These simple changes affected:
app/about_dialog.c, app/channels_dialog.c,
app/curves.c, app/gradient.c, app/layer_select.c,
app/text_tool.c, plug-ins/gfig/gfig.c,
plug-ins/ifscompose/ifscompose.c,
plug-ins/libgck/gck/gckcolor.c,
plug-ins/libgck/gck/gcknotebook.c
* app/color_area.c: check for initial expose before drawing
* app/disp_callbacks.c: gc for scrolling
* app/gdisplay.c: destroy gc, event now pointer
* app/scroll.c: use scroll_gc, make sure graphics expose events
are processed before scrolling again
* gimp/app/gdisplay.h: add scroll_gc to struct
Wed Dec 17 23:23:05 1997 Ray Lehtiniemi <rayl@netrover.com>
* app/brush_select.c (brush_popup_open): fix memory leak

View File

@ -155,7 +155,7 @@ about_dialog_create (int timeout)
style = gtk_style_new ();
gdk_font_free (style->font);
gdk_font_unref (style->font);
style->font = gdk_font_load ("-Adobe-Helvetica-Medium-R-Normal--*-140-*-*-*-*-*-*");
gtk_widget_push_style (style);

View File

@ -404,7 +404,7 @@ curves_free ()
curves_dialog->image_map = NULL;
}
if (curves_dialog->pixmap)
gdk_pixmap_destroy (curves_dialog->pixmap);
gdk_pixmap_unref (curves_dialog->pixmap);
gtk_widget_destroy (curves_dialog->shell);
}
}

View File

@ -1048,7 +1048,7 @@ static void
channel_widget_delete (ChannelWidget *channel_widget)
{
if (channel_widget->channel_pixmap)
gdk_pixmap_destroy (channel_widget->channel_pixmap);
gdk_pixmap_unref (channel_widget->channel_pixmap);
/* Remove the channel widget from the list */
channelsD->channel_widgets = remove_from_list (channelsD->channel_widgets, channel_widget);

View File

@ -83,6 +83,10 @@ color_area_draw (void)
int def_width, def_height;
int swap_width, swap_height;
if (!color_area_pixmap) /* we haven't gotten initial expose yet,
* no point in drawing anything */
return;
gdk_window_get_size (color_area_pixmap, &width, &height);
win_bg = &(color_area->style->bg[GTK_STATE_NORMAL]);

View File

@ -191,6 +191,9 @@ gdisplay_delete (GDisplay *gdisp)
/* free the selection structure */
selection_free (gdisp->select);
if (gdisp->scroll_gc)
gdk_gc_destroy (gdisp->scroll_gc);
/* free the area lists */
gdisplay_free_area_list (gdisp->update_areas);
@ -1084,12 +1087,13 @@ gdisplay_active ()
{
GtkWidget *event_widget;
GtkWidget *toplevel_widget;
GdkEvent event;
GdkEvent *event;
GDisplay *gdisp;
/* If the popup shell is valid, then get the gdisplay associated with that shell */
gtk_get_current_event (&event);
event_widget = gtk_get_event_widget (&event);
event = gtk_get_current_event ();
event_widget = gtk_get_event_widget (event);
gdk_event_free (event);
toplevel_widget = gtk_widget_get_toplevel (event_widget);
gdisp = g_hash_table_lookup (display_ht, toplevel_widget);

View File

@ -84,6 +84,8 @@ struct _GDisplay
Selection *select; /* Selection object */
GdkGC *scroll_gc; /* GC for scrolling */
link_ptr update_areas; /* Update areas list */
link_ptr display_areas; /* Display areas list */

View File

@ -404,7 +404,7 @@ curves_free ()
curves_dialog->image_map = NULL;
}
if (curves_dialog->pixmap)
gdk_pixmap_destroy (curves_dialog->pixmap);
gdk_pixmap_unref (curves_dialog->pixmap);
gtk_widget_destroy (curves_dialog->shell);
}
}

View File

@ -155,7 +155,7 @@ about_dialog_create (int timeout)
style = gtk_style_new ();
gdk_font_free (style->font);
gdk_font_unref (style->font);
style->font = gdk_font_load ("-Adobe-Helvetica-Medium-R-Normal--*-140-*-*-*-*-*-*");
gtk_widget_push_style (style);

View File

@ -97,6 +97,11 @@ gdisplay_canvas_events (GtkWidget *canvas,
gdisp->disp_width = gdisp->canvas->allocation.width;
gdisp->disp_height = gdisp->canvas->allocation.height;
/* create GC for scrolling */
gdisp->scroll_gc = gdk_gc_new (gdisp->canvas->window);
gdk_gc_set_exposures (gdisp->scroll_gc, TRUE);
/* set up the scrollbar observers */
gtk_signal_connect (GTK_OBJECT (gdisp->hsbdata), "value_changed",
(GtkSignalFunc) scrollbar_horz_update,
@ -257,24 +262,6 @@ gdisplay_canvas_events (GtkWidget *canvas,
grab_and_scroll (gdisp, mevent);
flush = FALSE;
while (gdk_event_get (&tmp_event, expose_predicate, canvas->window))
{
flush = TRUE;
x1 = tmp_event.expose.area.x;
y1 = tmp_event.expose.area.y;
x2 = (x1 + tmp_event.expose.area.width);
y2 = (y1 + tmp_event.expose.area.height);
x1 = BOUNDS (x1, 0, gdisp->disp_width);
y1 = BOUNDS (y1, 0, gdisp->disp_height);
x2 = BOUNDS (x2, 0, gdisp->disp_width);
y2 = BOUNDS (y2, 0, gdisp->disp_height);
gdisplay_expose_area (gdisp, x1, y1, (x2 - x1), (y2 - y1));
}
if (flush)
gdisplays_flush ();
}

View File

@ -97,6 +97,11 @@ gdisplay_canvas_events (GtkWidget *canvas,
gdisp->disp_width = gdisp->canvas->allocation.width;
gdisp->disp_height = gdisp->canvas->allocation.height;
/* create GC for scrolling */
gdisp->scroll_gc = gdk_gc_new (gdisp->canvas->window);
gdk_gc_set_exposures (gdisp->scroll_gc, TRUE);
/* set up the scrollbar observers */
gtk_signal_connect (GTK_OBJECT (gdisp->hsbdata), "value_changed",
(GtkSignalFunc) scrollbar_horz_update,
@ -257,24 +262,6 @@ gdisplay_canvas_events (GtkWidget *canvas,
grab_and_scroll (gdisp, mevent);
flush = FALSE;
while (gdk_event_get (&tmp_event, expose_predicate, canvas->window))
{
flush = TRUE;
x1 = tmp_event.expose.area.x;
y1 = tmp_event.expose.area.y;
x2 = (x1 + tmp_event.expose.area.width);
y2 = (y1 + tmp_event.expose.area.height);
x1 = BOUNDS (x1, 0, gdisp->disp_width);
y1 = BOUNDS (y1, 0, gdisp->disp_height);
x2 = BOUNDS (x2, 0, gdisp->disp_width);
y2 = BOUNDS (y2, 0, gdisp->disp_height);
gdisplay_expose_area (gdisp, x1, y1, (x2 - x1), (y2 - y1));
}
if (flush)
gdisplays_flush ();
}

View File

@ -136,6 +136,7 @@ scroll_display (GDisplay *gdisp,
int old_x, old_y;
int src_x, src_y;
int dest_x, dest_y;
GdkEvent *event;
old_x = gdisp->offset_x;
old_y = gdisp->offset_y;
@ -170,7 +171,7 @@ scroll_display (GDisplay *gdisp,
gdisp->offset_y += y_offset;
gdk_draw_pixmap (gdisp->canvas->window,
gdisp->select->gc_in,
gdisp->scroll_gc,
gdisp->canvas->window,
src_x, src_y,
dest_x, dest_y,
@ -201,6 +202,22 @@ scroll_display (GDisplay *gdisp,
if (x_offset || y_offset)
gdisplays_flush ();
/* Make sure graphics expose events are processed before scrolling
* again */
while ((event = gdk_event_get_graphics_expose (gdisp->canvas->window))
!= NULL)
{
gtk_widget_event (gdisp->canvas, event);
if (event->expose.count == 0)
{
gdk_event_free (event);
break;
}
gdk_event_free (event);
}
return 1;
}

View File

@ -191,6 +191,9 @@ gdisplay_delete (GDisplay *gdisp)
/* free the selection structure */
selection_free (gdisp->select);
if (gdisp->scroll_gc)
gdk_gc_destroy (gdisp->scroll_gc);
/* free the area lists */
gdisplay_free_area_list (gdisp->update_areas);
@ -1084,12 +1087,13 @@ gdisplay_active ()
{
GtkWidget *event_widget;
GtkWidget *toplevel_widget;
GdkEvent event;
GdkEvent *event;
GDisplay *gdisp;
/* If the popup shell is valid, then get the gdisplay associated with that shell */
gtk_get_current_event (&event);
event_widget = gtk_get_event_widget (&event);
event = gtk_get_current_event ();
event_widget = gtk_get_event_widget (event);
gdk_event_free (event);
toplevel_widget = gtk_widget_get_toplevel (event_widget);
gdisp = g_hash_table_lookup (display_ht, toplevel_widget);

View File

@ -84,6 +84,8 @@ struct _GDisplay
Selection *select; /* Selection object */
GdkGC *scroll_gc; /* GC for scrolling */
link_ptr update_areas; /* Update areas list */
link_ptr display_areas; /* Display areas list */

View File

@ -97,6 +97,11 @@ gdisplay_canvas_events (GtkWidget *canvas,
gdisp->disp_width = gdisp->canvas->allocation.width;
gdisp->disp_height = gdisp->canvas->allocation.height;
/* create GC for scrolling */
gdisp->scroll_gc = gdk_gc_new (gdisp->canvas->window);
gdk_gc_set_exposures (gdisp->scroll_gc, TRUE);
/* set up the scrollbar observers */
gtk_signal_connect (GTK_OBJECT (gdisp->hsbdata), "value_changed",
(GtkSignalFunc) scrollbar_horz_update,
@ -257,24 +262,6 @@ gdisplay_canvas_events (GtkWidget *canvas,
grab_and_scroll (gdisp, mevent);
flush = FALSE;
while (gdk_event_get (&tmp_event, expose_predicate, canvas->window))
{
flush = TRUE;
x1 = tmp_event.expose.area.x;
y1 = tmp_event.expose.area.y;
x2 = (x1 + tmp_event.expose.area.width);
y2 = (y1 + tmp_event.expose.area.height);
x1 = BOUNDS (x1, 0, gdisp->disp_width);
y1 = BOUNDS (y1, 0, gdisp->disp_height);
x2 = BOUNDS (x2, 0, gdisp->disp_width);
y2 = BOUNDS (y2, 0, gdisp->disp_height);
gdisplay_expose_area (gdisp, x1, y1, (x2 - x1), (y2 - y1));
}
if (flush)
gdisplays_flush ();
}

View File

@ -284,7 +284,7 @@ layer_select_set_gimage (LayerSelect *layer_select,
if (layer_select->layer_pixmap)
{
gdk_pixmap_destroy (layer_select->layer_pixmap);
gdk_pixmap_unref (layer_select->layer_pixmap);
layer_select->layer_pixmap = NULL;
}
}

View File

@ -136,6 +136,7 @@ scroll_display (GDisplay *gdisp,
int old_x, old_y;
int src_x, src_y;
int dest_x, dest_y;
GdkEvent *event;
old_x = gdisp->offset_x;
old_y = gdisp->offset_y;
@ -170,7 +171,7 @@ scroll_display (GDisplay *gdisp,
gdisp->offset_y += y_offset;
gdk_draw_pixmap (gdisp->canvas->window,
gdisp->select->gc_in,
gdisp->scroll_gc,
gdisp->canvas->window,
src_x, src_y,
dest_x, dest_y,
@ -201,6 +202,22 @@ scroll_display (GDisplay *gdisp,
if (x_offset || y_offset)
gdisplays_flush ();
/* Make sure graphics expose events are processed before scrolling
* again */
while ((event = gdk_event_get_graphics_expose (gdisp->canvas->window))
!= NULL)
{
gtk_widget_event (gdisp->canvas, event);
if (event->expose.count == 0)
{
gdk_event_free (event);
break;
}
gdk_event_free (event);
}
return 1;
}

View File

@ -191,6 +191,9 @@ gdisplay_delete (GDisplay *gdisp)
/* free the selection structure */
selection_free (gdisp->select);
if (gdisp->scroll_gc)
gdk_gc_destroy (gdisp->scroll_gc);
/* free the area lists */
gdisplay_free_area_list (gdisp->update_areas);
@ -1084,12 +1087,13 @@ gdisplay_active ()
{
GtkWidget *event_widget;
GtkWidget *toplevel_widget;
GdkEvent event;
GdkEvent *event;
GDisplay *gdisp;
/* If the popup shell is valid, then get the gdisplay associated with that shell */
gtk_get_current_event (&event);
event_widget = gtk_get_event_widget (&event);
event = gtk_get_current_event ();
event_widget = gtk_get_event_widget (event);
gdk_event_free (event);
toplevel_widget = gtk_widget_get_toplevel (event_widget);
gdisp = g_hash_table_lookup (display_ht, toplevel_widget);

View File

@ -84,6 +84,8 @@ struct _GDisplay
Selection *select; /* Selection object */
GdkGC *scroll_gc; /* GC for scrolling */
link_ptr update_areas; /* Update areas list */
link_ptr display_areas; /* Display areas list */

View File

@ -2598,7 +2598,7 @@ control_update(int recalculate)
if (!g_editor->control_pixmap || (cwidth != pwidth) || (cheight != pheight)) {
if (g_editor->control_pixmap)
gdk_pixmap_destroy(g_editor->control_pixmap);
gdk_pixmap_unref(g_editor->control_pixmap);
g_editor->control_pixmap = gdk_pixmap_new(g_editor->control->window, cwidth, cheight, -1);

View File

@ -2598,7 +2598,7 @@ control_update(int recalculate)
if (!g_editor->control_pixmap || (cwidth != pwidth) || (cheight != pheight)) {
if (g_editor->control_pixmap)
gdk_pixmap_destroy(g_editor->control_pixmap);
gdk_pixmap_unref(g_editor->control_pixmap);
g_editor->control_pixmap = gdk_pixmap_new(g_editor->control->window, cwidth, cheight, -1);

View File

@ -155,7 +155,7 @@ about_dialog_create (int timeout)
style = gtk_style_new ();
gdk_font_free (style->font);
gdk_font_unref (style->font);
style->font = gdk_font_load ("-Adobe-Helvetica-Medium-R-Normal--*-140-*-*-*-*-*-*");
gtk_widget_push_style (style);

View File

@ -1048,7 +1048,7 @@ static void
channel_widget_delete (ChannelWidget *channel_widget)
{
if (channel_widget->channel_pixmap)
gdk_pixmap_destroy (channel_widget->channel_pixmap);
gdk_pixmap_unref (channel_widget->channel_pixmap);
/* Remove the channel widget from the list */
channelsD->channel_widgets = remove_from_list (channelsD->channel_widgets, channel_widget);

View File

@ -83,6 +83,10 @@ color_area_draw (void)
int def_width, def_height;
int swap_width, swap_height;
if (!color_area_pixmap) /* we haven't gotten initial expose yet,
* no point in drawing anything */
return;
gdk_window_get_size (color_area_pixmap, &width, &height);
win_bg = &(color_area->style->bg[GTK_STATE_NORMAL]);

View File

@ -2598,7 +2598,7 @@ control_update(int recalculate)
if (!g_editor->control_pixmap || (cwidth != pwidth) || (cheight != pheight)) {
if (g_editor->control_pixmap)
gdk_pixmap_destroy(g_editor->control_pixmap);
gdk_pixmap_unref(g_editor->control_pixmap);
g_editor->control_pixmap = gdk_pixmap_new(g_editor->control->window, cwidth, cheight, -1);

View File

@ -284,7 +284,7 @@ layer_select_set_gimage (LayerSelect *layer_select,
if (layer_select->layer_pixmap)
{
gdk_pixmap_destroy (layer_select->layer_pixmap);
gdk_pixmap_unref (layer_select->layer_pixmap);
layer_select->layer_pixmap = NULL;
}
}

View File

@ -1986,9 +1986,9 @@ static void
layer_widget_delete (LayerWidget *layer_widget)
{
if (layer_widget->layer_pixmap)
gdk_pixmap_destroy (layer_widget->layer_pixmap);
gdk_pixmap_unref (layer_widget->layer_pixmap);
if (layer_widget->mask_pixmap)
gdk_pixmap_destroy (layer_widget->mask_pixmap);
gdk_pixmap_unref (layer_widget->mask_pixmap);
/* Remove the layer widget from the list */
layersD->layer_widgets = remove_from_list (layersD->layer_widgets, layer_widget);

View File

@ -284,7 +284,7 @@ layer_select_set_gimage (LayerSelect *layer_select,
if (layer_select->layer_pixmap)
{
gdk_pixmap_destroy (layer_select->layer_pixmap);
gdk_pixmap_unref (layer_select->layer_pixmap);
layer_select->layer_pixmap = NULL;
}
}

View File

@ -1986,9 +1986,9 @@ static void
layer_widget_delete (LayerWidget *layer_widget)
{
if (layer_widget->layer_pixmap)
gdk_pixmap_destroy (layer_widget->layer_pixmap);
gdk_pixmap_unref (layer_widget->layer_pixmap);
if (layer_widget->mask_pixmap)
gdk_pixmap_destroy (layer_widget->mask_pixmap);
gdk_pixmap_unref (layer_widget->mask_pixmap);
/* Remove the layer widget from the list */
layersD->layer_widgets = remove_from_list (layersD->layer_widgets, layer_widget);

View File

@ -136,6 +136,7 @@ scroll_display (GDisplay *gdisp,
int old_x, old_y;
int src_x, src_y;
int dest_x, dest_y;
GdkEvent *event;
old_x = gdisp->offset_x;
old_y = gdisp->offset_y;
@ -170,7 +171,7 @@ scroll_display (GDisplay *gdisp,
gdisp->offset_y += y_offset;
gdk_draw_pixmap (gdisp->canvas->window,
gdisp->select->gc_in,
gdisp->scroll_gc,
gdisp->canvas->window,
src_x, src_y,
dest_x, dest_y,
@ -201,6 +202,22 @@ scroll_display (GDisplay *gdisp,
if (x_offset || y_offset)
gdisplays_flush ();
/* Make sure graphics expose events are processed before scrolling
* again */
while ((event = gdk_event_get_graphics_expose (gdisp->canvas->window))
!= NULL)
{
gtk_widget_event (gdisp->canvas, event);
if (event->expose.count == 0)
{
gdk_event_free (event);
break;
}
gdk_event_free (event);
}
return 1;
}

View File

@ -342,7 +342,7 @@ text_resize_text_widget (TextTool *text_tool)
GtkStyle *style;
style = gtk_style_new ();
gdk_font_free (style->font);
gdk_font_unref (style->font);
style->font = text_tool->font;
gdk_font_ref (style->font);
@ -1381,7 +1381,7 @@ text_load_font (TextTool *text_tool)
if (font)
{
if (text_tool->font)
gdk_font_free (text_tool->font);
gdk_font_unref (text_tool->font);
text_tool->font = font;
text_resize_text_widget (text_tool);
@ -1681,13 +1681,13 @@ text_render (GImage *gimage,
}
/* free the pixmap */
gdk_pixmap_destroy (pixmap);
gdk_pixmap_unref (pixmap);
/* free the gc */
gdk_gc_destroy (gc);
/* free the font */
gdk_font_free (font);
gdk_font_unref (font);
return layer;
}

View File

@ -404,7 +404,7 @@ curves_free ()
curves_dialog->image_map = NULL;
}
if (curves_dialog->pixmap)
gdk_pixmap_destroy (curves_dialog->pixmap);
gdk_pixmap_unref (curves_dialog->pixmap);
gtk_widget_destroy (curves_dialog->shell);
}
}

View File

@ -404,7 +404,7 @@ curves_free ()
curves_dialog->image_map = NULL;
}
if (curves_dialog->pixmap)
gdk_pixmap_destroy (curves_dialog->pixmap);
gdk_pixmap_unref (curves_dialog->pixmap);
gtk_widget_destroy (curves_dialog->shell);
}
}

View File

@ -342,7 +342,7 @@ text_resize_text_widget (TextTool *text_tool)
GtkStyle *style;
style = gtk_style_new ();
gdk_font_free (style->font);
gdk_font_unref (style->font);
style->font = text_tool->font;
gdk_font_ref (style->font);
@ -1381,7 +1381,7 @@ text_load_font (TextTool *text_tool)
if (font)
{
if (text_tool->font)
gdk_font_free (text_tool->font);
gdk_font_unref (text_tool->font);
text_tool->font = font;
text_resize_text_widget (text_tool);
@ -1681,13 +1681,13 @@ text_render (GImage *gimage,
}
/* free the pixmap */
gdk_pixmap_destroy (pixmap);
gdk_pixmap_unref (pixmap);
/* free the gc */
gdk_gc_destroy (gc);
/* free the font */
gdk_font_free (font);
gdk_font_unref (font);
return layer;
}

View File

@ -342,7 +342,7 @@ text_resize_text_widget (TextTool *text_tool)
GtkStyle *style;
style = gtk_style_new ();
gdk_font_free (style->font);
gdk_font_unref (style->font);
style->font = text_tool->font;
gdk_font_ref (style->font);
@ -1381,7 +1381,7 @@ text_load_font (TextTool *text_tool)
if (font)
{
if (text_tool->font)
gdk_font_free (text_tool->font);
gdk_font_unref (text_tool->font);
text_tool->font = font;
text_resize_text_widget (text_tool);
@ -1681,13 +1681,13 @@ text_render (GImage *gimage,
}
/* free the pixmap */
gdk_pixmap_destroy (pixmap);
gdk_pixmap_unref (pixmap);
/* free the gc */
gdk_gc_destroy (gc);
/* free the font */
gdk_font_free (font);
gdk_font_unref (font);
return layer;
}

View File

@ -2598,7 +2598,7 @@ control_update(int recalculate)
if (!g_editor->control_pixmap || (cwidth != pwidth) || (cheight != pheight)) {
if (g_editor->control_pixmap)
gdk_pixmap_destroy(g_editor->control_pixmap);
gdk_pixmap_unref(g_editor->control_pixmap);
g_editor->control_pixmap = gdk_pixmap_new(g_editor->control->window, cwidth, cheight, -1);

View File

@ -83,6 +83,10 @@ color_area_draw (void)
int def_width, def_height;
int swap_width, swap_height;
if (!color_area_pixmap) /* we haven't gotten initial expose yet,
* no point in drawing anything */
return;
gdk_window_get_size (color_area_pixmap, &width, &height);
win_bg = &(color_area->style->bg[GTK_STATE_NORMAL]);

View File

@ -1932,7 +1932,7 @@ gfig_obj_modified(GFIGOBJ *obj,gint stat_type)
gfig_set_pixmap(obj,blank_xpm);
/* Remove old */
gdk_pixmap_destroy(gdk_pix);
gdk_pixmap_unref(gdk_pix);
gtk_widget_draw(GTK_WIDGET(obj->list_item),NULL);
}

View File

@ -1557,7 +1557,7 @@ design_area_configure(GtkWidget *widget, GdkEventConfigure *event)
if (ifsDesign->pixmap)
{
gdk_pixmap_destroy(ifsDesign->pixmap);
gdk_pixmap_unref(ifsDesign->pixmap);
}
ifsDesign->pixmap = gdk_pixmap_new(widget->window,
widget->allocation.width,

View File

@ -992,7 +992,7 @@ void gck_visualinfo_destroy(GckVisualInfo * visinfo)
g_function_enter("gck_visualinfo_destroy");
g_assert(visinfo!=NULL);
gdk_colormap_destroy(visinfo->colormap);
gdk_colormap_unref(visinfo->colormap);
free(visinfo);

View File

@ -423,7 +423,7 @@ void gck_notebook_destroy(GckNoteBook *notebook)
if (page->tab->image!=NULL)
gdk_image_destroy(page->tab->image);
if (page->tab->pixmap!=NULL)
gdk_pixmap_destroy(page->tab->pixmap);
gdk_pixmap_unref(page->tab->pixmap);
free(page->tab);
}
free(page);