]> Pileus Git - ~andy/gtk/commitdiff
MS Windows engine: draw elements in the right place.
authorMartin Schlemmer <11285613@nwu.ac.za>
Fri, 3 Sep 2010 20:18:21 +0000 (22:18 +0200)
committerFridrich Štrba <fridrich.strba@bluewin.ch>
Fri, 3 Sep 2010 20:19:39 +0000 (22:19 +0200)
Work in progress, still remains to be solved the problem of clipping.

modules/engines/ms-windows/xp_theme.c
modules/engines/ms-windows/xp_theme.h

index d23dfea2d84ec4ae96c5a2096dacb6796192ca04..258f4183fbb9d470aeb3a924f8d6b487d6b59793 100755 (executable)
@@ -900,66 +900,54 @@ get_window_dc (GtkStyle *style,
               gint x, gint y, gint width, gint height,
               RECT *rect_out)
 {
-#if 0
-  GdkDrawable *drawable = NULL;
-  GdkGC *gc = style->dark_gc[state_type];
-  gint x_offset, y_offset;
-  
-  dc_info_out->data = NULL;
+  cairo_t *cr;
+  cairo_surface_t *surface;
+  HDC dc;
+  gint x_offset = 0, y_offset = 0;
+  double x_off, y_off;
+
+  dc_info_out->cr = NULL;
+  dc_info_out->dc = NULL;
   
-  drawable = gdk_win32_begin_direct_draw_libgtk_only (window,
-                                                     gc, &dc_info_out->data,
-                                                     &x_offset, &y_offset);
-  if (!drawable)
+  cr = gdk_cairo_create (window);
+  if (!cr)
     return NULL;
 
-  rect_out->left = x - x_offset;
-  rect_out->top = y - y_offset;
-  rect_out->right = rect_out->left + width;
-  rect_out->bottom = rect_out->top + height;
+  surface = cairo_get_target (cr);
+  cairo_surface_get_device_offset (surface, &x_off, &y_off);
+  cairo_surface_flush (surface);
   
-  dc_info_out->drawable = drawable;
-  dc_info_out->gc = gc;
-  dc_info_out->x_offset = x_offset;
-  dc_info_out->y_offset = y_offset;
+  dc = cairo_win32_surface_get_dc (surface);
+  if (!dc)
+   return NULL;
   
-  return gdk_win32_hdc_get (drawable, gc, 0);
-#else
-  cairo_t *cr;
-  cairo_surface_t *crs;
-  gint x_offset, y_offset;
-
-  cr = gdk_cairo_create (window);
-  crs = cairo_get_target (cr);
-  x_offset = 0;
-  y_offset = 0;
+  x_offset = -x_off;
+  y_offset = -y_off;
 
-
-  dc_info_out->data = NULL;
-  
   rect_out->left = x - x_offset;
   rect_out->top = y - y_offset;
   rect_out->right = rect_out->left + width;
   rect_out->bottom = rect_out->top + height;
   
   dc_info_out->cr = cr;
+  dc_info_out->dc = dc;
   dc_info_out->x_offset = x_offset;
   dc_info_out->y_offset = y_offset;
   
-  return cairo_win32_surface_get_dc (crs);
-#endif
+  return dc;
 }
 
 void
 release_window_dc (XpDCInfo *dc_info)
 {
-#if 0
-  gdk_win32_hdc_release (dc_info->drawable, dc_info->gc, 0);
+  if (!dc_info->cr || !dc_info->dc)
+    return;
 
-  gdk_win32_end_direct_draw_libgtk_only (dc_info->data);
-#else
+  ReleaseDC (NULL, dc_info->dc);
   cairo_destroy (dc_info->cr);
-#endif
+  
+  dc_info->cr = NULL;
+  dc_info->dc = NULL;
 }
 
 gboolean
@@ -1014,7 +1002,7 @@ xp_theme_draw (GdkWindow *win, XpThemeElement element, GtkStyle *style,
                              part_state, &rect, pClip);
 
   release_window_dc (&dc_info);
-  
+
   return TRUE;
 }
 
index 4e2a1f14041fde268922bc9840866e93690664d4..0ee9830dfc92577497f2f8fca9115615355c67ae 100755 (executable)
@@ -115,19 +115,10 @@ typedef enum
 
 typedef struct
 {
-#if 0
-  GdkDrawable *drawable;
-  GdkGC *gc;
-#else
   cairo_t *cr;
-  cairo_surface_t *crs;
-#endif
-  
+  HDC dc;
   gint x_offset;
   gint y_offset;
-  
-  /*< private >*/
-  gpointer data;
 } XpDCInfo;
 
 HDC get_window_dc (GtkStyle *style,