]> Pileus Git - ~andy/gtk/blobdiff - gdk/win32/gdkgc-win32.c
Add new keysyms from X11R6.4 (including EuroSign).
[~andy/gtk] / gdk / win32 / gdkgc-win32.c
index 6697090f7635c79d49d1b83a39810147a407d046..fb59c593f95619fe9fa3556149ba762e2dc5d30f 100644 (file)
  */
 
 #include "config.h"
+
 #include <string.h>
 
-#include "gdk.h"
+#include "gdkgc.h"
+#include "gdkpixmap.h"
 #include "gdkprivate.h"
+#include "gdkx.h"
 
 GdkGC*
 gdk_gc_new (GdkWindow *window)
@@ -41,7 +44,6 @@ gdk_gc_new_with_values (GdkWindow     *window,
                        GdkGCValues     *values,
                        GdkGCValuesMask  values_mask)
 {
-  GdkWindowPrivate *window_private;
   GdkGC *gc;
   GdkGCPrivate *private;
   static GdkColor black;
@@ -57,8 +59,7 @@ gdk_gc_new_with_values (GdkWindow     *window,
 
   g_return_val_if_fail (window != NULL, NULL);
 
-  window_private = (GdkWindowPrivate*) window;
-  if (window_private->destroyed)
+  if (GDK_DRAWABLE_DESTROYED (window))
     return NULL;
 
   private = g_new (GdkGCPrivate, 1);
@@ -86,7 +87,8 @@ gdk_gc_new_with_values (GdkWindow     *window,
   else
     private->background = white;
 
-  if ((values_mask & GDK_GC_FONT) && (values->font->type == GDK_FONT_FONT))
+  if ((values_mask & GDK_GC_FONT) && (values->font->type == GDK_FONT_FONT
+                                     || values->font->type == GDK_FONT_FONTSET))
     {
       private->font = (HFONT) ((GdkFontPrivate*) values->font)->xfont;
       GDK_NOTE (MISC, g_print (" font=%#x", private->font));
@@ -140,16 +142,16 @@ gdk_gc_new_with_values (GdkWindow *window,
     {
       private->tile = values->tile;
       gdk_pixmap_ref (private->tile);
-      GDK_NOTE (MISC, g_print (" tile=%#x", ((GdkPixmapPrivate *)private->tile)->xwindow));
+      GDK_NOTE (MISC, g_print (" tile=%#x", GDK_DRAWABLE_XID (private->tile)));
     }
   else
     private->tile = NULL;
 
   if (values_mask & GDK_GC_STIPPLE)
     {
-      private->stipple = values->tile;
+      private->stipple = values->stipple;
       gdk_pixmap_ref (private->stipple);
-      GDK_NOTE (MISC, g_print (" stipple=%#x", ((GdkPixmapPrivate *)private->stipple)->xwindow));
+      GDK_NOTE (MISC, g_print (" stipple=%#x", GDK_DRAWABLE_XID (private->stipple)));
     }
   else
     private->stipple = NULL;
@@ -157,7 +159,7 @@ gdk_gc_new_with_values (GdkWindow   *window,
   if (values_mask & GDK_GC_CLIP_MASK)
     {
       private->clip_region =
-       BitmapToRegion (((GdkPixmapPrivate *)values->clip_mask)->xwindow);
+       BitmapToRegion ((HBITMAP) GDK_DRAWABLE_XID (values->clip_mask));
       GDK_NOTE (MISC, g_print (" clip=%#x", private->clip_region));
     }
   else
@@ -387,7 +389,7 @@ gdk_gc_get_values (GdkGC       *gc,
       if ((hdc = CreateCompatibleDC (NULL)) == NULL)
        g_warning ("gdk_gc_get_values: CreateCompatibleDC failed");
       if ((oldbitmap =
-          SelectObject (hdc, ((GdkPixmapPrivate *) pixmap)->xwindow)) == NULL)
+          SelectObject (hdc, GDK_DRAWABLE_XID (pixmap))) == NULL)
        g_warning ("gdk_gc_get_values: SelectObject #1 failed");
       hbr = GetStockObject (BLACK_BRUSH);
       if (!FillRect (hdc, &rect, hbr))
@@ -479,7 +481,8 @@ gdk_gc_set_font (GdkGC       *gc,
   g_return_if_fail (gc != NULL);
   g_return_if_fail (font != NULL);
 
-  if (font->type == GDK_FONT_FONT)
+  if (font->type == GDK_FONT_FONT
+      || font->type == GDK_FONT_FONTSET)
     {
       gc_private = (GdkGCPrivate*) gc;
       font_private = (GdkFontPrivate*) font;
@@ -502,6 +505,8 @@ gdk_gc_set_function (GdkGC   *gc,
 
   private = (GdkGCPrivate*) gc;
 
+  GDK_NOTE (MISC, g_print ("gdk_gc_set_function: (%d) %d\n", private, function));
+
   switch (function)
     {
     case GDK_COPY:
@@ -557,7 +562,6 @@ gdk_gc_set_tile (GdkGC         *gc,
                 GdkPixmap *tile)
 {
   GdkGCPrivate *private;
-  GdkPixmapPrivate *pixmap_private;
   HBITMAP pixmap;
 
   g_return_if_fail (gc != NULL);
@@ -567,10 +571,7 @@ gdk_gc_set_tile (GdkGC        *gc,
   pixmap = NULL;
 
   if (tile)
-    {
-      pixmap_private = (GdkPixmapPrivate*) tile;
-      pixmap = pixmap_private->xwindow;
-    }
+    pixmap = GDK_DRAWABLE_XID (tile);
 
   if (private->tile != NULL)
     gdk_pixmap_unref (private->tile);
@@ -588,7 +589,6 @@ gdk_gc_set_stipple (GdkGC     *gc,
                    GdkPixmap *stipple)
 {
   GdkGCPrivate *private;
-  GdkPixmapPrivate *pixmap_private;
   HBITMAP pixmap;
 
   g_return_if_fail (gc != NULL);
@@ -598,10 +598,7 @@ gdk_gc_set_stipple (GdkGC     *gc,
   pixmap = NULL;
 
   if (stipple)
-    {
-      pixmap_private = (GdkPixmapPrivate*) stipple;
-      pixmap = pixmap_private->xwindow;
-    }
+    pixmap = GDK_DRAWABLE_XID (stipple);
 
   if (private->stipple != NULL)
     gdk_pixmap_unref (private->stipple);
@@ -660,12 +657,9 @@ gdk_gc_set_clip_mask (GdkGC        *gc,
   
   if (mask)
     {
-      GdkWindowPrivate *mask_private;
-      
-      mask_private = (GdkWindowPrivate*) mask;
-      if (mask_private->destroyed)
+      if (GDK_DRAWABLE_DESTROYED (mask))
        return;
-      xmask = mask_private->xwindow;
+      xmask = GDK_DRAWABLE_XID (mask);
     }
   else
     xmask = NULL;
@@ -888,7 +882,11 @@ gdk_gc_set_dashes (GdkGC *gc,
   g_return_if_fail (dash_list != NULL);
 
   /* XXX ??? */
-  g_warning ("gdk_gc_set_dashes: Not implemented");
+
+  private = (GdkGCPrivate *) gc;
+
+  private->pen_style &= ~(PS_STYLE_MASK);
+  private->pen_style |= PS_DASH;
 }
 
 void
@@ -903,11 +901,11 @@ gdk_gc_copy (GdkGC *dst_gc, GdkGC *src_gc)
 }
 
 HDC
-gdk_gc_predraw (GdkWindowPrivate *window_private,
-               GdkGCPrivate     *gc_private)
+gdk_gc_predraw (GdkDrawablePrivate *drawable_private,
+               GdkGCPrivate       *gc_private)
 {
   GdkColormapPrivate *colormap_private =
-    (GdkColormapPrivate *) window_private->colormap;
+    (GdkColormapPrivate *) drawable_private->colormap;
   COLORREF bg;
   COLORREF fg;
   LOGBRUSH logbrush;
@@ -916,7 +914,7 @@ gdk_gc_predraw (GdkWindowPrivate *window_private,
 
   g_assert (gc_private->xgc == NULL);
 
-  if (window_private->window_type == GDK_WINDOW_PIXMAP)
+  if (drawable_private->window_type == GDK_DRAWABLE_PIXMAP)
     {
       if ((gc_private->xgc = CreateCompatibleDC (NULL)) == NULL)
        g_warning ("gdk_gc_predraw: CreateCompatibleDC failed");
@@ -924,19 +922,19 @@ gdk_gc_predraw (GdkWindowPrivate *window_private,
       if ((gc_private->saved_dc = SaveDC (gc_private->xgc)) == 0)
        g_warning ("gdk_gc_predraw: SaveDC #1 failed");
       
-      if (SelectObject (gc_private->xgc, window_private->xwindow) == NULL)
+      if (SelectObject (gc_private->xgc, drawable_private->xwindow) == NULL)
        g_warning ("gdk_gc_predraw: SelectObject #1 failed");
     }
   else
     {
-      if ((gc_private->xgc = GetDC (window_private->xwindow)) == NULL)
+      if ((gc_private->xgc = GetDC (drawable_private->xwindow)) == NULL)
        g_warning ("gdk_gc_predraw: GetDC failed");
       
       if ((gc_private->saved_dc = SaveDC (gc_private->xgc)) == 0)
        g_warning ("gdk_gc_predraw: SaveDC #2 failed");
     }
   
-  gc_private->hwnd = window_private->xwindow;
+  gc_private->hwnd = drawable_private->xwindow;
   
   if (colormap_private == NULL)
     {
@@ -1007,9 +1005,36 @@ gdk_gc_predraw (GdkWindowPrivate *window_private,
   if (SetTextColor (gc_private->xgc, fg) == CLR_INVALID)
     g_warning ("gdk_gc_predraw: SetTextColor failed");
 
+#if 0
+  switch (gc_private->fill_style)
+    {
+    case GDK_STIPPLED:
+      {
+       GdkPixmap *stipple = gc_private->stipple;
+       GdkPixmapPrivate *stipple_private = (GdkPixmapPrivate *) stipple;
+       HBITMAP hbm = stipple_private->xwindow;
+       if (NULL == (hbr = CreatePatternBrush (hbm)))
+         g_warning ("gdk_gc_predraw: CreatePatternBrush failed");
+       
+#ifdef NATIVE_WIN16
+       SetBrushOrg  (gc_private->xgc, gc_private->ts_x_origin,
+                     gc_private->ts_y_origin);
+#else
+       SetBrushOrgEx(gc_private->xgc, gc_private->ts_x_origin,
+                     gc_private->ts_y_origin, NULL);
+#endif
+      }
+      break;
+    case GDK_SOLID:
+    default:
+      if ((hbr = CreateSolidBrush (fg)) == NULL)
+       g_warning ("gdk_gc_predraw: CreateSolidBrush failed");
+      break;
+  }
+#else
   if ((hbr = CreateSolidBrush (fg)) == NULL)
     g_warning ("gdk_gc_predraw: CreateSolidBrush failed");
-
+#endif
   if (SelectObject (gc_private->xgc, hbr) == NULL)
     g_warning ("gdk_gc_predraw: SelectObject #3 failed");
 
@@ -1063,13 +1088,13 @@ gdk_gc_predraw (GdkWindowPrivate *window_private,
 }
 
 void
-gdk_gc_postdraw (GdkWindowPrivate *window_private,
-                GdkGCPrivate     *gc_private)
+gdk_gc_postdraw (GdkDrawablePrivate *drawable_private,
+                GdkGCPrivate       *gc_private)
 {
   HGDIOBJ hpen;
   HGDIOBJ hbr;
   GdkColormapPrivate *colormap_private =
-    (GdkColormapPrivate *) window_private->colormap;
+    (GdkColormapPrivate *) drawable_private->colormap;
 
   if ((hpen = GetCurrentObject (gc_private->xgc, OBJ_PEN)) == NULL)
     g_warning ("gdk_gc_postdraw: GetCurrentObject #1 failed");
@@ -1089,7 +1114,7 @@ gdk_gc_postdraw (GdkWindowPrivate *window_private,
        g_warning ("gdk_gc_postraw: UnrealizeObject failed");
     }
 #endif
-  if (window_private->window_type == GDK_WINDOW_PIXMAP)
+  if (drawable_private->window_type == GDK_DRAWABLE_PIXMAP)
     {
       if (!DeleteDC (gc_private->xgc))
        g_warning ("gdk_gc_postdraw: DeleteDC failed");