]> Pileus Git - ~andy/gtk/commitdiff
Add an extra parameter so that we don't have to do unnecessary settings to
authorTor Lillqvist <tml@iki.fi>
Sun, 13 Feb 2000 14:52:47 +0000 (14:52 +0000)
committerTor Lillqvist <tml@src.gnome.org>
Sun, 13 Feb 2000 14:52:47 +0000 (14:52 +0000)
2000-02-13  Tor Lillqvist  <tml@iki.fi>

* gdk/win32/gdkgc-win32.c (gdk_gc_predraw): Add an extra parameter
so that we don't have to do unnecessary settings to the HDC.

* gdk/win32/gdkdrawable-win32.c
* gdk/win32/gdkimage-win32.c: Corresponding changes to the calls of
gdk_gc_predraw.

* gdk/win32/gdkdrawable-win32.c: Special-casing for GdkGCs where
the fill style is GDK_OPAQUE_STIPPLED. In those cases we construct
GDI paths, call WidenPath to get the outline of the stroken path,
and then fill the outline (with the brush that was built from the
stipple).

* gdk/win32/gdkgc-win32.c: Factor out common code from
_gdk_win32_gc_new and gdk_win32_gc_set_values into
gdk_win32_gc_values_to_win32values.

* gdk/win32/gdkmain-win32.c (gdk_win32_last_error_string,
gdk_win32_api_failed): New functions for error logging.

* gdk/win32/gdkprivate-win32.h: Declare them, and a macro
WIN32_API_FAILED to call them, passing function or file name and
line number.

* gdk/win32/*.c: Use the WIN32_API_FAILED macro.

* gdk/win32/gdkprivate-win32.h: Store just the pixel values from
GdkColor for foreground and background in GdkGCWin32Data.

* gdk/makefile.cygwin: Link in the resource object separately.

* gdk/win32/rc/gdk.rc
* gtk/gtk.rc (New file)
* gdk/win32/makefile.cygwin
* gtk/makefile.cygwin: Update build number in DLLs automatically,
as in GLib.

26 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gdk/makefile.cygwin
gdk/win32/gdkcolor-win32.c
gdk/win32/gdkcursor-win32.c
gdk/win32/gdkdnd-win32.c
gdk/win32/gdkdrawable-win32.c
gdk/win32/gdkevents-win32.c
gdk/win32/gdkfont-win32.c
gdk/win32/gdkgc-win32.c
gdk/win32/gdkimage-win32.c
gdk/win32/gdkmain-win32.c
gdk/win32/gdkpixmap-win32.c
gdk/win32/gdkprivate-win32.h
gdk/win32/gdkproperty-win32.c
gdk/win32/gdkselection-win32.c
gdk/win32/gdkwindow-win32.c
gdk/win32/makefile.cygwin
gdk/win32/rc/gdk.rc
gtk/gtk.rc [new file with mode: 0644]
gtk/makefile.cygwin

index 3f0486fef513fb8d4a5df5dcf0462a6b0a3a37a9..5a6ec241e42c0f783edc2f99dc65765b1b8a5683 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,42 @@
+2000-02-13  Tor Lillqvist  <tml@iki.fi>
+
+       * gdk/win32/gdkgc-win32.c (gdk_gc_predraw): Add an extra parameter
+       so that we don't have to do unnecessary settings to the HDC.
+
+       * gdk/win32/gdkdrawable-win32.c
+       * gdk/win32/gdkimage-win32.c: Corresponding changes to the calls of
+       gdk_gc_predraw.
+
+       * gdk/win32/gdkdrawable-win32.c: Special-casing for GdkGCs where
+       the fill style is GDK_OPAQUE_STIPPLED. In those cases we construct
+       GDI paths, call WidenPath to get the outline of the stroken path,
+       and then fill the outline (with the brush that was built from the
+       stipple).
+
+       * gdk/win32/gdkgc-win32.c: Factor out common code from
+       _gdk_win32_gc_new and gdk_win32_gc_set_values into
+       gdk_win32_gc_values_to_win32values.
+
+       * gdk/win32/gdkmain-win32.c (gdk_win32_last_error_string,
+       gdk_win32_api_failed): New functions for error logging.
+
+       * gdk/win32/gdkprivate-win32.h: Declare them, and a macro
+       WIN32_API_FAILED to call them, passing function or file name and
+       line number.
+
+       * gdk/win32/*.c: Use the WIN32_API_FAILED macro.
+
+       * gdk/win32/gdkprivate-win32.h: Store just the pixel values from
+       GdkColor for foreground and background in GdkGCWin32Data.
+
+       * gdk/makefile.cygwin: Link in the resource object separately.
+
+       * gdk/win32/rc/gdk.rc
+       * gtk/gtk.rc (New file)
+       * gdk/win32/makefile.cygwin
+       * gtk/makefile.cygwin: Update build number in DLLs automatically,
+       as in GLib.
+
 Sun Feb 13 08:54:45 2000  Tim Janik  <timj@gtk.org>
 
        * gdk/gdkcursor.h (struct _GdkCursor): s/refcount/ref_count/.
index 3f0486fef513fb8d4a5df5dcf0462a6b0a3a37a9..5a6ec241e42c0f783edc2f99dc65765b1b8a5683 100644 (file)
@@ -1,3 +1,42 @@
+2000-02-13  Tor Lillqvist  <tml@iki.fi>
+
+       * gdk/win32/gdkgc-win32.c (gdk_gc_predraw): Add an extra parameter
+       so that we don't have to do unnecessary settings to the HDC.
+
+       * gdk/win32/gdkdrawable-win32.c
+       * gdk/win32/gdkimage-win32.c: Corresponding changes to the calls of
+       gdk_gc_predraw.
+
+       * gdk/win32/gdkdrawable-win32.c: Special-casing for GdkGCs where
+       the fill style is GDK_OPAQUE_STIPPLED. In those cases we construct
+       GDI paths, call WidenPath to get the outline of the stroken path,
+       and then fill the outline (with the brush that was built from the
+       stipple).
+
+       * gdk/win32/gdkgc-win32.c: Factor out common code from
+       _gdk_win32_gc_new and gdk_win32_gc_set_values into
+       gdk_win32_gc_values_to_win32values.
+
+       * gdk/win32/gdkmain-win32.c (gdk_win32_last_error_string,
+       gdk_win32_api_failed): New functions for error logging.
+
+       * gdk/win32/gdkprivate-win32.h: Declare them, and a macro
+       WIN32_API_FAILED to call them, passing function or file name and
+       line number.
+
+       * gdk/win32/*.c: Use the WIN32_API_FAILED macro.
+
+       * gdk/win32/gdkprivate-win32.h: Store just the pixel values from
+       GdkColor for foreground and background in GdkGCWin32Data.
+
+       * gdk/makefile.cygwin: Link in the resource object separately.
+
+       * gdk/win32/rc/gdk.rc
+       * gtk/gtk.rc (New file)
+       * gdk/win32/makefile.cygwin
+       * gtk/makefile.cygwin: Update build number in DLLs automatically,
+       as in GLib.
+
 Sun Feb 13 08:54:45 2000  Tim Janik  <timj@gtk.org>
 
        * gdk/gdkcursor.h (struct _GdkCursor): s/refcount/ref_count/.
index 3f0486fef513fb8d4a5df5dcf0462a6b0a3a37a9..5a6ec241e42c0f783edc2f99dc65765b1b8a5683 100644 (file)
@@ -1,3 +1,42 @@
+2000-02-13  Tor Lillqvist  <tml@iki.fi>
+
+       * gdk/win32/gdkgc-win32.c (gdk_gc_predraw): Add an extra parameter
+       so that we don't have to do unnecessary settings to the HDC.
+
+       * gdk/win32/gdkdrawable-win32.c
+       * gdk/win32/gdkimage-win32.c: Corresponding changes to the calls of
+       gdk_gc_predraw.
+
+       * gdk/win32/gdkdrawable-win32.c: Special-casing for GdkGCs where
+       the fill style is GDK_OPAQUE_STIPPLED. In those cases we construct
+       GDI paths, call WidenPath to get the outline of the stroken path,
+       and then fill the outline (with the brush that was built from the
+       stipple).
+
+       * gdk/win32/gdkgc-win32.c: Factor out common code from
+       _gdk_win32_gc_new and gdk_win32_gc_set_values into
+       gdk_win32_gc_values_to_win32values.
+
+       * gdk/win32/gdkmain-win32.c (gdk_win32_last_error_string,
+       gdk_win32_api_failed): New functions for error logging.
+
+       * gdk/win32/gdkprivate-win32.h: Declare them, and a macro
+       WIN32_API_FAILED to call them, passing function or file name and
+       line number.
+
+       * gdk/win32/*.c: Use the WIN32_API_FAILED macro.
+
+       * gdk/win32/gdkprivate-win32.h: Store just the pixel values from
+       GdkColor for foreground and background in GdkGCWin32Data.
+
+       * gdk/makefile.cygwin: Link in the resource object separately.
+
+       * gdk/win32/rc/gdk.rc
+       * gtk/gtk.rc (New file)
+       * gdk/win32/makefile.cygwin
+       * gtk/makefile.cygwin: Update build number in DLLs automatically,
+       as in GLib.
+
 Sun Feb 13 08:54:45 2000  Tim Janik  <timj@gtk.org>
 
        * gdk/gdkcursor.h (struct _GdkCursor): s/refcount/ref_count/.
index 3f0486fef513fb8d4a5df5dcf0462a6b0a3a37a9..5a6ec241e42c0f783edc2f99dc65765b1b8a5683 100644 (file)
@@ -1,3 +1,42 @@
+2000-02-13  Tor Lillqvist  <tml@iki.fi>
+
+       * gdk/win32/gdkgc-win32.c (gdk_gc_predraw): Add an extra parameter
+       so that we don't have to do unnecessary settings to the HDC.
+
+       * gdk/win32/gdkdrawable-win32.c
+       * gdk/win32/gdkimage-win32.c: Corresponding changes to the calls of
+       gdk_gc_predraw.
+
+       * gdk/win32/gdkdrawable-win32.c: Special-casing for GdkGCs where
+       the fill style is GDK_OPAQUE_STIPPLED. In those cases we construct
+       GDI paths, call WidenPath to get the outline of the stroken path,
+       and then fill the outline (with the brush that was built from the
+       stipple).
+
+       * gdk/win32/gdkgc-win32.c: Factor out common code from
+       _gdk_win32_gc_new and gdk_win32_gc_set_values into
+       gdk_win32_gc_values_to_win32values.
+
+       * gdk/win32/gdkmain-win32.c (gdk_win32_last_error_string,
+       gdk_win32_api_failed): New functions for error logging.
+
+       * gdk/win32/gdkprivate-win32.h: Declare them, and a macro
+       WIN32_API_FAILED to call them, passing function or file name and
+       line number.
+
+       * gdk/win32/*.c: Use the WIN32_API_FAILED macro.
+
+       * gdk/win32/gdkprivate-win32.h: Store just the pixel values from
+       GdkColor for foreground and background in GdkGCWin32Data.
+
+       * gdk/makefile.cygwin: Link in the resource object separately.
+
+       * gdk/win32/rc/gdk.rc
+       * gtk/gtk.rc (New file)
+       * gdk/win32/makefile.cygwin
+       * gtk/makefile.cygwin: Update build number in DLLs automatically,
+       as in GLib.
+
 Sun Feb 13 08:54:45 2000  Tim Janik  <timj@gtk.org>
 
        * gdk/gdkcursor.h (struct _GdkCursor): s/refcount/ref_count/.
index 3f0486fef513fb8d4a5df5dcf0462a6b0a3a37a9..5a6ec241e42c0f783edc2f99dc65765b1b8a5683 100644 (file)
@@ -1,3 +1,42 @@
+2000-02-13  Tor Lillqvist  <tml@iki.fi>
+
+       * gdk/win32/gdkgc-win32.c (gdk_gc_predraw): Add an extra parameter
+       so that we don't have to do unnecessary settings to the HDC.
+
+       * gdk/win32/gdkdrawable-win32.c
+       * gdk/win32/gdkimage-win32.c: Corresponding changes to the calls of
+       gdk_gc_predraw.
+
+       * gdk/win32/gdkdrawable-win32.c: Special-casing for GdkGCs where
+       the fill style is GDK_OPAQUE_STIPPLED. In those cases we construct
+       GDI paths, call WidenPath to get the outline of the stroken path,
+       and then fill the outline (with the brush that was built from the
+       stipple).
+
+       * gdk/win32/gdkgc-win32.c: Factor out common code from
+       _gdk_win32_gc_new and gdk_win32_gc_set_values into
+       gdk_win32_gc_values_to_win32values.
+
+       * gdk/win32/gdkmain-win32.c (gdk_win32_last_error_string,
+       gdk_win32_api_failed): New functions for error logging.
+
+       * gdk/win32/gdkprivate-win32.h: Declare them, and a macro
+       WIN32_API_FAILED to call them, passing function or file name and
+       line number.
+
+       * gdk/win32/*.c: Use the WIN32_API_FAILED macro.
+
+       * gdk/win32/gdkprivate-win32.h: Store just the pixel values from
+       GdkColor for foreground and background in GdkGCWin32Data.
+
+       * gdk/makefile.cygwin: Link in the resource object separately.
+
+       * gdk/win32/rc/gdk.rc
+       * gtk/gtk.rc (New file)
+       * gdk/win32/makefile.cygwin
+       * gtk/makefile.cygwin: Update build number in DLLs automatically,
+       as in GLib.
+
 Sun Feb 13 08:54:45 2000  Tim Janik  <timj@gtk.org>
 
        * gdk/gdkcursor.h (struct _GdkCursor): s/refcount/ref_count/.
index 3f0486fef513fb8d4a5df5dcf0462a6b0a3a37a9..5a6ec241e42c0f783edc2f99dc65765b1b8a5683 100644 (file)
@@ -1,3 +1,42 @@
+2000-02-13  Tor Lillqvist  <tml@iki.fi>
+
+       * gdk/win32/gdkgc-win32.c (gdk_gc_predraw): Add an extra parameter
+       so that we don't have to do unnecessary settings to the HDC.
+
+       * gdk/win32/gdkdrawable-win32.c
+       * gdk/win32/gdkimage-win32.c: Corresponding changes to the calls of
+       gdk_gc_predraw.
+
+       * gdk/win32/gdkdrawable-win32.c: Special-casing for GdkGCs where
+       the fill style is GDK_OPAQUE_STIPPLED. In those cases we construct
+       GDI paths, call WidenPath to get the outline of the stroken path,
+       and then fill the outline (with the brush that was built from the
+       stipple).
+
+       * gdk/win32/gdkgc-win32.c: Factor out common code from
+       _gdk_win32_gc_new and gdk_win32_gc_set_values into
+       gdk_win32_gc_values_to_win32values.
+
+       * gdk/win32/gdkmain-win32.c (gdk_win32_last_error_string,
+       gdk_win32_api_failed): New functions for error logging.
+
+       * gdk/win32/gdkprivate-win32.h: Declare them, and a macro
+       WIN32_API_FAILED to call them, passing function or file name and
+       line number.
+
+       * gdk/win32/*.c: Use the WIN32_API_FAILED macro.
+
+       * gdk/win32/gdkprivate-win32.h: Store just the pixel values from
+       GdkColor for foreground and background in GdkGCWin32Data.
+
+       * gdk/makefile.cygwin: Link in the resource object separately.
+
+       * gdk/win32/rc/gdk.rc
+       * gtk/gtk.rc (New file)
+       * gdk/win32/makefile.cygwin
+       * gtk/makefile.cygwin: Update build number in DLLs automatically,
+       as in GLib.
+
 Sun Feb 13 08:54:45 2000  Tim Janik  <timj@gtk.org>
 
        * gdk/gdkcursor.h (struct _GdkCursor): s/refcount/ref_count/.
index 3f0486fef513fb8d4a5df5dcf0462a6b0a3a37a9..5a6ec241e42c0f783edc2f99dc65765b1b8a5683 100644 (file)
@@ -1,3 +1,42 @@
+2000-02-13  Tor Lillqvist  <tml@iki.fi>
+
+       * gdk/win32/gdkgc-win32.c (gdk_gc_predraw): Add an extra parameter
+       so that we don't have to do unnecessary settings to the HDC.
+
+       * gdk/win32/gdkdrawable-win32.c
+       * gdk/win32/gdkimage-win32.c: Corresponding changes to the calls of
+       gdk_gc_predraw.
+
+       * gdk/win32/gdkdrawable-win32.c: Special-casing for GdkGCs where
+       the fill style is GDK_OPAQUE_STIPPLED. In those cases we construct
+       GDI paths, call WidenPath to get the outline of the stroken path,
+       and then fill the outline (with the brush that was built from the
+       stipple).
+
+       * gdk/win32/gdkgc-win32.c: Factor out common code from
+       _gdk_win32_gc_new and gdk_win32_gc_set_values into
+       gdk_win32_gc_values_to_win32values.
+
+       * gdk/win32/gdkmain-win32.c (gdk_win32_last_error_string,
+       gdk_win32_api_failed): New functions for error logging.
+
+       * gdk/win32/gdkprivate-win32.h: Declare them, and a macro
+       WIN32_API_FAILED to call them, passing function or file name and
+       line number.
+
+       * gdk/win32/*.c: Use the WIN32_API_FAILED macro.
+
+       * gdk/win32/gdkprivate-win32.h: Store just the pixel values from
+       GdkColor for foreground and background in GdkGCWin32Data.
+
+       * gdk/makefile.cygwin: Link in the resource object separately.
+
+       * gdk/win32/rc/gdk.rc
+       * gtk/gtk.rc (New file)
+       * gdk/win32/makefile.cygwin
+       * gtk/makefile.cygwin: Update build number in DLLs automatically,
+       as in GLib.
+
 Sun Feb 13 08:54:45 2000  Tim Janik  <timj@gtk.org>
 
        * gdk/gdkcursor.h (struct _GdkCursor): s/refcount/ref_count/.
index 25d89e041748a7c861b91b9260ebed01ad09bcee..028e7857430bf8279ec273ac5e7d1ebca4d17c71 100644 (file)
@@ -48,7 +48,7 @@ gdk_OBJECTS = \
 gdkconfig.h : gdkconfig.h.win32
        $(CP) gdkconfig.h.win32 gdkconfig.h
 
-gdk-$(GTK_VER).dll : $(gdk_OBJECTS) gdk.def win32/libgdk-win32.a
+gdk-$(GTK_VER).dll : $(gdk_OBJECTS) gdk.def win32/libgdk-win32.a win32/gdk-win32res.o
        $(GLIB)/build-dll gdk $(GTK_VER) gdk.def $(gdk_OBJECTS) -L win32 -lgdk-win32 -lwntab32x -L $(GLIB) -lglib-$(GLIB_VER) -lgdi32 -luser32 -limm32 -lshell32 -lole32 -luuid $(LDFLAGS) win32/gdk-win32res.o 
 
 .SUFFIXES: .c .o .i
index 4709fac225459caaf2794ba8face6706210db7d3..85c7574b02f2059bcbe4544aaa3c7f5aa2939249 100644 (file)
@@ -87,8 +87,7 @@ alloc_color_cells(Colormap      colormap,
 #ifdef SOME_STRANGE_BUG
       if (!ResizePalette (colormap->palette, colormap->size + nmore))
        {
-         g_warning ("alloc_color_cells: ResizePalette to %d failed",
-                    colormap->size + nmore);
+         WIN32_API_FAILED ("ResizePalette")
          return FALSE;
        }
       g_print("alloc_color_cells: %#x to %d\n",
@@ -205,7 +204,7 @@ alloc_color(Colormap  colormap,
              /* It was a free'd entry anyway, so we can use it, and
                 set it to the correct color. */
              if (SetPaletteEntries (colormap->palette, index, 1, &entry) == 0)
-               g_warning ("alloc_color: SetPaletteEntries #1 failed");
+               WIN32_API_FAILED ("SetPaletteEntries #1");
            }
          else
            {
@@ -218,7 +217,7 @@ alloc_color(Colormap  colormap,
                    /* A free slot, use it. */
                    if (SetPaletteEntries (colormap->palette,
                                           index, 1, &entry) == 0)
-                     g_warning ("alloc_color: SetPaletteEntries #2 failed");
+                     WIN32_API_FAILED ("SetPaletteEntries #2");
                    index = i;
                    break;
                  }
@@ -238,10 +237,9 @@ alloc_color(Colormap  colormap,
                      index = colormap->size;
                      colormap->size++;
                      if (!ResizePalette (colormap->palette, colormap->size))
-                       g_warning ("alloc_color: ResizePalette to %d failed",
-                                  colormap->size);
+                       WIN32_API_FAILED ("ResizePalette");
                      if (SetPaletteEntries (colormap->palette, index, 1, &entry) == 0)
-                       g_warning ("alloc_color: SetPaletteEntries #3 failed");
+                       WIN32_API_FAILED ("SetPaletteEntries #3");
                    }
                }
            }
@@ -329,7 +327,7 @@ free_colors (Colormap colormap,
       if (SetPaletteEntries (colormap->palette, lowestpixel,
                             highestpixel - lowestpixel + 1,
                             entries + lowestpixel) == 0)
-       g_warning ("free_colors: SetPaletteEntries failed");
+       WIN32_API_FAILED ("SetPaletteEntries");
 #endif
       colormap->stale = TRUE;
 #if 0
@@ -1553,7 +1551,7 @@ gdk_colormap_change (GdkColormap *colormap,
 
       if (SetPaletteEntries (private->xcolormap->palette,
                             0, ncolors, palette) == 0)
-       g_warning ("gdk_colormap_change: SetPaletteEntries failed");
+       WIN32_API_FAILED ("SetPaletteEntries");
       private->xcolormap->stale = TRUE;
       break;
 
@@ -1860,7 +1858,7 @@ gdk_colormap_alloc_colors_private (GdkColormap *colormap,
   
   if (SetPaletteEntries (private->xcolormap->palette,
                         0, nstore, store) == 0)
-    g_warning ("gdk_colormap_alloc_colors_private: SetPaletteEntries failed");
+    WIN32_API_FAILED ("SetPaletteEntries");
   private->xcolormap->stale = TRUE;
 
   g_free (store);
@@ -2118,7 +2116,7 @@ gdk_color_change (GdkColormap *colormap,
 
   if (SetPaletteEntries (private->xcolormap->palette,
                         color->pixel, 1, &xcolor) == 0)
-    g_warning ("gdk_color_change: SetPaletteEntries failed");
+    WIN32_API_FAILED ("SetPaletteEntries");
   private->xcolormap->stale = TRUE;
 
   return TRUE;
@@ -2215,12 +2213,12 @@ gdk_colormap_cmp (Colormap *a,
   return (*a == *b);
 }
 
-char *
+gchar *
 gdk_color_to_string (const GdkColor *color)
 {
   static char buf[100];
 
-  sprintf (buf, "(%.04x,%.04x,%.04x): %.06x",
+  sprintf (buf, "(%.04x,%.04x,%.04x):%.06x",
           color->red, color->green, color->blue, color->pixel);
 
   return buf;
index 6245c89b48ff821678c59113cf2546b53779b385..576e646f9e0d722546fa8f54d3eba7ddb65fc4ed 100644 (file)
@@ -117,7 +117,7 @@ gdk_cursor_new (GdkCursorType cursor_type)
     {
       xcursor = LoadCursor (gdk_DLLInstance, cursors[i].name);
       if (xcursor == NULL)
-       g_warning ("gdk_cursor_new: LoadCursor failed");
+       WIN32_API_FAILED ("LoadCursor");
       GDK_NOTE (MISC, g_print ("gdk_cursor_new: %#x %d\n",
                               xcursor, cursor_type));
     }
@@ -132,7 +132,7 @@ gdk_cursor_new (GdkCursorType cursor_type)
   private->xcursor = xcursor;
   cursor = (GdkCursor*) private;
   cursor->type = cursor_type;
-  cursor->refcount = 1;
+  cursor->ref_count = 1;
 
   return cursor;
 }
@@ -268,7 +268,7 @@ _gdk_cursor_destroy (GdkCursor *cursor)
 
   if (cursor->type == GDK_CURSOR_IS_PIXMAP)
     if (!DestroyIcon (private->xcursor))
-      g_warning ("_gdk_cursor_destroy: DestroyIcon failed");
+      WIN32_API_FAILED ("DestroyIcon");
 
   g_free (private);
 }
index 09179eb909fd3ee55c96997cf5ae28ea13fbe48b..80b6df932a75db8e2955be8c801eecb98c0394c6 100644 (file)
@@ -934,7 +934,7 @@ gdk_window_register_dnd (GdkWindow      *window)
   context = target_context_new ();
   hres = CoLockObjectExternal ((IUnknown *) &context->idt, TRUE, FALSE);
   if (!SUCCEEDED (hres))
-    g_warning ("gdk_window_register_dnd: CoLockObjectExternal failed");
+    WIN32_API_FAILED ("CoLockObjectExternal");
   else
     {
       hres = RegisterDragDrop (GDK_DRAWABLE_XID (window), &context->idt);
@@ -944,7 +944,7 @@ gdk_window_register_dnd (GdkWindow      *window)
          CoLockObjectExternal ((IUnknown *) &context->idt, FALSE, FALSE);
        }
       else if (!SUCCEEDED (hres))
-       g_warning ("gdk_window_register_dnd: RegisterDragDrop failed");
+       WIN32_API_FAILED ("RegisterDragDrop");
       else
        {
          gdk_window_add_filter (window, gdk_destroy_filter, &context->idt);
index cf90570e9f17b222c45c62d83e6b1dfd9c6562e1..aeceaf36740e5b7c42e3298abbb45cea8408727b 100644 (file)
@@ -163,8 +163,8 @@ gdk_drawable_set_colormap (GdkDrawable *drawable,
       drawable_private->colormap = colormap;
       gdk_colormap_ref (drawable_private->colormap);
       
-      if (GDK_IS_WINDOW (drawable) &&
-         drawable_private->window_type != GDK_WINDOW_TOPLEVEL)
+      if (GDK_IS_WINDOW (drawable)
+         && drawable_private->window_type != GDK_WINDOW_TOPLEVEL)
        gdk_window_add_colormap_windows (drawable);
     }
 }
@@ -186,20 +186,20 @@ gdk_win32_draw_rectangle (GdkDrawable *drawable,
                          gint         width,
                          gint         height)
 {
-  GdkGCPrivate *gc_private;
+  GdkGCPrivate *gc_private = (GdkGCPrivate*) gc;
+  GdkGCWin32Data *gc_data = GDK_GC_WIN32DATA (gc_private);
   HDC hdc;
   HGDIOBJ oldpen, oldbrush;
 
-  gc_private = (GdkGCPrivate*) gc;
-
-  hdc = gdk_gc_predraw (drawable, gc_private);
-
-  GDK_NOTE (MISC, g_print ("gdk_draw_rectangle: %#x (%d) %s%dx%d@+%d+%d\n",
+  GDK_NOTE (MISC, g_print ("gdk_win32_draw_rectangle: %#x (%d) %s%dx%d@+%d+%d\n",
                           GDK_DRAWABLE_XID (drawable),
                           gc_private,
                           (filled ? "fill " : ""),
                           width, height, x, y));
     
+  hdc = gdk_gc_predraw (drawable, gc_private,
+                       GDK_GC_FOREGROUND|GDK_GC_BACKGROUND);
+
 #if 0
   {
     HBRUSH hbr = GetCurrentObject (hdc, OBJ_BRUSH);
@@ -219,20 +219,62 @@ gdk_win32_draw_rectangle (GdkDrawable *drawable,
   }
 #endif
 
-  if (filled)
-    oldpen = SelectObject (hdc, GetStockObject (NULL_PEN));
+  if (gc_data->fill_style == GDK_OPAQUE_STIPPLED)
+    {
+      if (!BeginPath (hdc))
+       WIN32_API_FAILED ("BeginPath");
+      else
+       {
+         /* Win9x doesn't support Rectangle calls in a path,
+          * thus use Polyline.
+          */
+         POINT pts[4];
+         
+         pts[0].x = x;
+         pts[0].y = y;
+         pts[1].x = x + width + 1;
+         pts[1].y = y;
+         pts[2].x = x + width + 1;
+         pts[2].y = y + height + 1;
+         pts[3].x = x;
+         pts[3].y = y + height + 1;
+         
+         MoveToEx (hdc, x, y, NULL);
+         
+         if (!Polyline (hdc, pts, 4))
+           WIN32_API_FAILED ("Polyline");
+         
+         if (!CloseFigure (hdc))
+           WIN32_API_FAILED ("CloseFigure");
+
+         if (!EndPath (hdc))
+           WIN32_API_FAILED ("EndPath");
+         
+         if (!filled)
+           if (!WidenPath (hdc))
+             WIN32_API_FAILED ("WidenPath");
+         
+         if (!FillPath (hdc))
+           WIN32_API_FAILED ("FillPath");
+       }
+    }
   else
-    oldbrush = SelectObject (hdc, GetStockObject (HOLLOW_BRUSH));
+    {
+      if (filled)
+       oldpen = SelectObject (hdc, GetStockObject (NULL_PEN));
+      else
+       oldbrush = SelectObject (hdc, GetStockObject (HOLLOW_BRUSH));
   
-  if (!Rectangle (hdc, x, y, x+width+1, y+height+1))
-    g_warning ("gdk_draw_rectangle: Rectangle failed");
+      if (!Rectangle (hdc, x, y, x+width+1, y+height+1))
+       WIN32_API_FAILED ("Rectangle");
   
-  if (filled)
-    SelectObject (hdc, oldpen);
-  else
-    SelectObject (hdc, oldbrush);
+      if (filled)
+       SelectObject (hdc, oldpen);
+      else
+       SelectObject (hdc, oldbrush);
+    }
 
-  gdk_gc_postdraw (drawable, gc_private);
+  gdk_gc_postdraw (drawable, gc_private, GDK_GC_FOREGROUND|GDK_GC_BACKGROUND);
 }
 
 static void
@@ -258,7 +300,8 @@ gdk_win32_draw_arc (GdkDrawable *drawable,
 
   if (width != 0 && height != 0 && angle2 != 0)
     {
-      hdc = gdk_gc_predraw (drawable, gc_private);
+      hdc = gdk_gc_predraw (drawable, gc_private,
+                           GDK_GC_FOREGROUND|GDK_GC_BACKGROUND);
 
       if (angle2 >= 360*64)
        {
@@ -280,6 +323,8 @@ gdk_win32_draw_arc (GdkDrawable *drawable,
          nYStartArc = y + height/2 + -100. * sin((angle1+angle2)/64.*2.*G_PI/360.);
        }
 
+      /* GDK_OPAQUE_STIPPLED arcs not implemented. */
+
       if (filled)
        {
          GDK_NOTE (MISC, g_print ("...Pie(hdc,%d,%d,%d,%d,%d,%d,%d,%d)\n",
@@ -298,7 +343,8 @@ gdk_win32_draw_arc (GdkDrawable *drawable,
          Arc (hdc, x, y, x+width, y+height,
               nXStartArc, nYStartArc, nXEndArc, nYEndArc);
        }
-      gdk_gc_postdraw (drawable, gc_private);
+      gdk_gc_postdraw (drawable, gc_private,
+                      GDK_GC_FOREGROUND|GDK_GC_BACKGROUND);
     }
 }
 
@@ -309,22 +355,22 @@ gdk_win32_draw_polygon (GdkDrawable *drawable,
                        GdkPoint    *points,
                        gint         npoints)
 {
-  GdkGCPrivate *gc_private;
+  GdkGCPrivate *gc_private = (GdkGCPrivate*) gc;
+  GdkGCWin32Data *gc_data = GDK_GC_WIN32DATA (gc_private);
   HDC hdc;
   POINT *pts;
   int i;
 
-  gc_private = (GdkGCPrivate*) gc;
-
-  GDK_NOTE (MISC, g_print ("gdk_draw_polygon: %#x (%d) %d\n",
+  GDK_NOTE (MISC, g_print ("gdk_win32_draw_polygon: %#x (%d) %d\n",
                           GDK_DRAWABLE_XID (drawable), gc_private,
                           npoints));
 
   if (npoints < 2)
     return;
 
-  hdc = gdk_gc_predraw (drawable, gc_private);
-  pts = g_malloc ((npoints+1) * sizeof (POINT));
+  hdc = gdk_gc_predraw (drawable, gc_private,
+                       GDK_GC_FOREGROUND|GDK_GC_BACKGROUND);
+  pts = g_new (POINT, npoints+1);
 
   for (i = 0; i < npoints; i++)
     {
@@ -332,25 +378,57 @@ gdk_win32_draw_polygon (GdkDrawable *drawable,
       pts[i].y = points[i].y;
     }
   
-  if ((points[0].x != points[npoints-1].x) ||
-      (points[0].y != points[npoints-1].y)) 
+  if (gc_data->fill_style == GDK_OPAQUE_STIPPLED)
     {
-      pts[npoints].x = points[0].x;
-      pts[npoints].y = points[0].y;
-      npoints++;
-    }
-  if (filled)
-    {
-      if (!Polygon (hdc, pts, npoints))
-       g_warning ("gdk_draw_polygon: Polygon failed");
+      if (!BeginPath (hdc))
+       WIN32_API_FAILED ("BeginPath");
+      else
+       {
+         MoveToEx (hdc, points[0].x, points[0].y, NULL);
+
+         if (pts[0].x == pts[npoints-1].x && pts[0].y == pts[npoints-1].y)
+           npoints--;
+
+         if (!Polyline (hdc, pts, 4))
+           WIN32_API_FAILED ("Polyline");
+         
+         if (!CloseFigure (hdc))
+           WIN32_API_FAILED ("CloseFigure");
+
+         if (!EndPath (hdc))
+           WIN32_API_FAILED ("EndPath");
+         
+         if (!filled)
+           if (!WidenPath (hdc))
+             WIN32_API_FAILED ("WidenPath");
+         
+         if (!FillPath (hdc))
+           WIN32_API_FAILED ("FillPath");
+       }
     }
   else
     {
-      if (!Polyline (hdc, pts, npoints))
-       g_warning ("gdk_draw_polygon: Polyline failed");
+      if (points[0].x != points[npoints-1].x
+         || points[0].y != points[npoints-1].y) 
+       {
+         pts[npoints].x = points[0].x;
+         pts[npoints].y = points[0].y;
+         npoints++;
+       }
+      
+      if (filled)
+       {
+         if (!Polygon (hdc, pts, npoints))
+           WIN32_API_FAILED ("Polygon");
+       }
+      else
+       {
+         if (!Polyline (hdc, pts, npoints))
+           WIN32_API_FAILED ("Polyline");
+       }
     }
   g_free (pts);
-  gdk_gc_postdraw (drawable, gc_private);
+  gdk_gc_postdraw (drawable, gc_private, GDK_GC_FOREGROUND|GDK_GC_BACKGROUND);
 }
 
 typedef struct
@@ -374,12 +452,12 @@ gdk_draw_text_handler (GdkWin32SingleFont *singlefont,
 
   if ((oldfont = SelectObject (argp->hdc, singlefont->xfont)) == NULL)
     {
-      g_warning ("gdk_draw_text_handler: SelectObject failed");
+      WIN32_API_FAILED ("SelectObject");
       return;
     }
   
   if (!TextOutW (argp->hdc, argp->x, argp->y, wcstr, wclen))
-    g_warning ("gdk_draw_text_handler: TextOutW failed");
+    WIN32_API_FAILED ("TextOutW");
   GetTextExtentPoint32W (argp->hdc, wcstr, wclen, &size);
   argp->x += size.cx;
 
@@ -413,7 +491,8 @@ gdk_win32_draw_text (GdkDrawable *drawable,
 
   arg.x = x;
   arg.y = y;
-  arg.hdc = gdk_gc_predraw (drawable, gc_private);
+  arg.hdc = gdk_gc_predraw (drawable, gc_private,
+                           GDK_GC_FOREGROUND|GDK_GC_FONT);
 
   GDK_NOTE (MISC, g_print ("gdk_draw_text: %#x (%d,%d) \"%.*s\" (len %d)\n",
                           GDK_DRAWABLE_XID (drawable),
@@ -430,7 +509,7 @@ gdk_win32_draw_text (GdkDrawable *drawable,
 
   g_free (wcstr);
 
-  gdk_gc_postdraw (drawable, gc_private);
+  gdk_gc_postdraw (drawable, gc_private, GDK_GC_FOREGROUND|GDK_GC_FONT);
 }
 
 static void
@@ -460,7 +539,8 @@ gdk_win32_draw_text_wc (GdkDrawable  *drawable,
 
   arg.x = x;
   arg.y = y;
-  arg.hdc = gdk_gc_predraw (drawable, gc_private);
+  arg.hdc = gdk_gc_predraw (drawable, gc_private,
+                           GDK_GC_FOREGROUND|GDK_GC_FONT);
 
   GDK_NOTE (MISC, g_print ("gdk_draw_text_wc: %#x (%d,%d) len: %d\n",
                           GDK_DRAWABLE_XID (drawable),
@@ -481,7 +561,7 @@ gdk_win32_draw_text_wc (GdkDrawable  *drawable,
   if (sizeof (wchar_t) != sizeof (GdkWChar))
     g_free (wcstr);
 
-  gdk_gc_postdraw (drawable, gc_private);
+  gdk_gc_postdraw (drawable, gc_private, GDK_GC_FOREGROUND|GDK_GC_FONT);
 }
 
 static void
@@ -514,7 +594,7 @@ gdk_win32_draw_drawable (GdkDrawable *drawable,
                           width, height, xsrc, ysrc,
                           GDK_DRAWABLE_XID (drawable), xdest, ydest));
 
-  hdc = gdk_gc_predraw (drawable, gc_private);
+  hdc = gdk_gc_predraw (drawable, gc_private, 0);
 
   src_rgn = CreateRectRgn (0, 0, src_private->width + 1, src_private->height + 1);
   draw_rgn = CreateRectRgn (xsrc, ysrc, xsrc + width + 1, ysrc + height + 1);
@@ -573,20 +653,20 @@ gdk_win32_draw_drawable (GdkDrawable *drawable,
   if (src_private->window_type == GDK_DRAWABLE_PIXMAP)
     {
       if ((srcdc = CreateCompatibleDC (hdc)) == NULL)
-       g_warning ("gdk_draw_pixmap: CreateCompatibleDC failed");
+       WIN32_API_FAILED ("CreateCompatibleDC");
       
       if ((hgdiobj = SelectObject (srcdc, GDK_DRAWABLE_XID (src))) == NULL)
-       g_warning ("gdk_draw_pixmap: SelectObject #1 failed");
+       WIN32_API_FAILED ("SelectObject #1");
       
       if (!BitBlt (hdc, xdest, ydest, width, height,
                   srcdc, xsrc, ysrc, SRCCOPY))
-       g_warning ("gdk_draw_pixmap: BitBlt failed");
+       WIN32_API_FAILED ("BitBlt");
       
       if ((SelectObject (srcdc, hgdiobj) == NULL))
-       g_warning ("gdk_draw_pixmap: SelectObject #2 failed");
+       WIN32_API_FAILED ("SelectObject #2");
       
       if (!DeleteDC (srcdc))
-       g_warning ("gdk_draw_pixmap: DeleteDC failed");
+       WIN32_API_FAILED ("DeleteDC");
     }
   else
     {
@@ -611,24 +691,24 @@ gdk_win32_draw_drawable (GdkDrawable *drawable,
          if (!ScrollDC (hdc, xdest - xsrc, ydest - ysrc,
                         &scrollRect, &clipRect,
                         updateRgn, NULL))
-           g_warning ("gdk_draw_pixmap: ScrollDC failed");
+           WIN32_API_FAILED ("ScrollDC");
          if (!InvalidateRgn (GDK_DRAWABLE_XID (drawable), updateRgn, FALSE))
-           g_warning ("gdk_draw_pixmap: InvalidateRgn failed");
+           WIN32_API_FAILED ("InvalidateRgn");
          if (!UpdateWindow (GDK_DRAWABLE_XID (drawable)))
-           g_warning ("gdk_draw_pixmap: UpdateWindow failed");
+           WIN32_API_FAILED ("UpdateWindow");
        }
       else
        {
          if ((srcdc = GetDC (GDK_DRAWABLE_XID (src))) == NULL)
-           g_warning ("gdk_draw_pixmap: GetDC failed");
+           WIN32_API_FAILED ("GetDC");
          
          if (!BitBlt (hdc, xdest, ydest, width, height,
                       srcdc, xsrc, ysrc, SRCCOPY))
-           g_warning ("gdk_draw_pixmap: BitBlt failed");
+           WIN32_API_FAILED ("BitBlt");
          ReleaseDC (GDK_DRAWABLE_XID (src), srcdc);
        }
     }
-  gdk_gc_postdraw (drawable, gc_private);
+  gdk_gc_postdraw (drawable, gc_private, 0);
 }
 
 static void
@@ -637,28 +717,26 @@ gdk_win32_draw_points (GdkDrawable *drawable,
                       GdkPoint    *points,
                       gint         npoints)
 {
-  GdkGCPrivate *gc_private;
+  GdkGCPrivate *gc_private = (GdkGCPrivate*) gc;
+  GdkGCWin32Data *gc_data = GDK_GC_WIN32DATA (gc_private);
   HDC hdc;
+  COLORREF fg;
   int i;
 
-  gc_private = (GdkGCPrivate*) gc;
-
-  hdc = gdk_gc_predraw (drawable, gc_private);
-  
   GDK_NOTE (MISC, g_print ("gdk_draw_points: %#x destdc: (%d) %#x "
                           "npoints: %d\n",
                           GDK_DRAWABLE_XID (drawable),
                           gc_private, hdc,
                           npoints));
 
+  hdc = gdk_gc_predraw (drawable, gc_private, GDK_GC_FOREGROUND);
+  fg = GetTextColor (hdc);
+
   for (i = 0; i < npoints; i++)
     {
-      if (!MoveToEx (hdc, points[i].x, points[i].y, NULL))
-       g_warning ("gdk_draw_points: MoveToEx failed");
-      if (!LineTo (hdc, points[i].x + 1, points[i].y))
-       g_warning ("gdk_draw_points: LineTo failed");
+      SetPixel (hdc, points[i].x, points[i].y, fg);
     }
-  gdk_gc_postdraw (drawable, gc_private);
+  gdk_gc_postdraw (drawable, gc_private, GDK_GC_FOREGROUND);
 }
 
 static void
@@ -667,27 +745,65 @@ gdk_win32_draw_segments (GdkDrawable *drawable,
                         GdkSegment  *segs,
                         gint         nsegs)
 {
-  GdkGCPrivate *gc_private;
+  GdkGCPrivate *gc_private = (GdkGCPrivate*) gc;
+  GdkGCWin32Data *gc_data = GDK_GC_WIN32DATA (gc_private);
   HDC hdc;
   int i;
 
-  gc_private = (GdkGCPrivate*) gc;
+  GDK_NOTE (MISC, g_print ("gdk_win32_draw_segments: %#x destdc: (%d) %#x "
+                          "nsegs: %d\n",
+                          GDK_DRAWABLE_XID (drawable),
+                          gc_private, hdc,
+                          nsegs));
 
-  hdc = gdk_gc_predraw (drawable, gc_private);
+  hdc = gdk_gc_predraw (drawable, gc_private,
+                       GDK_GC_FOREGROUND|GDK_GC_BACKGROUND);
 
-  for (i = 0; i < nsegs; i++)
+  if (gc_data->fill_style == GDK_OPAQUE_STIPPLED)
     {
-      if (!MoveToEx (hdc, segs[i].x1, segs[i].y1, NULL))
-       g_warning ("gdk_draw_segments: MoveToEx failed");
-      if (!LineTo (hdc, segs[i].x2, segs[i].y2))
-       g_warning ("gdk_draw_segments: LineTo #1 failed");
-      
-      /* Draw end pixel */
-      if (GDK_GC_WIN32DATA (gc)->pen_width == 1)
-       if (!LineTo (hdc, segs[i].x2 + 1, segs[i].y2))
-         g_warning ("gdk_draw_segments: LineTo #2 failed");
+      if (!BeginPath (hdc))
+       WIN32_API_FAILED ("BeginPath");
+      else
+       {
+         for (i = 0; i < nsegs; i++)
+           {
+             if (!MoveToEx (hdc, segs[i].x1, segs[i].y1, NULL))
+               WIN32_API_FAILED ("MoveToEx");
+             if (!LineTo (hdc, segs[i].x2, segs[i].y2))
+               WIN32_API_FAILED ("LineTo #1");
+         
+             /* Draw end pixel */
+             if (gc_data->pen_width == 1)
+               if (!LineTo (hdc, segs[i].x2 + 1, segs[i].y2))
+                 WIN32_API_FAILED ("LineTo #2");
+           }
+
+         if (!EndPath (hdc))
+           WIN32_API_FAILED ("EndPath");
+         
+         if (!WidenPath (hdc))
+           WIN32_API_FAILED ("WidenPath");
+         
+         if (!FillPath (hdc))
+           WIN32_API_FAILED ("FillPath");
+       }
     }
-  gdk_gc_postdraw (drawable, gc_private);
+  else
+    {
+      for (i = 0; i < nsegs; i++)
+       {
+         if (!MoveToEx (hdc, segs[i].x1, segs[i].y1, NULL))
+           WIN32_API_FAILED ("MoveToEx");
+         if (!LineTo (hdc, segs[i].x2, segs[i].y2))
+           WIN32_API_FAILED ("LineTo #1");
+         
+         /* Draw end pixel */
+         if (gc_data->pen_width == 1)
+           if (!LineTo (hdc, segs[i].x2 + 1, segs[i].y2))
+             WIN32_API_FAILED ("LineTo #2");
+       }
+    }
+  gdk_gc_postdraw (drawable, gc_private, GDK_GC_FOREGROUND|GDK_GC_BACKGROUND);
 }
 
 static void
@@ -696,7 +812,8 @@ gdk_win32_draw_lines (GdkDrawable *drawable,
                      GdkPoint    *points,
                      gint         npoints)
 {
-  GdkGCPrivate *gc_private;
+  GdkGCPrivate *gc_private = (GdkGCPrivate*) gc;
+  GdkGCWin32Data *gc_data = GDK_GC_WIN32DATA (gc_private);
   HDC hdc;
   POINT *pts;
   int i;
@@ -704,11 +821,10 @@ gdk_win32_draw_lines (GdkDrawable *drawable,
   if (npoints < 2)
     return;
 
-  gc_private = (GdkGCPrivate*) gc;
-
-  hdc = gdk_gc_predraw (drawable, gc_private);
+  hdc = gdk_gc_predraw (drawable, gc_private,
+                       GDK_GC_FOREGROUND|GDK_GC_BACKGROUND);
 #if 1
-  pts = g_malloc (npoints * sizeof (POINT));
+  pts = g_new (POINT, npoints);
 
   for (i = 0; i < npoints; i++)
     {
@@ -717,31 +833,31 @@ gdk_win32_draw_lines (GdkDrawable *drawable,
     }
   
   if (!Polyline (hdc, pts, npoints))
-    g_warning ("gdk_draw_lines: Polyline(,,%d) failed", npoints);
+    WIN32_API_FAILED ("Polyline");
   
   g_free (pts);
   
   /* Draw end pixel */
-  if (GDK_GC_WIN32DATA (gc)->pen_width == 1)
+  if (gc_data->pen_width == 1)
     {
       MoveToEx (hdc, points[npoints-1].x, points[npoints-1].y, NULL);
       if (!LineTo (hdc, points[npoints-1].x + 1, points[npoints-1].y))
-       g_warning ("gdk_draw_lines: LineTo failed");
+       WIN32_API_FAILED ("LineTo");
     }
 #else
   MoveToEx (hdc, points[0].x, points[0].y, NULL);
   for (i = 1; i < npoints; i++)
     if (!LineTo (hdc, points[i].x, points[i].y))
-      g_warning ("gdk_draw_lines: LineTo #1 failed");
+      WIN32_API_FAILED ("LineTo #1");
   
   /* Draw end pixel */
   /* LineTo doesn't draw the last point, so if we have a pen width of 1,
    * we draw the end pixel separately... With wider pens we don't care.
    * //HB: But the NT developers don't read their API documentation ...
    */
-  if (GDK_GC_WIN32DATA (gc)->pen_width == 1 && windows_version > 0x80000000)
+  if (gc_data->pen_width == 1 && windows_version > 0x80000000)
     if (!LineTo (hdc, points[npoints-1].x + 1, points[npoints-1].y))
-      g_warning ("gdk_draw_lines: LineTo #2 failed");
+      WIN32_API_FAILED ("LineTo #2");
 #endif 
-  gdk_gc_postdraw (drawable, gc_private);
+  gdk_gc_postdraw (drawable, gc_private, GDK_GC_FOREGROUND|GDK_GC_BACKGROUND);
 }
index deb84623752f5dd73d2ce4ca32fecc9e9727b027..ed5e7c7f74fbff03c11970d1367f7c188d9830dc 100644 (file)
@@ -3692,9 +3692,9 @@ gdk_event_translate (GdkEvent *event,
 
          if (SelectPalette (hdc,  colormap_private->xcolormap->palette,
                             FALSE) == NULL)
-           g_warning ("WM_ERASEBKGND: SelectPalette failed");
+           WIN32_API_FAILED ("SelectPalette");
          if ((k = RealizePalette (hdc)) == GDI_ERROR)
-           g_warning ("WM_ERASEBKGND: RealizePalette failed");
+           WIN32_API_FAILED ("RealizePalette");
 #if 0
          g_print ("WM_ERASEBKGND: selected %#x, realized %d colors\n",
                   colormap_private->xcolormap->palette, k);
@@ -3740,7 +3740,7 @@ gdk_event_translate (GdkEvent *event,
          g_print ("...CreateSolidBrush (%.08x) = %.08x\n", bg, hbr);
 #endif
          if (!FillRect (hdc, &rect, hbr))
-           g_warning ("WM_ERASEBKGND: FillRect failed");
+           WIN32_API_FAILED ("FillRect");
          DeleteObject (hbr);
        }
       else if (GDK_WINDOW_WIN32DATA(window)->bg_type == GDK_WIN32_BG_PIXMAP)
@@ -3755,7 +3755,7 @@ gdk_event_translate (GdkEvent *event,
              GDK_NOTE (EVENTS, g_print ("...small pixmap, using brush\n"));
              hbr = CreatePatternBrush (GDK_DRAWABLE_XID (pixmap));
              if (!FillRect (hdc, &rect, hbr))
-               g_warning ("WM_ERASEBKGND: FillRect failed");
+               WIN32_API_FAILED ("FillRect");
              DeleteObject (hbr);
            }
          else
@@ -3771,12 +3771,12 @@ gdk_event_translate (GdkEvent *event,
 
              if (!(bgdc = CreateCompatibleDC (hdc)))
                {
-                 g_warning ("WM_ERASEBKGND: CreateCompatibleDC failed");
+                 WIN32_API_FAILED ("CreateCompatibleDC");
                  break;
                }
              if (!(oldbitmap = SelectObject (bgdc, GDK_DRAWABLE_XID (pixmap))))
                {
-                 g_warning ("WM_ERASEBKGND: SelectObject failed");
+                 WIN32_API_FAILED ("SelectObject");
                  DeleteDC (bgdc);
                  break;
                }
@@ -3793,7 +3793,7 @@ gdk_event_translate (GdkEvent *event,
                                       pixmap_private->width, pixmap_private->height,
                                       bgdc, 0, 0, SRCCOPY))
                            {
-                             g_warning ("WM_ERASEBKGND: BitBlt failed");
+                             WIN32_API_FAILED (" BitBlt");
                              goto loopexit;
                            }
                        }
@@ -3812,7 +3812,7 @@ gdk_event_translate (GdkEvent *event,
          hbr = GetStockObject (BLACK_BRUSH);
          GetClipBox (hdc, &rect);
          if (!FillRect (hdc, &rect, hbr))
-           g_warning ("WM_ERASEBKGND: FillRect failed");
+           WIN32_API_FAILED ("FillRect");
        }
       break;
 
@@ -4073,7 +4073,7 @@ gdk_event_translate (GdkEvent *event,
        strcpy (ptr, "Huhhaa");
        GlobalUnlock (hdata);
        if (!SetClipboardData (CF_TEXT, hdata))
-         g_print ("SetClipboardData failed: %d\n", GetLastError ());
+         WIN32_API_FAILED ("SetClipboardData");
       }
       *ret_valp = 0;
       *ret_val_flagp = TRUE;
index 788dd3256448b87e6207c9264fe7f654d0bb0cf5..3301be3f7cce3a442e6358a9b3ac3c3f091b267b 100644 (file)
@@ -282,7 +282,7 @@ gdk_font_full_name_get (GdkFont *font)
 
       if (GetObject (singlefont->xfont, sizeof (LOGFONT), &logfont) == 0)
        {
-         g_warning ("gdk_font_full_name_get: GetObject failed");
+         WIN32_API_FAILED ("GetObject");
          return NULL;
        }
 
@@ -1771,7 +1771,7 @@ gdk_text_size_handler (GdkWin32SingleFont *singlefont,
 
   if ((oldfont = SelectObject (gdk_DC, singlefont->xfont)) == NULL)
     {
-      g_warning ("gdk_text_size_handler: SelectObject failed");
+      WIN32_API_FAILED ("SelectObject");
       return;
     }
   GetTextExtentPoint32W (gdk_DC, wcstr, wclen, &this_size);
index 0030377abb2cf042671b39ec17d16bb621d5e3a3..a8a52ba8c52aa7a6c8d46957800c506a73142f5f 100644 (file)
@@ -52,229 +52,368 @@ static GdkGCClass gdk_win32_gc_class = {
   gdk_win32_gc_set_dashes
 };
 
-GdkGC*
-_gdk_win32_gc_new (GdkDrawable   *drawable,
-                  GdkGCValues    *values,
-                  GdkGCValuesMask values_mask)
-{
-  GdkGC *gc;
-  GdkGCPrivate *private;
-  GdkGCWin32Data *data;
-  static GdkColor black;
-  static GdkColor white;
-  static gboolean beenhere = FALSE;
-
-  if (!beenhere)
-    {
-      gdk_color_black (gdk_colormap_get_system (), &black);
-      gdk_color_white (gdk_colormap_get_system (), &white);
-      beenhere = TRUE;
-    }
-
-  gc = gdk_gc_alloc ();
-  private = (GdkGCPrivate *)gc;
-
-  private->klass = &gdk_win32_gc_class;
-  private->klass_data = data = g_new (GdkGCWin32Data, 1);
-    
-  data->rop2 = R2_COPYPEN;
-  data->fill_style = GDK_SOLID;
-  data->values_mask = values_mask;
-  data->values_mask |= GDK_GC_FUNCTION | GDK_GC_FILL;
+static void
+gdk_win32_gc_values_to_win32values (GdkGCValues    *values,
+                                   GdkGCValuesMask mask,
+                                   GdkGCWin32Data *data)
+{                                  
+  char *s = "";
 
-  GDK_NOTE (MISC, g_print ("_gdk_win32_gc_new: {"));
+  GDK_NOTE (MISC, g_print ("{"));
 
-  if (values_mask & GDK_GC_FOREGROUND)
+  if (mask & GDK_GC_FOREGROUND)
     {
-      data->foreground = values->foreground;
+      data->foreground = values->foreground.pixel;
+      data->values_mask |= GDK_GC_FOREGROUND;
+      GDK_NOTE (MISC, (g_print ("fg=%.06x", data->foreground),
+                      s = ","));
     }
-  else
-    data->foreground = black;
   
-  if (values_mask & GDK_GC_BACKGROUND)
+  if (mask & GDK_GC_BACKGROUND)
     {
-      data->background = values->background;
+      data->background = values->background.pixel;
+      data->values_mask |= GDK_GC_BACKGROUND;
+      GDK_NOTE (MISC, (g_print ("%sbg=%.06x", s, data->background),
+                      s = ","));
     }
-  else
-    data->background = white;
 
-  if ((values_mask & GDK_GC_FONT) && (values->font->type == GDK_FONT_FONT
-                                     || values->font->type == GDK_FONT_FONTSET))
+  if ((mask & GDK_GC_FONT) && (values->font->type == GDK_FONT_FONT
+                              || values->font->type == GDK_FONT_FONTSET))
     {
+      if (data->font != NULL)
+       gdk_font_unref (data->font);
       data->font = values->font;
-      gdk_font_ref (data->font);
-      GDK_NOTE (MISC, g_print (" font"));
+      if (data->font != NULL)
+       {
+         gchar *xlfd;
+
+         gdk_font_ref (data->font);
+         data->values_mask |= GDK_GC_FONT;
+         GDK_NOTE (MISC, (xlfd = gdk_font_full_name_get (data->font),
+                          g_print ("%sfont=%s", s, xlfd),
+                          s = ",",
+                          gdk_font_full_name_free (xlfd)));
+       }
+      else
+       {
+         data->values_mask &= ~GDK_GC_FONT;
+         GDK_NOTE (MISC, (g_print ("%sfont=NULL"),
+                          s = ","));
+       }
     }
-  else
-    data->font = NULL;
 
-  if (values_mask & GDK_GC_FUNCTION)
+  if (mask & GDK_GC_FUNCTION)
     {
+      GDK_NOTE (MISC, (g_print ("%srop2=", s),
+                      s = ","));
       switch (values->function)
        {
        case GDK_COPY:
-         data->rop2 = R2_COPYPEN; break;
+         data->rop2 = R2_COPYPEN;
+         GDK_NOTE (MISC, g_print ("COPYPEN"));
+         break;
        case GDK_INVERT:
-         data->rop2 = R2_NOT; break;
+         data->rop2 = R2_NOT;
+         GDK_NOTE (MISC, g_print ("NOT"));
+         break;
        case GDK_XOR:
-         data->rop2 = R2_XORPEN; break;
+         data->rop2 = R2_XORPEN;
+         GDK_NOTE (MISC, g_print ("XORPEN"));
+         break;
        case GDK_CLEAR:
-         data->rop2 = R2_BLACK; break;
+         data->rop2 = R2_BLACK;
+         GDK_NOTE (MISC, g_print ("BLACK"));
+         break;
        case GDK_AND:
-         data->rop2 = R2_MASKPEN; break;
+         data->rop2 = R2_MASKPEN;
+         GDK_NOTE (MISC, g_print ("MASKPEN"));
+         break;
        case GDK_AND_REVERSE:
-         data->rop2 = R2_MASKPENNOT; break;
+         data->rop2 = R2_MASKPENNOT;
+         GDK_NOTE (MISC, g_print ("MASKPENNOT"));
+         break;
        case GDK_AND_INVERT:
-         data->rop2 = R2_MASKNOTPEN; break;
+         data->rop2 = R2_MASKNOTPEN;
+         GDK_NOTE (MISC, g_print ("MASKNOTPEN"));
+         break;
        case GDK_NOOP:
-         data->rop2 = R2_NOP; break;
+         data->rop2 = R2_NOP;
+         GDK_NOTE (MISC, g_print ("NOP"));
+         break;
        case GDK_OR:
-         data->rop2 = R2_MERGEPEN; break;
+         data->rop2 = R2_MERGEPEN;
+         GDK_NOTE (MISC, g_print ("MERGEPEN"));
+         break;
        case GDK_EQUIV:
-         data->rop2 = R2_NOTXORPEN; break;
+         data->rop2 = R2_NOTXORPEN;
+         GDK_NOTE (MISC, g_print ("NOTXORPEN"));
+         break;
        case GDK_OR_REVERSE:
-         data->rop2 = R2_MERGEPENNOT; break;
+         data->rop2 = R2_MERGEPENNOT;
+         GDK_NOTE (MISC, g_print ("MERGEPENNOT"));
+         break;
        case GDK_COPY_INVERT:
-         data->rop2 = R2_NOTCOPYPEN; break;
+         data->rop2 = R2_NOTCOPYPEN;
+         GDK_NOTE (MISC, g_print ("NOTCOPYPEN"));
+         break;
        case GDK_OR_INVERT:
-         data->rop2 = R2_MERGENOTPEN; break;
+         data->rop2 = R2_MERGENOTPEN;
+         GDK_NOTE (MISC, g_print ("MERGENOTPEN"));
+         break;
        case GDK_NAND:
-         data->rop2 = R2_NOTMASKPEN; break;
+         data->rop2 = R2_NOTMASKPEN;
+         GDK_NOTE (MISC, g_print ("NOTMASKPEN"));
+         break;
        case GDK_SET:
-         data->rop2 = R2_WHITE; break;
+         data->rop2 = R2_WHITE;
+         GDK_NOTE (MISC, g_print ("WHITE"));
+         break;
        }
-      GDK_NOTE (MISC, g_print (" function=%d", data->rop2));
+      data->values_mask |= GDK_GC_FUNCTION;
     }
 
-  if (values_mask & GDK_GC_FILL)
+  if (mask & GDK_GC_FILL)
     {
       data->fill_style = values->fill;
-      GDK_NOTE (MISC, g_print (" fill=%d", data->fill_style));
+      data->values_mask |= GDK_GC_FILL;
+      GDK_NOTE (MISC, (g_print ("%sfill=%d", s, data->fill_style),
+                      s = ","));
     }
 
-  if (values_mask & GDK_GC_TILE)
+  if (mask & GDK_GC_TILE)
     {
+      if (data->tile != NULL)
+       gdk_drawable_unref (data->tile);
       data->tile = values->tile;
-      gdk_drawable_ref (data->tile);
-      GDK_NOTE (MISC, g_print (" tile=%#x", GDK_DRAWABLE_XID (data->tile)));
+      if (data->tile != NULL)
+       {
+         gdk_drawable_ref (data->tile);
+         data->values_mask |= GDK_GC_TILE;
+         GDK_NOTE (MISC, (g_print ("%stile=%#x", s,
+                                   GDK_DRAWABLE_XID (data->tile)),
+                          s = ","));
+       }
+      else
+       {
+         data->values_mask &= ~GDK_GC_TILE;
+         GDK_NOTE (MISC, (g_print ("%stile=NULL", s),
+                          s = ","));
+       }
     }
-  else
-    data->tile = NULL;
 
-  if (values_mask & GDK_GC_STIPPLE)
+  if (mask & GDK_GC_STIPPLE)
     {
+      if (data->stipple != NULL)
+       gdk_drawable_unref (data->stipple);
       data->stipple = values->stipple;
-      gdk_drawable_ref (data->stipple);
-      GDK_NOTE (MISC, g_print (" stipple=%#x", GDK_DRAWABLE_XID (data->stipple)));
+      if (data->stipple != NULL)
+       {
+         gdk_drawable_ref (data->stipple);
+         data->values_mask |= GDK_GC_STIPPLE;
+         GDK_NOTE (MISC, (g_print ("%sstipple=%#x", s,
+                                   GDK_DRAWABLE_XID (data->stipple)),
+                          s = ","));
+       }
+      else
+       {
+         data->values_mask &= ~GDK_GC_STIPPLE;
+         GDK_NOTE (MISC, (g_print ("%sstipple=NULL", s),
+                          s = ","));
+       }
     }
-  else
-    data->stipple = NULL;
 
-  if (values_mask & GDK_GC_CLIP_MASK)
+  if (mask & GDK_GC_CLIP_MASK)
     {
-      data->clip_region =
-       BitmapToRegion ((HBITMAP) GDK_DRAWABLE_XID (values->clip_mask));
-      GDK_NOTE (MISC, g_print (" clip=%#x", data->clip_region));
+      if (data->clip_region != NULL)
+       if (!DeleteObject (data->clip_region))
+         WIN32_API_FAILED ("DeleteObject");
+      if (values->clip_mask != NULL)
+       {
+         data->clip_region =
+           BitmapToRegion ((HBITMAP) GDK_DRAWABLE_XID (values->clip_mask));
+         data->values_mask |= GDK_GC_CLIP_MASK;
+       }
+      else
+       {
+         data->clip_region = NULL;
+         data->values_mask &= ~GDK_GC_CLIP_MASK;
+       }
+      GDK_NOTE (MISC, (g_print ("%sclip=%#x", s, data->clip_region),
+                      s = ","));
     }
-  else
-    data->clip_region = NULL;
 
-  if (values_mask & GDK_GC_SUBWINDOW)
+  if (mask & GDK_GC_SUBWINDOW)
     {
       data->subwindow_mode = values->subwindow_mode;
-      GDK_NOTE (MISC, g_print (" subw=%d", data->subwindow_mode));
+      data->values_mask |= GDK_GC_SUBWINDOW;
+      GDK_NOTE (MISC, (g_print ("%ssubw=%d", s, data->subwindow_mode),
+                      s = ","));
     }
 
-  if (values_mask & GDK_GC_TS_X_ORIGIN)
+  if (mask & GDK_GC_TS_X_ORIGIN)
     {
       data->ts_x_origin = values->ts_x_origin;
-      GDK_NOTE (MISC, g_print (" ts_x=%d", data->ts_x_origin));
+      data->values_mask |= GDK_GC_TS_X_ORIGIN;
+      GDK_NOTE (MISC, (g_print ("%sts_x=%d", s, data->ts_x_origin),
+                      s = ","));
     }
 
-  if (values_mask & GDK_GC_TS_Y_ORIGIN)
+  if (mask & GDK_GC_TS_Y_ORIGIN)
     {
       data->ts_y_origin = values->ts_y_origin;
-      GDK_NOTE (MISC, g_print (" ts_y=%d", data->ts_y_origin));
+      data->values_mask |= GDK_GC_TS_Y_ORIGIN;
+      GDK_NOTE (MISC, (g_print ("%sts_y=%d", s, data->ts_y_origin),
+                      s = ","));
     }
 
-  if (values_mask & GDK_GC_CLIP_X_ORIGIN)
+  if (mask & GDK_GC_CLIP_X_ORIGIN)
     {
       data->clip_x_origin = values->clip_x_origin;
-      GDK_NOTE (MISC, g_print (" clip_x=%d", data->clip_x_origin));
+      data->values_mask |= GDK_GC_CLIP_X_ORIGIN;
+      GDK_NOTE (MISC, (g_print ("%sclip_x=%d", s, data->clip_x_origin),
+                      s = ","));
     }
 
-  if (values_mask & GDK_GC_CLIP_Y_ORIGIN)
+  if (mask & GDK_GC_CLIP_Y_ORIGIN)
     {
       data->clip_y_origin = values->clip_y_origin; 
-      GDK_NOTE (MISC, g_print (" clip_y=%d", data->clip_y_origin));
+      data->values_mask |= GDK_GC_CLIP_Y_ORIGIN;
+      GDK_NOTE (MISC, (g_print ("%sclip_y=%d", s, data->clip_y_origin),
+                      s = ","));
    }
  
-  if (values_mask & GDK_GC_EXPOSURES)
+  if (mask & GDK_GC_EXPOSURES)
     {
       data->graphics_exposures = values->graphics_exposures;
-      GDK_NOTE (MISC, g_print (" exp=%d", data->graphics_exposures));
+      data->values_mask |= GDK_GC_EXPOSURES;
+      GDK_NOTE (MISC, (g_print ("%sexp=%d", s, data->graphics_exposures),
+                      s = ","));
     }
 
-  data->pen_style = PS_GEOMETRIC;
-  data->pen_width = 1;
+  if (mask & GDK_GC_LINE_WIDTH)
+    {
+      data->pen_width = values->line_width;
+      data->values_mask |= GDK_GC_LINE_WIDTH;
+      GDK_NOTE (MISC, (g_print ("%spw=%d", s, data->pen_width),
+                      s = ","));
+    }
 
-  if (values_mask & (GDK_GC_LINE_WIDTH | GDK_GC_LINE_STYLE))
+  if (mask & GDK_GC_LINE_STYLE)
     {
-      if (values_mask & GDK_GC_LINE_WIDTH)
-       {
-         data->pen_width = values->line_width;
-         GDK_NOTE (MISC, g_print (" pw=%d", data->pen_width));
-       }
-      if (values_mask & GDK_GC_LINE_STYLE)
+      data->pen_style &= ~(PS_STYLE_MASK);
+      GDK_NOTE (MISC, (g_print ("%sps|=", s),
+                      s = ","));
+      switch (values->line_style)
        {
-         switch (values->line_style)
-           {
-           case GDK_LINE_SOLID:
-             data->pen_style |= PS_SOLID; break;
-           case GDK_LINE_ON_OFF_DASH:
-           case GDK_LINE_DOUBLE_DASH: /* ??? */
-             data->pen_style |= PS_DASH; break;
-           }
-         GDK_NOTE (MISC, g_print (" ps=%#x", data->pen_style));
+       case GDK_LINE_SOLID:
+         GDK_NOTE (MISC, g_print ("LINE_SOLID"));
+         data->pen_style |= PS_SOLID;
+         break;
+       case GDK_LINE_ON_OFF_DASH:
+       case GDK_LINE_DOUBLE_DASH: /* ??? */
+         GDK_NOTE (MISC, g_print ("DASH"));
+         data->pen_style |= PS_DASH;
+         break;
        }
+      data->values_mask |= GDK_GC_LINE_STYLE;
     }
 
-  if (values_mask & GDK_GC_CAP_STYLE)
+  if (mask & GDK_GC_CAP_STYLE)
     {
+      data->pen_style &= ~(PS_ENDCAP_MASK);
+      GDK_NOTE (MISC, (g_print ("%sps|=", s),
+                      s = ","));
       switch (values->cap_style)
        {
        case GDK_CAP_NOT_LAST:  /* ??? */
        case GDK_CAP_BUTT:
-         data->pen_style |= PS_ENDCAP_FLAT;    break;
+         GDK_NOTE (MISC, g_print ("ENDCAP_FLAT"));
+         data->pen_style |= PS_ENDCAP_FLAT;
+         break;
        case GDK_CAP_ROUND:
-         data->pen_style |= PS_ENDCAP_ROUND; break;
+         GDK_NOTE (MISC, g_print ("ENDCAP_ROUND"));
+         data->pen_style |= PS_ENDCAP_ROUND;
+         break;
        case GDK_CAP_PROJECTING:
-         data->pen_style |= PS_ENDCAP_SQUARE; break;
+         GDK_NOTE (MISC, g_print ("ENDCAP_SQUARE"));
+         data->pen_style |= PS_ENDCAP_SQUARE;
+         break;
        }
-      GDK_NOTE (MISC, g_print (" ps=%#x", data->pen_style));
+      data->values_mask |= GDK_GC_CAP_STYLE;
     }
 
-  if (values_mask & GDK_GC_JOIN_STYLE)
+  if (mask & GDK_GC_JOIN_STYLE)
     {
+      data->pen_style &= ~(PS_JOIN_MASK);
+      GDK_NOTE (MISC, (g_print ("%sps|=", s),
+                      s = ","));
       switch (values->join_style)
        {
        case GDK_JOIN_MITER:
+         GDK_NOTE (MISC, g_print ("JOIN_MITER"));
          data->pen_style |= PS_JOIN_MITER;
          break;
        case GDK_JOIN_ROUND:
+         GDK_NOTE (MISC, g_print ("JOIN_ROUND"));
          data->pen_style |= PS_JOIN_ROUND;
          break;
        case GDK_JOIN_BEVEL:
+         GDK_NOTE (MISC, g_print ("JOIN_BEVEL"));
          data->pen_style |= PS_JOIN_BEVEL;
          break;
        }
-      GDK_NOTE (MISC, g_print (" ps=%#x", data->pen_style));
+      data->values_mask |= GDK_GC_JOIN_STYLE;
+    }
+  GDK_NOTE (MISC, g_print ("}\n"));
+}
+
+GdkGC*
+_gdk_win32_gc_new (GdkDrawable   *drawable,
+                  GdkGCValues    *values,
+                  GdkGCValuesMask mask)
+{
+  GdkGC *gc;
+  GdkGCPrivate *private;
+  GdkGCWin32Data *data;
+  static GdkColor black;
+  static GdkColor white;
+  static gboolean beenhere = FALSE;
+
+  if (!beenhere)
+    {
+      gdk_color_black (gdk_colormap_get_system (), &black);
+      gdk_color_white (gdk_colormap_get_system (), &white);
+      beenhere = TRUE;
     }
 
+  gc = gdk_gc_alloc ();
+  private = (GdkGCPrivate *)gc;
+
+  private->klass = &gdk_win32_gc_class;
+  private->klass_data = data = g_new (GdkGCWin32Data, 1);
+    
+  data->foreground = black.pixel;
+  data->background = white.pixel;
+  data->font = NULL;
+  data->rop2 = R2_COPYPEN;
+  data->fill_style = GDK_SOLID;
+  data->tile = NULL;
+  data->stipple = NULL;
+  data->clip_region = NULL;
+  data->ts_x_origin = data->ts_y_origin =
+    data->clip_x_origin = data->clip_y_origin = 0;
+  data->pen_style = PS_GEOMETRIC;
+  data->pen_width = 1;
+
+  data->values_mask = GDK_GC_FUNCTION | GDK_GC_FILL;
+
+  GDK_NOTE (MISC, g_print ("_gdk_win32_gc_new: "));
+  gdk_win32_gc_values_to_win32values (values, mask, data);
+
   data->hwnd = NULL;
   data->xgc = NULL;
 
-  GDK_NOTE (MISC, g_print ("} = %p\n", gc));
+  GDK_NOTE (MISC, g_print (" = %p\n", gc));
 
   return gc;
 }
@@ -305,8 +444,8 @@ gdk_win32_gc_get_values (GdkGC       *gc,
 {
   GdkGCWin32Data *data = GDK_GC_WIN32DATA (gc);
 
-  values->foreground = data->foreground;
-  values->background = data->background;
+  values->foreground.pixel = data->foreground;
+  values->background.pixel = data->background;
   values->font = data->font;
 
   switch (data->rop2)
@@ -347,6 +486,7 @@ gdk_win32_gc_get_values (GdkGC       *gc,
 
   values->tile = data->tile;
   values->stipple = data->stipple;
+
   if (data->clip_region != NULL)
     {
       RECT rect;
@@ -361,18 +501,18 @@ gdk_win32_gc_get_values (GdkGC       *gc,
                        1);
       hbr = GetStockObject (WHITE_BRUSH);
       if ((hdc = CreateCompatibleDC (NULL)) == NULL)
-       g_warning ("gdk_gc_get_values: CreateCompatibleDC failed");
+       WIN32_API_FAILED ("CreateCompatibleDC");
       if ((oldbitmap =
           SelectObject (hdc, GDK_DRAWABLE_XID (pixmap))) == NULL)
-       g_warning ("gdk_gc_get_values: SelectObject #1 failed");
+       WIN32_API_FAILED ("SelectObject #1");
       hbr = GetStockObject (BLACK_BRUSH);
       if (!FillRect (hdc, &rect, hbr))
-       g_warning ("gdk_gc_get_values: FillRect failed");
+       WIN32_API_FAILED ("FillRect");
       hbr = GetStockObject (WHITE_BRUSH);
       if (!FillRgn (hdc, data->clip_region, hbr))
-       g_warning ("gdk_gc_get_values: FillRgn failed");
+       WIN32_API_FAILED ("FillRgn");
       if (SelectObject (hdc, oldbitmap) == NULL)
-       g_warning ("gdk_gc_get_values: SelectObject #2 failed");
+       WIN32_API_FAILED ("SelectObject #2");
       DeleteDC (hdc);
       values->clip_mask = pixmap;
     }
@@ -413,253 +553,13 @@ gdk_win32_gc_get_values (GdkGC       *gc,
 static void
 gdk_win32_gc_set_values (GdkGC           *gc,
                         GdkGCValues     *values,
-                        GdkGCValuesMask  values_mask)
+                        GdkGCValuesMask  mask)
 {
   GdkGCWin32Data *data = GDK_GC_WIN32DATA (gc);
-  gchar *xlfd;
-
-  GDK_NOTE (MISC, g_print ("gdk_win32_gc_set_values: {"));
-
-  if (values_mask & GDK_GC_FOREGROUND)
-    {
-      GDK_NOTE (MISC, g_print ("fg = %s ",
-                              gdk_color_to_string (&values->foreground)));
-      data->foreground = values->foreground;
-      data->values_mask |= GDK_GC_FOREGROUND;
-    }
-  
-  if (values_mask & GDK_GC_BACKGROUND)
-    {
-      GDK_NOTE (MISC, g_print ("bg = %s ",
-                              gdk_color_to_string (&values->background)));
-      data->background = values->background;
-      data->values_mask |= GDK_GC_BACKGROUND;
-    }
-
-  if (values_mask & GDK_GC_FONT)
-    {
-      if (data->font != NULL)
-       gdk_font_unref (data->font);
-      data->font = values->font;
-      if (data->font != NULL)
-       {
-         GDK_NOTE (MISC, (xlfd = gdk_font_full_name_get (data->font),
-                          g_print ("font = %s ", xlfd),
-                          gdk_font_full_name_free (xlfd)));
-         gdk_font_ref (data->font);
-         data->values_mask |= GDK_GC_FONT;
-       }
-      else
-       {
-         GDK_NOTE (MISC, g_print ("font = NULL "));
-         data->values_mask &= ~GDK_GC_FONT;
-       }
-    }
-
-  if (values_mask & GDK_GC_FUNCTION)
-    {
-      GDK_NOTE (MISC, g_print ("fun = %d ", values->function));
-
-      switch (values->function)
-       {
-       case GDK_COPY:
-         data->rop2 = R2_COPYPEN; break;
-       case GDK_INVERT:
-         data->rop2 = R2_NOT; break;
-       case GDK_XOR:
-         data->rop2 = R2_XORPEN; break;
-       case GDK_CLEAR:
-         data->rop2 = R2_BLACK; break;
-       case GDK_AND:
-         data->rop2 = R2_MASKPEN; break;
-       case GDK_AND_REVERSE:
-         data->rop2 = R2_MASKPENNOT; break;
-       case GDK_AND_INVERT:
-         data->rop2 = R2_MASKNOTPEN; break;
-       case GDK_NOOP:
-         data->rop2 = R2_NOP; break;
-       case GDK_OR:
-         data->rop2 = R2_MERGEPEN; break;
-       case GDK_EQUIV:
-         data->rop2 = R2_NOTXORPEN; break;
-       case GDK_OR_REVERSE:
-         data->rop2 = R2_MERGEPENNOT; break;
-       case GDK_COPY_INVERT:
-         data->rop2 = R2_NOTCOPYPEN; break;
-       case GDK_OR_INVERT:
-         data->rop2 = R2_MERGENOTPEN; break;
-       case GDK_NAND:
-         data->rop2 = R2_NOTMASKPEN; break;
-       case GDK_SET:
-         data->rop2 = R2_WHITE; break;
-       }
-      data->values_mask |= GDK_GC_FUNCTION;
-    }
-
-  if (values_mask & GDK_GC_FILL)
-    {
-      GDK_NOTE (MISC, g_print ("fill = %d ", values->fill));
-      data->fill_style = values->fill;
-      data->values_mask |= GDK_GC_FILL;
-    }
 
-  if (values_mask & GDK_GC_TILE)
-    {
-      if (data->tile != NULL)
-       gdk_drawable_unref (data->tile);
-      data->tile = values->tile;
-      if (data->tile != NULL)
-       {
-         GDK_NOTE (MISC, g_print ("tile = %#x ",
-                                  GDK_DRAWABLE_XID (values->tile)));
-         gdk_drawable_ref (data->tile);
-         data->values_mask |= GDK_GC_TILE;
-       }
-      else
-       {
-         GDK_NOTE (MISC, g_print ("tile = NULL "));
-         data->values_mask &= ~GDK_GC_TILE;
-       }
-    }
+  GDK_NOTE (MISC, g_print ("gdk_win32_gc_set_values: "));
 
-  if (values_mask & GDK_GC_STIPPLE)
-    {
-      if (data->stipple != NULL)
-       gdk_drawable_unref (data->stipple);
-      data->stipple = values->stipple;
-      if (data->stipple != NULL)
-       {
-         GDK_NOTE (MISC, g_print ("stipple = %#x ",
-                                  GDK_DRAWABLE_XID (values->stipple)));
-         gdk_drawable_ref (data->stipple);
-         data->values_mask |= GDK_GC_STIPPLE;
-       }
-      else
-       {
-         GDK_NOTE (MISC, g_print ("stipple = NULL "));
-         data->values_mask &= ~GDK_GC_STIPPLE;
-       }
-    }
-
-  if (values_mask & GDK_GC_CLIP_MASK)
-    {
-      if (data->clip_region != NULL)
-       if (!DeleteObject (data->clip_region))
-         g_warning ("gdk_win32_gc_set_values: DeleteObject failed");
-      if (values->clip_mask != NULL)
-       {
-         data->clip_region =
-           BitmapToRegion (GDK_DRAWABLE_XID (values->clip_mask));
-         data->values_mask |= GDK_GC_CLIP_MASK;
-         GDK_NOTE (MISC, g_print (" clip=%#x", data->clip_region));
-       }
-      else
-       {
-         data->clip_region = NULL;
-         data->values_mask &= ~GDK_GC_CLIP_MASK;
-         GDK_NOTE (MISC, g_print (" clip=NULL"));
-       }
-    }
-
-  if (values_mask & GDK_GC_SUBWINDOW)
-    {
-      data->values_mask |= GDK_GC_SUBWINDOW;
-    }
-
-  if (values_mask & GDK_GC_TS_X_ORIGIN)
-    {
-      data->ts_x_origin = values->ts_x_origin;
-      data->values_mask |= GDK_GC_TS_X_ORIGIN;
-      GDK_NOTE (MISC, g_print (" ts_x=%d", data->ts_x_origin));
-    }
-  
-  if (values_mask & GDK_GC_TS_Y_ORIGIN)
-    {
-      data->ts_y_origin = values->ts_y_origin;
-      data->values_mask |= GDK_GC_TS_Y_ORIGIN;
-      GDK_NOTE (MISC, g_print (" ts_y=%d", data->ts_y_origin));
-    }
-  
-  if (values_mask & GDK_GC_CLIP_X_ORIGIN)
-    {
-      data->clip_x_origin = values->clip_x_origin;
-      data->values_mask |= GDK_GC_CLIP_X_ORIGIN;
-      GDK_NOTE (MISC, g_print (" clip_x=%d", data->clip_x_origin));
-    }
-  
-  if (values_mask & GDK_GC_CLIP_Y_ORIGIN)
-    {
-      data->clip_y_origin = values->clip_y_origin;
-      data->values_mask |= GDK_GC_CLIP_Y_ORIGIN;
-      GDK_NOTE (MISC, g_print (" clip_y=%d", data->clip_y_origin));
-    }
-  
-  if (values_mask & GDK_GC_EXPOSURES)
-    {
-      data->values_mask |= GDK_GC_EXPOSURES;
-    }
-
-  if (values_mask & GDK_GC_LINE_WIDTH)
-    {
-      data->pen_width = values->line_width;
-      data->values_mask |= GDK_GC_LINE_WIDTH;
-      GDK_NOTE (MISC, g_print (" pen_width=%d", data->pen_width));
-    }
-
-  if (values_mask & GDK_GC_LINE_STYLE)
-    {
-      data->pen_style &= ~(PS_STYLE_MASK);
-      switch (values->line_style)
-       {
-       case GDK_LINE_SOLID:
-         data->pen_style |= PS_SOLID; break;
-       case GDK_LINE_ON_OFF_DASH:
-       case GDK_LINE_DOUBLE_DASH: /* ??? */
-         data->pen_style |= PS_DASH; break;
-       }
-      data->values_mask |= GDK_GC_LINE_STYLE;
-      GDK_NOTE (MISC, g_print (" line_style=%#x",
-                              (data->pen_style & PS_STYLE_MASK)));
-    }
-  
-  if (values_mask & GDK_GC_CAP_STYLE)
-    {
-      data->pen_style &= ~(PS_ENDCAP_MASK);
-      switch (values->cap_style)
-       {
-       case GDK_CAP_NOT_LAST:
-         /* ??? */
-         break;
-       case GDK_CAP_BUTT:
-         data->pen_style |= PS_ENDCAP_FLAT; break;
-       case GDK_CAP_ROUND:
-         data->pen_style |= PS_ENDCAP_ROUND; break;
-       case GDK_CAP_PROJECTING:
-         data->pen_style |= PS_ENDCAP_SQUARE; break;
-       }
-      data->values_mask |= GDK_GC_CAP_STYLE;
-      GDK_NOTE (MISC, g_print (" cap_style=%#x",
-                              (data->pen_style & PS_ENDCAP_MASK)));
-    }
-
-  if (values_mask & GDK_GC_JOIN_STYLE)
-    {
-      data->pen_style &= ~(PS_JOIN_MASK);
-
-      switch (values->join_style)
-       {
-       case GDK_JOIN_MITER:
-         data->pen_style |= PS_JOIN_MITER; break;
-       case GDK_JOIN_ROUND:
-         data->pen_style |= PS_JOIN_ROUND; break;
-       case GDK_JOIN_BEVEL:
-         data->pen_style |= PS_JOIN_BEVEL; break;
-       }
-      data->values_mask |= GDK_GC_JOIN_STYLE;
-      GDK_NOTE (MISC, g_print (" join_style=%#x",
-                              (data->pen_style & PS_JOIN_MASK)));
-    }
-  GDK_NOTE (MISC, g_print ("}\n"));
+  gdk_win32_gc_values_to_win32values (values, mask, data);
 }
 
 static void
@@ -688,7 +588,7 @@ gdk_gc_set_clip_rectangle (GdkGC    *gc,
 
   if (data->clip_region != NULL)
     if (!DeleteObject (data->clip_region))
-      g_warning ("gdk_gc_set_clip_rectangle: DeleteObject failed");
+      WIN32_API_FAILED ("DeleteObject");
   if (rectangle)
     {
       GDK_NOTE (MISC,
@@ -700,7 +600,7 @@ gdk_gc_set_clip_rectangle (GdkGC    *gc,
           CreateRectRgn (rectangle->x, rectangle->y,
                          rectangle->x + rectangle->width,
                          rectangle->y + rectangle->height)) == NULL)
-       g_warning ("gdk_gc_set_clip_rectangle: CreateRectRgn failed");
+       WIN32_API_FAILED ("CreateRectRgn");
 
       data->values_mask |= GDK_GC_CLIP_MASK;
     }
@@ -729,7 +629,7 @@ gdk_gc_set_clip_region (GdkGC                *gc,
 
   if (data->clip_region != NULL)
     if (!DeleteObject (data->clip_region))
-      g_warning ("gdk_gc_set_clip_region: DeleteObject failed");
+      WIN32_API_FAILED ("DeleteObject");
   if (region)
     {
       GdkRegionPrivate *region_private;
@@ -751,65 +651,52 @@ gdk_gc_copy (GdkGC *dst_gc, GdkGC *src_gc)
 {
   GdkGCWin32Data *dst_data = GDK_GC_WIN32DATA (dst_gc);
   GdkGCWin32Data *src_data = GDK_GC_WIN32DATA (src_gc);
+  DWORD nbytes;
+  LPRGNDATA rgn;
 
-  if (dst_data->font)
+  if (dst_data->font != NULL)
     gdk_font_unref (dst_data->font);
-  if (dst_data->tile)
+  if (dst_data->tile != NULL)
     gdk_drawable_unref (dst_data->tile);
-  if (dst_data->stipple)
+  if (dst_data->stipple != NULL)
     gdk_drawable_unref (dst_data->stipple);
+  if (dst_data->clip_region != NULL)
+    if (!DeleteObject (dst_data->clip_region))
+      WIN32_API_FAILED ("DeleteObject");
   
   *dst_data = *src_data;
+
+  if (dst_data->clip_region != NULL)
+    {
+      nbytes = GetRegionData (dst_data->clip_region, 0, NULL);
+      rgn = g_malloc (nbytes);
+      GetRegionData (dst_data->clip_region, nbytes, rgn);
+      if ((dst_data->clip_region = ExtCreateRegion (NULL, nbytes, rgn)) == NULL)
+       WIN32_API_FAILED ("ExtCreateRegion");
+      g_free (rgn);
+    }
   
-  if (dst_data->font)
+  if (dst_data->font != NULL)
     gdk_font_ref (dst_data->font);
-  if (dst_data->tile)
+  if (dst_data->tile != NULL)
     gdk_drawable_ref (dst_data->tile);
-  if (dst_data->stipple)
+  if (dst_data->stipple != NULL)
     gdk_drawable_ref (dst_data->stipple);
 }
 
-HDC
-gdk_gc_predraw (GdkDrawable  *drawable,
-               GdkGCPrivate *gc_private)
+static guint mask[9] = { 0, 1, 3, 7, 15, 31, 63, 127, 255 };
+
+static void
+predraw_set_foreground (GdkGCWin32Data          *data,
+                       GdkColormapPrivateWin32 *colormap_private)
 {
-  GdkDrawablePrivate *drawable_private = (GdkDrawablePrivate *) drawable;
-  GdkColormapPrivateWin32 *colormap_private =
-    (GdkColormapPrivateWin32 *) drawable_private->colormap;
-  GdkGCWin32Data *data = GDK_GC_WIN32DATA (gc_private);
-  GdkVisual *visual;
-  COLORREF bg;
   COLORREF fg;
   LOGBRUSH logbrush;
   HPEN hpen;
   HBRUSH hbr;
+  GdkVisual *visual;
   guchar r, g, b;
-  static guint mask[9] = { 0, 1, 3, 7, 15, 31, 63, 127, 255 };
 
-  g_assert (data->xgc == NULL);
-
-  if (GDK_DRAWABLE_TYPE (drawable) == GDK_DRAWABLE_PIXMAP)
-    {
-      if ((data->xgc = CreateCompatibleDC (NULL)) == NULL)
-       g_warning ("gdk_gc_predraw: CreateCompatibleDC failed");
-
-      if ((data->saved_dc = SaveDC (data->xgc)) == 0)
-       g_warning ("gdk_gc_predraw: SaveDC #1 failed");
-      
-      if (SelectObject (data->xgc, GDK_DRAWABLE_XID (drawable)) == NULL)
-       g_warning ("gdk_gc_predraw: SelectObject #1 failed");
-    }
-  else
-    {
-      if ((data->xgc = GetDC (GDK_DRAWABLE_XID (drawable))) == NULL)
-       g_warning ("gdk_gc_predraw: GetDC failed");
-      
-      if ((data->saved_dc = SaveDC (data->xgc)) == 0)
-       g_warning ("gdk_gc_predraw: SaveDC #2 failed");
-    }
-  
-  data->hwnd = GDK_DRAWABLE_XID (drawable);
-  
   if (colormap_private == NULL)
     {
       /* A 1 bit deep bitmap */
@@ -835,123 +722,167 @@ gdk_gc_predraw (GdkDrawable  *drawable,
            logpal.palPalEntry[1].peBlue = 0xFF;
          logpal.palPalEntry[1].peFlags = 0x00;
          if ((hpal = CreatePalette ((LOGPALETTE *) &logpal)) == NULL)
-           g_warning ("gdk_gc_predraw: CreatePalette failed");
+           WIN32_API_FAILED ("CreatePalette");
        }
       SelectPalette (data->xgc, hpal, FALSE);
       RealizePalette (data->xgc);
-      fg = PALETTEINDEX (data->foreground.pixel);
+      fg = PALETTEINDEX (data->foreground);
     }
   else if (colormap_private->xcolormap->rc_palette)
     {
       int k;
-      if (SelectPalette (data->xgc,
-                        colormap_private->xcolormap->palette, FALSE) == NULL)
-       g_warning ("gdk_gc_predraw: SelectPalette failed");
+      if (SelectPalette (data->xgc, colormap_private->xcolormap->palette,
+                        FALSE) == NULL)
+       WIN32_API_FAILED ("SelectPalette");
       if (TRUE || colormap_private->xcolormap->stale)
        {
          if ((k = RealizePalette (data->xgc)) == GDI_ERROR)
-           g_warning ("gdk_gc_predraw: RealizePalette failed");
+           WIN32_API_FAILED ("RealizePalette");
          colormap_private->xcolormap->stale = FALSE;
        }
 #if 0
       g_print ("Selected palette %#x for gc %#x, realized %d colors\n",
               colormap_private->xcolormap->palette, data->xgc, k);
 #endif
-      fg = PALETTEINDEX (data->foreground.pixel);
+      fg = PALETTEINDEX (data->foreground);
     }
   else
     {
       visual = colormap_private->base.visual;
-      r = (data->foreground.pixel & visual->red_mask) >> visual->red_shift;
+      r = (data->foreground & visual->red_mask) >> visual->red_shift;
       r = (r * 255) / mask[visual->red_prec];
-      g = (data->foreground.pixel & visual->green_mask) >> visual->green_shift;
+      g = (data->foreground & visual->green_mask) >> visual->green_shift;
       g = (g * 255) / mask[visual->green_prec];
-      b = (data->foreground.pixel & visual->blue_mask) >> visual->blue_shift;
+      b = (data->foreground & visual->blue_mask) >> visual->blue_shift;
       b = (b * 255) / mask[visual->blue_prec];
 
       fg = GetNearestColor (data->xgc, RGB (r, g, b));
     }
+
+  if (SetTextColor (data->xgc, fg) == CLR_INVALID)
+    WIN32_API_FAILED ("SetTextColor");
+
+  /* Create and select pen and brush. */
+
   logbrush.lbStyle = BS_SOLID;
   logbrush.lbColor = fg;
+
   if ((hpen = ExtCreatePen (data->pen_style, data->pen_width,
                            &logbrush, 0, NULL)) == NULL)
-    g_warning ("gdk_gc_predraw: CreatePen failed");
+    WIN32_API_FAILED ("ExtCreatePen");
   
   if (SelectObject (data->xgc, hpen) == NULL)
-    g_warning ("gdk_gc_predraw: SelectObject #2 failed");
-
-  if (SetTextColor (data->xgc, fg) == CLR_INVALID)
-    g_warning ("gdk_gc_predraw: SetTextColor failed");
+    WIN32_API_FAILED ("SelectObject #2");
 
-#if 0
   switch (data->fill_style)
     {
-    case GDK_STIPPLED:
-      {
-       GdkPixmap *stipple = data->stipple;
-       GdkPixmapPrivate *stipple_private = (GdkPixmapPrivate *) stipple;
-       HBITMAP hbm = GDK_DRAWABLE_XID (stipple);
-       if (NULL == (hbr = CreatePatternBrush (hbm)))
-         g_warning ("gdk_gc_predraw: CreatePatternBrush failed");
+#if 1
+    case GDK_OPAQUE_STIPPLED:
+      if ((hbr = CreatePatternBrush (GDK_DRAWABLE_XID (data->stipple))) == NULL)
+       WIN32_API_FAILED ("CreatePatternBrush");
        
-#ifdef NATIVE_WIN16
-       SetBrushOrg  (data->xgc, data->ts_x_origin,
-                     data->ts_y_origin);
-#else
-       SetBrushOrgEx(data->xgc, data->ts_x_origin,
-                     data->ts_y_origin, NULL);
-#endif
-      }
+      SetBrushOrgEx(data->xgc, data->ts_x_origin,
+                   data->ts_y_origin, NULL);
       break;
+#endif
+
     case GDK_SOLID:
     default:
       if ((hbr = CreateSolidBrush (fg)) == NULL)
-       g_warning ("gdk_gc_predraw: CreateSolidBrush failed");
+       WIN32_API_FAILED ("CreateSolidBrush");
       break;
   }
-#else
-  if ((hbr = CreateSolidBrush (fg)) == NULL)
-    g_warning ("gdk_gc_predraw: CreateSolidBrush failed");
-#endif
+
   if (SelectObject (data->xgc, hbr) == NULL)
-    g_warning ("gdk_gc_predraw: SelectObject #3 failed");
+    WIN32_API_FAILED ("SelectObject #3");
+}  
+
+void
+predraw_set_background (GdkGCWin32Data          *data,
+                       GdkColormapPrivateWin32 *colormap_private)
+{
+  COLORREF bg;
+  GdkVisual *visual;
+  guchar r, g, b;
 
-  if (data->values_mask & GDK_GC_BACKGROUND)
+  if (colormap_private == NULL)
     {
-      if (colormap_private == NULL)
-       {
-         /* a bitmap */
-         bg = PALETTEINDEX (data->background.pixel);
-       }
-      else if (colormap_private->xcolormap->rc_palette)
-       {
-         bg = PALETTEINDEX (data->background.pixel);
-       }
-      else
-       {
-         visual = colormap_private->base.visual;
-         r = (data->background.pixel & visual->red_mask) >> visual->red_shift;
-         r = (r * 255) / mask[visual->red_prec];
-         g = (data->background.pixel & visual->green_mask) >> visual->green_shift;
-         g = (g * 255) / mask[visual->green_prec];
-         b = (data->background.pixel & visual->blue_mask) >> visual->blue_shift;
-         b = (b * 255) / mask[visual->green_prec];
-         
-         fg = GetNearestColor (data->xgc, RGB (r, g, b));
-       }
-      if (SetBkColor (data->xgc, bg) == CLR_INVALID)
-       g_warning ("gdk_gc_predraw: SetBkColor failed");
+      /* a bitmap */
+      bg = PALETTEINDEX (data->background);
+    }
+  else if (colormap_private->xcolormap->rc_palette)
+    {
+      bg = PALETTEINDEX (data->background);
+    }
+  else
+    {
+      visual = colormap_private->base.visual;
+      r = (data->background & visual->red_mask) >> visual->red_shift;
+      r = (r * 255) / mask[visual->red_prec];
+      g = (data->background & visual->green_mask) >> visual->green_shift;
+      g = (g * 255) / mask[visual->green_prec];
+      b = (data->background & visual->blue_mask) >> visual->blue_shift;
+      b = (b * 255) / mask[visual->green_prec];
+
+      bg = GetNearestColor (data->xgc, RGB (r, g, b));
+    }
+  if (SetBkColor (data->xgc, bg) == CLR_INVALID)
+    WIN32_API_FAILED ("SetBkColor");
+}
+
+
+HDC
+gdk_gc_predraw (GdkDrawable    *drawable,
+               GdkGCPrivate   *gc_private,
+               GdkGCValuesMask usage)
+{
+  GdkDrawablePrivate *drawable_private = (GdkDrawablePrivate *) drawable;
+  GdkColormapPrivateWin32 *colormap_private =
+    (GdkColormapPrivateWin32 *) drawable_private->colormap;
+  GdkGCWin32Data *data = GDK_GC_WIN32DATA (gc_private);
+
+  g_assert (data->xgc == NULL);
+
+  data->hwnd = GDK_DRAWABLE_XID (drawable);
+  
+  if (GDK_DRAWABLE_TYPE (drawable) == GDK_DRAWABLE_PIXMAP)
+    {
+      if ((data->xgc = CreateCompatibleDC (NULL)) == NULL)
+       WIN32_API_FAILED ("CreateCompatibleDC");
+
+      if ((data->saved_dc = SaveDC (data->xgc)) == 0)
+       WIN32_API_FAILED ("SaveDC #1");
+      
+      if (SelectObject (data->xgc, data->hwnd) == NULL)
+       WIN32_API_FAILED ("SelectObject #1");
+    }
+  else
+    {
+      if ((data->xgc = GetDC (data->hwnd)) == NULL)
+       WIN32_API_FAILED ("GetDC");
+      
+      if ((data->saved_dc = SaveDC (data->xgc)) == 0)
+       WIN32_API_FAILED ("SaveDC #2");
     }
   
-  if (SetBkMode (data->xgc, TRANSPARENT) == 0)
-    g_warning ("gdk_gc_predraw: SetBkMode failed");
+  if (usage & GDK_GC_FOREGROUND)
+    predraw_set_foreground (data, colormap_private);
+
+  if ((usage & GDK_GC_BACKGROUND) && (data->values_mask & GDK_GC_BACKGROUND))
+    predraw_set_background (data, colormap_private);
+  
+  if (usage & GDK_GC_FONT)
+    {
+      if (SetBkMode (data->xgc, TRANSPARENT) == 0)
+       WIN32_API_FAILED ("SetBkMode");
   
-  if (SetTextAlign (data->xgc, TA_BASELINE) == GDI_ERROR)
-    g_warning ("gdk_gc_predraw: SetTextAlign failed");
+      if (SetTextAlign (data->xgc, TA_BASELINE) == GDI_ERROR)
+       WIN32_API_FAILED ("SetTextAlign");
+    }
   
   if (data->values_mask & GDK_GC_FUNCTION)
     if (SetROP2 (data->xgc, data->rop2) == 0)
-      g_warning ("gdk_gc_predraw: SetROP2 failed");
+      WIN32_API_FAILED ("SetROP2");
 
   if (data->values_mask & GDK_GC_CLIP_MASK
       && data->clip_region != NULL)
@@ -966,24 +897,28 @@ gdk_gc_predraw (GdkDrawable  *drawable,
 }
 
 void
-gdk_gc_postdraw (GdkDrawable  *drawable,
-                GdkGCPrivate *gc_private)
+gdk_gc_postdraw (GdkDrawable    *drawable,
+                GdkGCPrivate   *gc_private,
+                GdkGCValuesMask usage)
 {
   GdkDrawablePrivate *drawable_private = (GdkDrawablePrivate *) drawable;
   GdkColormapPrivateWin32 *colormap_private =
     (GdkColormapPrivateWin32 *) drawable_private->colormap;
   GdkGCWin32Data *data = GDK_GC_WIN32DATA (gc_private);
-  HGDIOBJ hpen;
-  HGDIOBJ hbr;
+  HGDIOBJ hpen = NULL;
+  HGDIOBJ hbr = NULL;
 
-  if ((hpen = GetCurrentObject (data->xgc, OBJ_PEN)) == NULL)
-    g_warning ("gdk_gc_postdraw: GetCurrentObject #1 failed");
+  if (usage & GDK_GC_FOREGROUND)
+    {
+      if ((hpen = GetCurrentObject (data->xgc, OBJ_PEN)) == NULL)
+       WIN32_API_FAILED ("GetCurrentObject #1");
 
-  if ((hbr = GetCurrentObject (data->xgc, OBJ_BRUSH)) == NULL)
-    g_warning ("gdk_gc_postdraw: GetCurrentObject #2 failed");
+      if ((hbr = GetCurrentObject (data->xgc, OBJ_BRUSH)) == NULL)
+       WIN32_API_FAILED ("GetCurrentObject #2");
+    }
 
   if (!RestoreDC (data->xgc, data->saved_dc))
-    g_warning ("gdk_gc_postdraw: RestoreDC failed");
+    WIN32_API_FAILED ("RestoreDC");
 #if 0
   if (colormap_private != NULL
       && colormap_private->xcolormap->rc_palette
@@ -991,13 +926,13 @@ gdk_gc_postdraw (GdkDrawable  *drawable,
     {
       SelectPalette (data->xgc, GetStockObject (DEFAULT_PALETTE), FALSE);
       if (!UnrealizeObject (colormap_private->xcolormap->palette))
-       g_warning ("gdk_gc_postraw: UnrealizeObject failed");
+       WIN32_API_FAILED ("UnrealizeObject");
     }
 #endif
   if (GDK_DRAWABLE_TYPE (drawable) == GDK_DRAWABLE_PIXMAP)
     {
       if (!DeleteDC (data->xgc))
-       g_warning ("gdk_gc_postdraw: DeleteDC failed");
+       WIN32_API_FAILED ("DeleteDC");
     }
   else
     {
@@ -1006,11 +941,11 @@ gdk_gc_postdraw (GdkDrawable  *drawable,
 
   if (hpen != NULL)
     if (!DeleteObject (hpen))
-      g_warning ("gdk_gc_postdraw: DeleteObject #1 failed");
+      WIN32_API_FAILED ("DeleteObject #1");
   
   if (hbr != NULL)
     if (!DeleteObject (hbr))
-      g_warning ("gdk_gc_postdraw: DeleteObject #2 failed");
+      WIN32_API_FAILED ("DeleteObject #2");
 
   if (data->values_mask & GDK_GC_CLIP_MASK
       && data->clip_region != NULL
@@ -1086,14 +1021,14 @@ BitmapToRegion (HBITMAP hBmp)
        logpal.palPalEntry[1].peBlue = 0xFF;
       logpal.palPalEntry[1].peFlags = 0;
       if ((bwPalette = CreatePalette ((LOGPALETTE *) &logpal)) == NULL)
-       g_warning ("BitmapToRegion: CreatePalette failed");
+       WIN32_API_FAILED ("CreatePalette");
     }
 
   /* Create a memory DC inside which we will scan the bitmap content */
   hMemDC = CreateCompatibleDC (NULL);
   if (!hMemDC)
     {
-      g_warning ("BitmapToRegion: CreateCompatibleDC #1 failed");
+      WIN32_API_FAILED ("CreateCompatibleDC #1");
       return NULL;
     }
 
@@ -1136,7 +1071,7 @@ BitmapToRegion (HBITMAP hBmp)
 #endif
   if (!hbm8)
     {
-      g_warning ("BitmapToRegion: CreateDIBSection failed");
+      WIN32_API_FAILED ("CreateDIBSection");
       DeleteDC (hMemDC);
       return NULL;
     }
@@ -1147,7 +1082,7 @@ BitmapToRegion (HBITMAP hBmp)
   hDC = CreateCompatibleDC (hMemDC);
   if (!hDC)
     {
-      g_warning ("BitmapToRegion: CreateCompatibleDC #2 failed");
+      WIN32_API_FAILED ("CreateCompatibleDC #2");
       SelectObject (hMemDC, holdBmp);
       DeleteObject (hbm8);
       DeleteDC (hMemDC);
@@ -1171,7 +1106,7 @@ BitmapToRegion (HBITMAP hBmp)
 
   if (!BitBlt (hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, hDC, 0, 0, SRCCOPY))
     {
-      g_warning ("BitmapToRegion: BitBlt failed");
+      WIN32_API_FAILED ("BitBlt");
       SelectObject (hDC, holdBmp2);
       SelectObject (hMemDC, holdBmp);
       DeleteObject (hbm8);
index 82fdae3160a1a11e71d8b16a6e88234d0d1a8660..83fe69f2f529c7461adce95a5f3b0fc989b57e21 100644 (file)
@@ -243,7 +243,7 @@ gdk_image_new_with_depth (GdkImageType  type,
 
   if (private->ximage == NULL)
     {
-      g_warning ("gdk_image_new_with_depth: CreateDIBSection failed");
+      WIN32_API_FAILED ("CreateDIBSection");
       g_free (image);
       return NULL;
     }
@@ -349,13 +349,13 @@ gdk_image_get (GdkWindow *window,
     {
       if ((hdc = CreateCompatibleDC (NULL)) == NULL)
        {
-         g_warning ("gdk_image_get: CreateCompatibleDC #1 failed");
+         WIN32_API_FAILED ("CreateCompatibleDC #1");
          g_free (image);
          return NULL;
        }
       if ((oldbitmap1 = SelectObject (hdc, GDK_DRAWABLE_XID (window))) == NULL)
        {
-         g_warning ("gdk_image_get: SelectObject #1 failed");
+         WIN32_API_FAILED ("SelectObject #1");
          DeleteDC (hdc);
          g_free (image);
          return NULL;
@@ -378,7 +378,7 @@ gdk_image_get (GdkWindow *window,
     {
       if ((hdc = GetDC (GDK_DRAWABLE_XID (window))) == NULL)
        {
-         g_warning ("gdk_image_get: GetDC failed");
+         WIN32_API_FAILED ("GetDC");
          g_free (image);
          return NULL;
        }
@@ -395,7 +395,7 @@ gdk_image_get (GdkWindow *window,
 
   if ((memdc = CreateCompatibleDC (hdc)) == NULL)
     {
-      g_warning ("gdk_image_get: CreateCompatibleDC #2 failed");
+      WIN32_API_FAILED ("CreateCompatibleDC #2");
       if (GDK_DRAWABLE_TYPE (window) == GDK_DRAWABLE_PIXMAP)
        {
          SelectObject (hdc, oldbitmap1);
@@ -443,7 +443,7 @@ gdk_image_get (GdkWindow *window,
        CreateDIBSection (hdc, (BITMAPINFO *) &bmi, iUsage,
                         &image->mem, NULL, 0)) == NULL)
     {
-      g_warning ("gdk_image_get: CreateDIBSection failed");
+      WIN32_API_FAILED ("CreateDIBSection");
       DeleteDC (memdc);
       if (GDK_DRAWABLE_TYPE (window) == GDK_DRAWABLE_PIXMAP)
        {
@@ -460,7 +460,7 @@ gdk_image_get (GdkWindow *window,
 
   if ((oldbitmap2 = SelectObject (memdc, private->ximage)) == NULL)
     {
-      g_warning ("gdk_image_get: SelectObject #2 failed");
+      WIN32_API_FAILED ("SelectObject #2");
       DeleteObject (private->ximage);
       DeleteDC (memdc);
       if (GDK_DRAWABLE_TYPE (window) == GDK_DRAWABLE_PIXMAP)
@@ -478,7 +478,7 @@ gdk_image_get (GdkWindow *window,
 
   if (!BitBlt (memdc, 0, 0, width, height, hdc, x, y, SRCCOPY))
     {
-      g_warning ("gdk_image_get: BitBlt failed");
+      WIN32_API_FAILED ("BitBlt");
       SelectObject (memdc, oldbitmap2);
       DeleteObject (private->ximage);
       DeleteDC (memdc);
@@ -496,10 +496,10 @@ gdk_image_get (GdkWindow *window,
     }
 
   if (SelectObject (memdc, oldbitmap2) == NULL)
-    g_warning ("gdk_image_get: SelectObject #3 failed");
+    WIN32_API_FAILED ("SelectObject #3");
 
   if (!DeleteDC (memdc))
-    g_warning ("gdk_image_get: DeleteDC failed");
+    WIN32_API_FAILED ("DeleteDC");
 
   if (GDK_DRAWABLE_TYPE (window) == GDK_DRAWABLE_PIXMAP)
     {
@@ -643,7 +643,7 @@ gdk_win32_image_destroy (GdkImage *image)
 
     case GDK_IMAGE_SHARED:
       if (!DeleteObject (private->ximage))
-       g_warning ("gdk_win32_image_destroy: DeleteObject failed");
+       WIN32_API_FAILED ("DeleteObject");
       break;
 
     default:
@@ -680,9 +680,7 @@ gdk_image_put (GdkImage    *image,
   drawable_private = (GdkDrawablePrivate *) drawable;
   gc_private = (GdkGCPrivate *) gc;
 
-  /* The image can in fact be "shared", so don't test */
-
-  hdc = gdk_gc_predraw (drawable, gc_private);
+  hdc = gdk_gc_predraw (drawable, gc_private, 0);
   colormap_private = (GdkColormapPrivateWin32 *) drawable_private->colormap;
   if (colormap_private && colormap_private->xcolormap->rc_palette)
     {
@@ -704,7 +702,7 @@ gdk_image_put (GdkImage    *image,
       if (GetObject (image_private->ximage, sizeof (DIBSECTION),
                     &ds) != sizeof (DIBSECTION))
        {
-         g_warning ("gdk_image_put: GetObject failed");
+         WIN32_API_FAILED ("GetObject");
        }
 #if 0
       g_print("xdest = %d, ydest = %d, xsrc = %d, ysrc = %d, width = %d, height = %d\n",
@@ -727,7 +725,7 @@ gdk_image_put (GdkImage    *image,
                             ds.dsBm.bmBits,
                             (CONST BITMAPINFO *) &bmi,
                             DIB_PAL_COLORS) == 0)
-       g_warning ("SetDIBitsToDevice failed");
+       WIN32_API_FAILED ("SetDIBitsToDevice");
     }
   else
     {
@@ -736,26 +734,26 @@ gdk_image_put (GdkImage    *image,
 
       if ((memdc = CreateCompatibleDC (hdc)) == NULL)
        {
-         g_warning ("gdk_image_put: CreateCompatibleDC failed");
-         gdk_gc_postdraw (drawable, gc_private);
+         WIN32_API_FAILED ("CreateCompatibleDC");
+         gdk_gc_postdraw (drawable, gc_private, 0);
          return;
        }
 
       if ((oldbitmap = SelectObject (memdc, image_private->ximage)) == NULL)
        {
-         g_warning ("gdk_image_put: SelectObject #1 failed");
-         gdk_gc_postdraw (drawable, gc_private);
+         WIN32_API_FAILED ("SelectObject #1");
+         gdk_gc_postdraw (drawable, gc_private, 0);
          return;
        }
       if (!BitBlt (hdc, xdest, ydest, width, height,
                   memdc, xsrc, ysrc, SRCCOPY))
-       g_warning ("gdk_image_put: BitBlt failed");
+       WIN32_API_FAILED ("BitBlt");
 
       if (SelectObject (memdc, oldbitmap) == NULL)
-       g_warning ("gdk_image_put_normal: SelectObject #2 failed");
+       WIN32_API_FAILED ("SelectObject #2");
 
       if (!DeleteDC (memdc))
-       g_warning ("gdk_image_put: DeleteDC failed");
+       WIN32_API_FAILED ("DeleteDC");
     }
-  gdk_gc_postdraw (drawable, gc_private);
+  gdk_gc_postdraw (drawable, gc_private, 0);
 }
index 9d8abb8bfeb571e907cb48cb36d6c4352684917a..31f2cd7a69a1ca41530d514b02fb148f9d3e20cc 100644 (file)
@@ -54,9 +54,6 @@ GdkArgDesc _gdk_windowing_args[] = {
   { NULL }
 };
 
-/* Private variable declarations
- */
-
 int __stdcall
 DllMain(HINSTANCE hinstDLL,
        DWORD dwReason,
@@ -103,6 +100,31 @@ _gdk_windowing_init_check (int    argc,
   return TRUE;
 }
 
+gchar *
+gdk_win32_last_error_string (void)
+{
+  static gchar error[100];
+  int nbytes;
+
+  if ((nbytes = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError (),
+                              0, error, sizeof (error), NULL)) == 0)
+    strcat (error, "Unknown error");
+
+  if (nbytes > 2 && error[nbytes-1] == '\n' && error[nbytes-2] == '\r')
+    error[nbytes-2] = '\0';
+
+  return error;
+}
+
+void
+gdk_win32_api_failed (const gchar *where,
+                     gint         line,
+                     const gchar *api)
+{
+  g_warning ("%s:%d: %s failed: %s", where, line, api,
+            gdk_win32_last_error_string ());
+}
+
 void
 gdk_set_use_xshm (gint use_xshm)
 {
index 56092c9be3e93818a9ead1eff60acec00f4875ac..bbe273c849fbb176ff21955a9cef7ee5089e03d4 100644 (file)
@@ -58,7 +58,7 @@ gdk_win32_pixmap_destroy (GdkPixmap *pixmap)
                           GDK_DRAWABLE_XID (pixmap)));
 
   if (!DeleteObject (GDK_DRAWABLE_XID (pixmap)))
-    g_warning ("gdk_win32_pixmap_destroy: DeleteObject failed");
+    WIN32_API_FAILED ("DeleteObject");
 
   gdk_xid_table_remove (GDK_DRAWABLE_XID (pixmap));
 
@@ -137,7 +137,7 @@ gdk_pixmap_new (GdkWindow *window,
 
   if ((hdc = GetDC (GDK_DRAWABLE_XID (window))) == NULL)
     {
-      g_warning ("gdk_pixmap_new: GetDC failed");
+      WIN32_API_FAILED ("GetDC");
       g_free (private);
       return NULL;
     }
@@ -207,7 +207,7 @@ gdk_pixmap_new (GdkWindow *window,
        CreateDIBSection (hdc, (BITMAPINFO *) &bmi,
                         iUsage, (PVOID *) &bits, NULL, 0)) == NULL)
     {
-      g_warning ("gdk_pixmap_new: CreateDIBSection failed: %d", GetLastError ());
+      WIN32_API_FAILED ("CreateDIBSection");
       ReleaseDC (GDK_DRAWABLE_XID (window), hdc);
       g_free (pixmap);
       return NULL;
@@ -334,6 +334,7 @@ gdk_bitmap_create_from_data (GdkWindow   *window,
   for (i = 0; i < height; i++)
     for (j = 0; j < bpl; j++)
       bits[i*aligned_bpl + j] = mirror[(guchar) data[i*bpl + j]];
+
   GDK_DRAWABLE_WIN32DATA (pixmap)->xid =
     CreateBitmap (width, height, 1, 1, bits);
 
index 0536a192a7ff813512c451e51b0d16b966b70f8b..75ebfb1a1c7b5f61c4ebcf83b4bec31185ab9188 100644 (file)
@@ -153,8 +153,8 @@ struct _GdkGCWin32Data
    */
   HDC xgc;
   GdkGCValuesMask values_mask;
-  GdkColor foreground;
-  GdkColor background;
+  gulong foreground;
+  gulong background;
   GdkFont *font;
   gint rop2;
   GdkFill fill_style;
@@ -278,9 +278,11 @@ GdkGC *  _gdk_win32_gc_new       (GdkDrawable        *drawable,
                                  GdkGCValues        *values,
                                  GdkGCValuesMask     values_mask);
 HDC    gdk_gc_predraw           (GdkDrawable        *drawable,
-                                 GdkGCPrivate       *gc_private);
+                                 GdkGCPrivate       *gc_private,
+                                 GdkGCValuesMask     usage);
 void   gdk_gc_postdraw          (GdkDrawable        *drawable,
-                                 GdkGCPrivate       *gc_private);
+                                 GdkGCPrivate       *gc_private,
+                                 GdkGCValuesMask     usage);
 HRGN   BitmapToRegion           (HBITMAP hBmp);
 
 void    gdk_sel_prop_store       (GdkWindow *owner,
@@ -307,8 +309,17 @@ void gdk_wchar_text_handle       (GdkFont       *font,
                                                          void *),
                                  void          *arg);
 
-char *gdk_color_to_string        (const GdkColor *);
-
+gchar *gdk_color_to_string         (const GdkColor *);
+gchar *gdk_win32_last_error_string (void);
+void   gdk_win32_api_failed        (const gchar *where,
+                                   gint line,
+                                   const gchar *api);
+#ifdef __GNUC__
+#define WIN32_API_FAILED(api) gdk_win32_api_failed (__PRETTY_FUNCTION__, __LINE__, api)
+#else
+#define WIN32_API_FAILED(api) gdk_win32_api_failed (__FILE__, __LINE__, api)
+#endif
 extern LRESULT CALLBACK gdk_WindowProc (HWND, UINT, WPARAM, LPARAM);
 
 extern GdkDrawableClass  _gdk_win32_drawable_class;
index 0dbaa06329c0654fb55637c6e79d1a8d344017ca..a36e335c33ad475216c91d39bef5e3e9be68097a 100644 (file)
@@ -179,7 +179,7 @@ gdk_property_change (GdkWindow   *window,
                               GDK_DRAWABLE_XID (window)));
       if (!OpenClipboard (GDK_DRAWABLE_XID (window)))
        {
-         g_warning ("gdk_property_change: OpenClipboard failed");
+         WIN32_API_FAILED ("OpenClipboard");
          return;
        }
 #endif
@@ -198,15 +198,11 @@ gdk_property_change (GdkWindow   *window,
       GDK_NOTE (MISC, g_print ("...SetClipboardData(CF_TEXT, %#x)\n",
                               hdata));
       if (!SetClipboardData(CF_TEXT, hdata))
-       g_warning ("gdk_property_change: SetClipboardData failed: %d",
-                  GetLastError ());
+       WIN32_API_FAILED ("SetClipboardData");
 #if 1
       GDK_NOTE (MISC, g_print ("...CloseClipboard()\n"));
       if (!CloseClipboard ())
-       {
-         g_warning ("gdk_property_change: CloseClipboard failed");
-         return;
-       }
+       WIN32_API_FAILED ("CloseClipboard");
 #endif
     }
   else
index 7c58baaa3a5ee97ea0f1db68d34ed8fcd326fa8c..86be842e72b5377816545884d7ce525cea928a66 100644 (file)
@@ -101,13 +101,13 @@ gdk_selection_owner_set (GdkWindow *owner,
   GDK_NOTE (MISC, g_print ("...OpenClipboard(%#x)\n", xwindow));
   if (!OpenClipboard (xwindow))
     {
-      g_warning ("gdk_selection_owner_set: OpenClipboard failed");
+      WIN32_API_FAILED ("OpenClipboard");
       return FALSE;
     }
   GDK_NOTE (MISC, g_print ("...EmptyClipboard()\n"));
   if (!EmptyClipboard ())
     {
-      g_warning ("gdk_selection_owner_set: EmptyClipboard failed");
+      WIN32_API_FAILED ("EmptyClipboard");
       CloseClipboard ();
       return FALSE;
     }
@@ -119,7 +119,7 @@ gdk_selection_owner_set (GdkWindow *owner,
   GDK_NOTE (MISC, g_print ("...CloseClipboard()\n"));
   if (!CloseClipboard ())
     {
-      g_warning ("gdk_selection_owner_set: CloseClipboard failed");
+      WIN32_API_FAILED ("CloseClipboard");
       return FALSE;
     }
   if (owner != NULL)
@@ -198,7 +198,7 @@ gdk_selection_convert (GdkWindow *requestor,
                                    GDK_DRAWABLE_XID (requestor)));
       if (!OpenClipboard (GDK_DRAWABLE_XID (requestor)))
        {
-         g_warning ("gdk_selection_convert: OpenClipboard failed");
+         WIN32_API_FAILED ("OpenClipboard");
          return;
        }
 
index 6e4d2b00c4535a2258e176aeabd14b1c2a9b00b3..e74cc0e61f42f40a6ec2a7df610d94a39498a43b 100644 (file)
@@ -51,7 +51,10 @@ SafeAdjustWindowRectEx (RECT* lpRect,
                        DWORD dwExStyle)
 {
   if (!AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle))
-    return FALSE;
+    {
+      WIN32_API_FAILED ("AdjustWindowRectEx");
+      return FALSE;
+    }
   if (lpRect->left < 0)
     {
       lpRect->right -= lpRect->left;
@@ -253,6 +256,11 @@ RegisterGdkClass (GdkDrawableType wtype)
       break;
   }
 
+  if (klass == 0)
+    {
+      WIN32_API_FAILED ("RegisterClassEx");
+      g_error ("That is a fatal error");
+    }
   return klass;
 }
 
@@ -382,8 +390,6 @@ gdk_window_new (GdkWindow     *parent,
     }
 
   klass = RegisterGdkClass (private->drawable.window_type);
-  if (!klass)
-    g_error ("RegisterClassEx failed");
 
   if (private->drawable.window_type != GDK_WINDOW_CHILD)
     {
@@ -401,8 +407,7 @@ gdk_window_new (GdkWindow     *parent,
       rect.right = rect.left + private->drawable.width;
       rect.bottom = rect.top + private->drawable.height;
 
-      if (!SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
-       g_warning ("gdk_window_new: AdjustWindowRectEx failed");
+      SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
 
       if (x != CW_USEDEFAULT)
        {
@@ -439,7 +444,7 @@ gdk_window_new (GdkWindow     *parent,
                    NULL);
 
   GDK_NOTE (MISC,
-           g_print ("gdk_window_create: %s %s %dx%d@+%d+%d %#x = %#x\n"
+           g_print ("gdk_window_new: %s %s %dx%d@+%d+%d %#x = %#x\n"
                     "...locale %#x codepage %d\n",
                     (private->drawable.window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
                      (private->drawable.window_type == GDK_WINDOW_CHILD ? "CHILD" :
@@ -458,7 +463,7 @@ gdk_window_new (GdkWindow     *parent,
 
   if (GDK_DRAWABLE_XID (window) == NULL)
     {
-      g_warning ("gdk_window_create: CreateWindowEx failed");
+      WIN32_API_FAILED ("CreateWindowEx");
       g_free (GDK_DRAWABLE_WIN32DATA (window));
       g_free (private);
       return NULL;
@@ -782,8 +787,7 @@ gdk_window_move (GdkWindow *window,
 
          dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
          dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
-         if (!SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
-           g_warning ("gdk_window_move: AdjustWindowRectEx failed");
+         SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
 
          x = rect.left;
          y = rect.top;
@@ -800,7 +804,7 @@ gdk_window_move (GdkWindow *window,
       if (!MoveWindow (GDK_DRAWABLE_XID (window),
                       x, y, rect.right - rect.left, rect.bottom - rect.top,
                       TRUE))
-       g_warning ("gdk_window_move: MoveWindow failed");
+       WIN32_API_FAILED ("MoveWindow");
     }
 }
 
@@ -848,7 +852,7 @@ gdk_window_resize (GdkWindow *window,
          dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
          dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
          if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
-           g_warning ("gdk_window_resize: AdjustWindowRectEx failed");
+           WIN32_API_FAILED ("AdjustWindowRectEx");
 
          x = rect.left;
          y = rect.top;
@@ -871,7 +875,7 @@ gdk_window_resize (GdkWindow *window,
       if (!MoveWindow (GDK_DRAWABLE_XID (window),
                       x, y, width, height,
                       TRUE))
-       g_warning ("gdk_window_resize: MoveWindow failed");
+       WIN32_API_FAILED ("MoveWindow");
     }
 }
 
@@ -909,7 +913,7 @@ gdk_window_move_resize (GdkWindow *window,
       dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
       dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
       if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
-       g_warning ("gdk_window_move_resize: AdjustWindowRectEx failed");
+       WIN32_API_FAILED ("AdjustWindowRectEx");
 
       if (private->drawable.window_type == GDK_WINDOW_CHILD)
        {
@@ -926,7 +930,7 @@ gdk_window_move_resize (GdkWindow *window,
                       rect.left, rect.top,
                       rect.right - rect.left, rect.bottom - rect.top,
                       TRUE))
-       g_warning ("gdk_window_move_resize: MoveWindow failed");
+       WIN32_API_FAILED ("MoveWindow");
 
       if (private->guffaw_gravity)
        {
@@ -972,14 +976,14 @@ gdk_window_reparent (GdkWindow *window,
                               GDK_DRAWABLE_XID (new_parent)));
       if (!SetParent (GDK_DRAWABLE_XID (window),
                      GDK_DRAWABLE_XID (new_parent)))
-       g_warning ("gdk_window_reparent: SetParent failed");
+       WIN32_API_FAILED ("SetParent");
 
       if (!MoveWindow (GDK_DRAWABLE_XID (window),
                       x, y,
                       window_private->drawable.width,
                       window_private->drawable.height,
                       TRUE))
-       g_warning ("gdk_window_reparent: MoveWindow failed");
+       WIN32_API_FAILED ("MoveWindow");
     }
   
   window_private->parent = new_parent;
@@ -1056,7 +1060,7 @@ gdk_window_clear_area_e (GdkWindow *window,
       rect.top = y;
       rect.bottom = y + height;
       if (!InvalidateRect (GDK_DRAWABLE_XID (window), &rect, TRUE))
-       g_warning ("gdk_window_clear_area_e: InvalidateRect failed");
+       WIN32_API_FAILED ("InvalidateRect");
       UpdateWindow (GDK_DRAWABLE_XID (window));
     }
 }
@@ -1073,7 +1077,7 @@ gdk_window_raise (GdkWindow *window)
                               GDK_DRAWABLE_XID (window)));
 
       if (!BringWindowToTop (GDK_DRAWABLE_XID (window)))
-       g_warning ("gdk_window_raise: BringWindowToTop failed");
+       WIN32_API_FAILED ("BringWindowToTop");
     }
 }
 
@@ -1090,7 +1094,7 @@ gdk_window_lower (GdkWindow *window)
 
       if (!SetWindowPos (GDK_DRAWABLE_XID (window), HWND_BOTTOM, 0, 0, 0, 0,
                         SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
-       g_warning ("gdk_window_lower: SetWindowPos failed");
+       WIN32_API_FAILED ("SetWindowPos");
     }
 }
 
@@ -1128,7 +1132,7 @@ gdk_window_set_hints (GdkWindow *window,
     {
       if (flags & GDK_HINT_POS)
        if (!GetWindowPlacement (GDK_DRAWABLE_XID (window), &size_hints))
-         g_warning ("gdk_window_set_hints: GetWindowPlacement failed");
+         WIN32_API_FAILED ("GetWindowPlacement");
        else
          {
            GDK_NOTE (MISC, g_print ("...rcNormalPosition:"
@@ -1165,7 +1169,7 @@ gdk_window_set_hints (GdkWindow *window,
                                     size_hints.rcNormalPosition.right,
                                     size_hints.rcNormalPosition.bottom));
            if (!SetWindowPlacement (GDK_DRAWABLE_XID (window), &size_hints))
-             g_warning ("gdk_window_set_hints: SetWindowPlacement failed");
+             WIN32_API_FAILED ("SetWindowPlacement");
            GDK_WINDOW_WIN32DATA (window)->hint_x = rect.left;
            GDK_WINDOW_WIN32DATA (window)->hint_y = rect.top;
          }
@@ -1294,7 +1298,7 @@ gdk_window_set_geometry_hints (GdkWindow      *window,
       && geometry->base_width > 0
       && geometry->base_height > 0)
     if (!GetWindowPlacement (GDK_DRAWABLE_XID (window), &size_hints))
-      g_warning ("gdk_window_set_hints: GetWindowPlacement failed");
+      WIN32_API_FAILED ("GetWindowPlacement");
     else
       {
        GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints:"
@@ -1313,7 +1317,7 @@ gdk_window_set_geometry_hints (GdkWindow      *window,
                                 size_hints.rcNormalPosition.right,
                                 size_hints.rcNormalPosition.bottom));
        if (!SetWindowPlacement (GDK_DRAWABLE_XID (window), &size_hints))
-         g_warning ("gdk_window_set_hints: SetWindowPlacement failed");
+         WIN32_API_FAILED ("SetWindowPlacement");
       }
   
   if (geom_mask & GDK_HINT_RESIZE_INC)
@@ -1355,7 +1359,7 @@ gdk_window_set_title (GdkWindow   *window,
                           mbstr, 3*titlelen, NULL, NULL);
 
       if (!SetWindowText (GDK_DRAWABLE_XID (window), mbstr))
-       g_warning ("gdk_window_set_title: SetWindowText failed");
+       WIN32_API_FAILED ("SetWindowText");
 
       g_free (mbstr);
       g_free (wcstr);
@@ -1497,7 +1501,7 @@ gdk_window_get_geometry (GdkWindow *window,
       RECT rect;
 
       if (!GetClientRect (GDK_DRAWABLE_XID (window), &rect))
-       g_warning ("gdk_window_get_geometry: GetClientRect failed");
+       WIN32_API_FAILED ("GetClientRect");
 
       if (x)
        *x = rect.left;
@@ -1824,7 +1828,10 @@ gdk_window_set_icon (GdkWindow *window,
   if (GDK_DRAWABLE_DESTROYED (window))
     return;
   
-  g_warning ("gdk_window_set_icon not implemented");
+  /* Nothing to do, really. As we share window classes between windows
+   * we can't have window-specific icons, sorry. Don't print any warning
+   * either.
+   */
 }
 
 void
@@ -1838,7 +1845,7 @@ gdk_window_set_icon_name (GdkWindow *window,
     return;
   
   if (!SetWindowText (GDK_DRAWABLE_XID (window), name))
-    g_warning ("gdk_window_set_icon_name: SetWindowText failed");
+    WIN32_API_FAILED ("SetWindowText");
 }
 
 void          
index 4af3a25619c2c7eee40ac6663f97fabd665924f0..f7d6b72658f680c586ea05300283e3a98f298385 100644 (file)
@@ -13,9 +13,6 @@ OPTIMIZE = -g -O
 
 CC = gcc -mno-cygwin -mpentium -fnative-struct
 
-CP = cp
-LD = ld
-
 GLIB_VER=1.3
 GTK_VER=1.3
 
@@ -52,13 +49,23 @@ gdk_win32_OBJECTS = \
        gdkwindow-win32.o
 
 ../../config.h : ../../config.h.win32
-       $(CP) ../../config.h.win32 ../../config.h
+       cp ../../config.h.win32 ../../config.h
 
 ../gdkconfig.h : ../gdkconfig.h.win32
-       $(CP) ../gdkconfig.h.win32 ../gdkconfig.h
+       cp ../gdkconfig.h.win32 ../gdkconfig.h
+
+# Kludge to get the path to the win32 headers
+WIN32APIHEADERS = $(shell echo "\#include <winver.h>" | $(CC) -M -E - | tail -1 | sed -e 's!/winver.h!!')
+
+gdk-win32res.o : rc/gdk.rc gdk-build.tmp
+       m4 -DBUILDNUMBER=`cat gdk-build.tmp` <rc/gdk.rc >gdk-win32res.rc
+       windres --include-dir rc --include-dir $(WIN32APIHEADERS) gdk-win32res.rc gdk-win32res.o
+       rm gdk-build.tmp gdk-win32res.rc
 
-gdk-win32res.o : rc/gdk.rc
-       windres --include-dir rc rc/gdk.rc gdk-win32res.o
+# Magic to bump the build number
+gdk-build.tmp :
+       bash -c "read number && echo $$[number+1]" <gdk-build.stamp >gdk-build.tmp
+       cp gdk-build.tmp gdk-build.stamp
 
 libgdk-win32.a : $(gdk_win32_OBJECTS) 
        -rm -f $@
index b52b3f1b2e6a535fa6c103db458dacfd099d9500..ee4d56e6328688af44a7daeec180cf0cf01a8098 100644 (file)
@@ -1,3 +1,5 @@
+#include <winver.h>
+
 GTK_ICON               ICON                    "gtk.ico"
 X_cursor                CURSOR  DISCARDABLE     "cursor00.cur"
 arrow                   CURSOR  DISCARDABLE     "cursor02.cur"
@@ -76,3 +78,32 @@ umbrella                CURSOR  DISCARDABLE     "cursor92.cur"
 ur_angle                CURSOR  DISCARDABLE     "cursor94.cur"
 xterm                   CURSOR  DISCARDABLE     "cursor98.cur"
 watch                   CURSOR  DISCARDABLE     "cursor96.cur"
+
+VS_VERSION_INFO VERSIONINFO
+  FILEVERSION 1,3,0,BUILDNUMBER
+  PRODUCTVERSION 1,3,0,0
+  FILEFLAGSMASK 0
+  FILEFLAGS 0
+  FILEOS VOS__WINDOWS32
+  FILETYPE VFT_DLL
+  FILESUBTYPE VFT2_UNKNOWN
+  BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+      BLOCK "040904B0"
+      BEGIN
+       VALUE "CompanyName", "The GTk+ developer community"
+       VALUE "FileDescription", "GIMP Drawing Kit"
+       VALUE "FileVersion", "1.3.0.BUILDNUMBER"
+       VALUE "InternalName", "gdk-1.3"
+       VALUE "LegalCopyright", "Copyright © 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald. Modified by the GTK+ Team and others 1997-2000."
+       VALUE "OriginalFilename", "gdk-1.3.dll"
+       VALUE "ProductName", "GTk+"
+       VALUE "ProductVersion", "1.3.0"
+      END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+      VALUE "Translation", 0x409, 1200
+    END
+  END
diff --git a/gtk/gtk.rc b/gtk/gtk.rc
new file mode 100644 (file)
index 0000000..c2cfc0a
--- /dev/null
@@ -0,0 +1,30 @@
+#include <winver.h>
+
+VS_VERSION_INFO VERSIONINFO
+  FILEVERSION 1,3,0,BUILDNUMBER
+  PRODUCTVERSION 1,3,0,0
+  FILEFLAGSMASK 0
+  FILEFLAGS 0
+  FILEOS VOS__WINDOWS32
+  FILETYPE VFT_DLL
+  FILESUBTYPE VFT2_UNKNOWN
+  BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+      BLOCK "040904B0"
+      BEGIN
+       VALUE "CompanyName", "The GTk+ developer community"
+       VALUE "FileDescription", "GIMP Toolkit"
+       VALUE "FileVersion", "1.3.0.BUILDNUMBER"
+       VALUE "InternalName", "gtk-1.3"
+       VALUE "LegalCopyright", "Copyright © 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald. Modified by the GTK+ Team and others 1997-2000."
+       VALUE "OriginalFilename", "gtk-1.3.dll"
+       VALUE "ProductName", "GTk+"
+       VALUE "ProductVersion", "1.3.0"
+      END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+      VALUE "Translation", 0x409, 1200
+    END
+  END
index 85c8c7dda1539a33ae7798ade8e7e53a5aa09649..ab0c71756a6d94befa8ba5711c77e7213a68ada2 100644 (file)
@@ -327,11 +327,24 @@ gtkmarshal.h gtkmarshal.c : gtkmarshal.list genmarshal.pl
 #
 # Linking:
 #
-gtk-$(GTK_VER).dll : generated $(gtk_OBJECTS) gtk.def
-       $(GLIB)/build-dll gtk $(GTK_VER) gtk.def $(gtk_OBJECTS) -L ../gdk -lgdk-$(GTK_VER) -L$(INTL) -lgnu-intl -L $(GLIB) -lglib-$(GLIB_VER) -lgmodule-$(GLIB_VER) -lgdi32 -luser32
+gtk-$(GTK_VER).dll : generated $(gtk_OBJECTS) gtk.def gtk-win32res.o
+       $(GLIB)/build-dll gtk $(GTK_VER) gtk.def $(gtk_OBJECTS) gtk-win32res.o -L ../gdk -lgdk-$(GTK_VER) -L$(INTL) -lgnu-intl -L $(GLIB) -lglib-$(GLIB_VER) -lgmodule-$(GLIB_VER) -lgdi32 -luser32
 
 .SUFFIXES: .c .o .i
 
+# Kludge to get the path to the win32 headers
+WIN32APIHEADERS = $(shell echo "\#include <winver.h>" | $(CC) -M -E - | tail -1 | sed -e 's!/winver.h!!')
+
+gtk-win32res.o : gtk.rc gtk-build.tmp
+       m4 -DBUILDNUMBER=`cat gtk-build.tmp` <gtk.rc >gtk-win32res.rc
+       windres --include-dir $(WIN32APIHEADERS) gtk-win32res.rc gtk-win32res.o
+       rm gtk-build.tmp gtk-win32res.rc
+
+# Magic to bump the build number
+gtk-build.tmp :
+       bash -c "read number && echo $$[number+1]" <gtk-build.stamp >gtk-build.tmp
+       cp gtk-build.tmp gtk-build.stamp
+
 # General rule for compiling the objects into the DLL
 .c.o :
        $(CC) $(CFLAGS) -c -DGTK_COMPILATION -DG_LOG_DOMAIN=\"Gtk\" $<