changeset 818:c17634e2b303

More safety checks in the drawing functions.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sat, 26 Mar 2011 05:24:01 +0000
parents 2d0681b8d8f6
children 2dd7638a7719
files gtk3/dw.c
diffstat 1 files changed, 59 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/gtk3/dw.c	Sat Mar 26 05:14:54 2011 +0000
+++ b/gtk3/dw.c	Sat Mar 26 05:24:01 2011 +0000
@@ -6591,7 +6591,16 @@
 
    DW_MUTEX_LOCK;
    if(handle)
-      cr = gdk_cairo_create(gtk_widget_get_window(handle));
+   {
+      GdkWindow *window = gtk_widget_get_window(handle);
+      /* Safety check for non-existant windows */
+      if(!window || !GDK_IS_WINDOW(window))
+      {
+         DW_MUTEX_UNLOCK;
+         return;
+      }
+      cr = gdk_cairo_create(window);
+   }
    else if(pixmap)
       cr = cairo_create(pixmap->image);
    if(cr)
@@ -6623,7 +6632,16 @@
 
    DW_MUTEX_LOCK;
    if(handle)
-      cr = gdk_cairo_create(gtk_widget_get_window(handle));
+   {
+      GdkWindow *window = gtk_widget_get_window(handle);
+      /* Safety check for non-existant windows */
+      if(!window || !GDK_IS_WINDOW(window))
+      {
+         DW_MUTEX_UNLOCK;
+         return;
+      }
+      cr = gdk_cairo_create(window);
+   }
    else if(pixmap)
       cr = cairo_create(pixmap->image);
    if(cr)
@@ -6657,7 +6675,16 @@
 
    DW_MUTEX_LOCK;
    if(handle)
-      cr = gdk_cairo_create(gtk_widget_get_window(handle));
+   {
+      GdkWindow *window = gtk_widget_get_window(handle);
+      /* Safety check for non-existant windows */
+      if(!window || !GDK_IS_WINDOW(window))
+      {
+         DW_MUTEX_UNLOCK;
+         return;
+      }
+      cr = gdk_cairo_create(window);
+   }
    else if(pixmap)
       cr = cairo_create(pixmap->image);
    if(cr)
@@ -6696,7 +6723,16 @@
 
    DW_MUTEX_LOCK;
    if(handle)
-      cr = gdk_cairo_create(gtk_widget_get_window(handle));
+   {
+      GdkWindow *window = gtk_widget_get_window(handle);
+      /* Safety check for non-existant windows */
+      if(!window || !GDK_IS_WINDOW(window))
+      {
+         DW_MUTEX_UNLOCK;
+         return;
+      }
+      cr = gdk_cairo_create(window);
+   }
    else if(pixmap)
       cr = cairo_create(pixmap->image);
    if(cr)
@@ -6738,7 +6774,14 @@
    DW_MUTEX_LOCK;
    if(handle)
    {
-      cr = gdk_cairo_create(gtk_widget_get_window(handle));
+      GdkWindow *window = gtk_widget_get_window(handle);
+      /* Safety check for non-existant windows */
+      if(!window || !GDK_IS_WINDOW(window))
+      {
+         DW_MUTEX_UNLOCK;
+         return;
+      }
+      cr = gdk_cairo_create(window);
       fontname = (char *)g_object_get_data(G_OBJECT(handle), "_dw_fontname");
    }
    else if(pixmap)
@@ -7043,6 +7086,7 @@
 
    DW_MUTEX_LOCK;
    g_object_unref(G_OBJECT(pixmap->pixbuf));
+   cairo_surface_destroy(pixmap->image);
    free(pixmap);
    DW_MUTEX_UNLOCK;
 }
@@ -7076,7 +7120,16 @@
 
    DW_MUTEX_LOCK;
    if(dest)
-      cr = gdk_cairo_create(gtk_widget_get_window(dest));
+   {
+      GdkWindow *window = gtk_widget_get_window(dest);
+      /* Safety check for non-existant windows */
+      if(!window || !GDK_IS_WINDOW(window))
+      {
+         DW_MUTEX_UNLOCK;
+         return;
+      }
+      cr = gdk_cairo_create(window);
+   }
    else if(destp)
       cr = cairo_create(destp->image);