diff options
author | Martin Schlemmer <11285613@nwu.ac.za> | 2010-09-03 22:18:21 +0200 |
---|---|---|
committer | Fridrich Štrba <fridrich.strba@bluewin.ch> | 2010-09-03 22:19:39 +0200 |
commit | e6da33a302a51783777e8da41c680cdf4dc783eb (patch) | |
tree | c7b77ff29e87723c42e12971767b363a58f42ac6 /modules | |
parent | 3b63ef0ac65bc8df77226bc5fb2330ead977c1fe (diff) | |
download | gtk+-e6da33a302a51783777e8da41c680cdf4dc783eb.tar.gz |
MS Windows engine: draw elements in the right place.
Work in progress, still remains to be solved the problem of clipping.
Diffstat (limited to 'modules')
-rwxr-xr-x | modules/engines/ms-windows/xp_theme.c | 66 | ||||
-rwxr-xr-x | modules/engines/ms-windows/xp_theme.h | 11 |
2 files changed, 28 insertions, 49 deletions
diff --git a/modules/engines/ms-windows/xp_theme.c b/modules/engines/ms-windows/xp_theme.c index d23dfea2d8..258f4183fb 100755 --- a/modules/engines/ms-windows/xp_theme.c +++ b/modules/engines/ms-windows/xp_theme.c @@ -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; } diff --git a/modules/engines/ms-windows/xp_theme.h b/modules/engines/ms-windows/xp_theme.h index 4e2a1f1404..0ee9830dfc 100755 --- a/modules/engines/ms-windows/xp_theme.h +++ b/modules/engines/ms-windows/xp_theme.h @@ -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, |