mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-26 05:31:07 +00:00
1f149b3a8d
2000-05-02 Tor Lillqvist <tml@iki.fi> Large changes to the Win32 backend, partially made necessary by the changes to the backend-independent internal structures. Attempts to implement similar backing store stuff as on X11. The current (CVS) version of the Win32 backend is *not* as stable as it was before the no-flicker branch was merged. A zipfile with that version is available from http://www.gimp.org/win32/. That should be use by "production" code until this CVS version is usable. (But note, the Win32 backend has never been claimed to be "production quality".) * README.win32: Add the above comment about versions. * gdk/gdkwindow.c: Don't use backing store for now on Win32. * gdk/gdk.def: Update. * gdk/gdkfont.h: Declare temporary Win32-only functions. Will presumably be replaced by some more better mechanism as 1.4 gets closer to release shape. * gdk/makefile.{cygwin,msc}: Update. * gdk/win32/*.c: Correct inclusions of the backend-specific and internal headers. Change code according to changes in these. Use gdk_drawable_*, not gdk_window_* where necessary. * gdk/win32/gdkdnd-win32.c: Use MISC selector for GDK_NOTE, not our old DND. * gdk/win32/gdkdrawable-win32.c (gdk_win32_draw_text): Don't try to interpret single characters as UTF-8. Thanks to Hans Breuer. Use correct function name in warning messages. * gdk/win32/gdkevents-win32.c: Use correct parameter lists for the GSourceFuncs gdk_event_prepare and gdk_event_check. (gdk_event_get_graphics_expose): Do implement, use PeekMessage. Thanks to Hans Breuer. (event_mask_string): Debugging function to print an GdkEventMask. (gdk_pointer_grab): Use it. * gdk/win32/gdkfont-win32.c: The Unicode subrange that the (old) book I used claimed was Hangul actually is CJK Unified Ideographs Extension A. Also, Hangul Syllables were missing. Improve logging. * gdk/win32/gdkgc-win32.c: Largish changes. * gdk/win32/gdkim-win32.c (gdk_set_locale): Use g_win32_getlocale() from GLib, and not setlocale() to get current locale name. * gdk/win32/gdkprivate-win32.h * gdk/win32/gdkwin32.h: Move stuff from gdkprivate-win32.h to gdkwin32.h, similarily as in the X11 backend. * gdk/win32/gdkwindow-win32.c (gdk_propagate_shapes): Bugfix, assignment was used instead of equals in if test. Thanks to Hans Breuer. * gdk/win32/makefile.{cygwin,msc} * gtk/makefile.{cygwin,msc}: Updates. Better kludge to get the path to the Win32 headers that works also with the mingw compiler. * gtk/gtkstyle.c: Include <string.h>.
329 lines
7.4 KiB
C
329 lines
7.4 KiB
C
#error this file should not be used, I think
|
|
|
|
/* GDK - The GIMP Drawing Kit
|
|
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
* Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
|
|
* file for a list of people on the GTK+ Team. See the ChangeLog
|
|
* files for a list of changes. These files are distributed with
|
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include "gdk.h"
|
|
#include "gdkprivate-win32.h"
|
|
|
|
|
|
GdkRegion*
|
|
gdk_region_new (void)
|
|
{
|
|
GdkRegionPrivate *private;
|
|
GdkRegion *region;
|
|
HRGN xregion;
|
|
RECT emptyRect;
|
|
|
|
/* Create an empty region */
|
|
SetRectEmpty (&emptyRect);
|
|
xregion = CreateRectRgnIndirect (&emptyRect);
|
|
private = g_new (GdkRegionPrivate, 1);
|
|
private->xregion = xregion;
|
|
region = (GdkRegion*) private;
|
|
region->user_data = NULL;
|
|
|
|
return region;
|
|
}
|
|
|
|
void
|
|
gdk_region_destroy (GdkRegion *region)
|
|
{
|
|
GdkRegionPrivate *private;
|
|
|
|
g_return_if_fail (region != NULL);
|
|
|
|
private = (GdkRegionPrivate *) region;
|
|
DeleteObject (private->xregion);
|
|
g_free (private);
|
|
}
|
|
|
|
gboolean
|
|
gdk_region_empty (GdkRegion *region)
|
|
{
|
|
GdkRegionPrivate *private;
|
|
RECT rect;
|
|
|
|
g_return_val_if_fail (region != NULL, 0);
|
|
|
|
private = (GdkRegionPrivate *) region;
|
|
|
|
return (GetRgnBox (private->xregion, &rect) == NULLREGION);
|
|
}
|
|
|
|
gboolean
|
|
gdk_region_equal (GdkRegion *region1,
|
|
GdkRegion *region2)
|
|
{
|
|
GdkRegionPrivate *private1;
|
|
GdkRegionPrivate *private2;
|
|
|
|
g_return_val_if_fail (region1 != NULL, 0);
|
|
g_return_val_if_fail (region2 != NULL, 0);
|
|
|
|
private1 = (GdkRegionPrivate *) region1;
|
|
private2 = (GdkRegionPrivate *) region2;
|
|
|
|
return EqualRgn (private1->xregion, private2->xregion);
|
|
}
|
|
|
|
void
|
|
gdk_region_get_clipbox(GdkRegion *region,
|
|
GdkRectangle *rectangle)
|
|
{
|
|
GdkRegionPrivate *rp;
|
|
RECT r;
|
|
|
|
g_return_if_fail(region != NULL);
|
|
g_return_if_fail(rectangle != NULL);
|
|
|
|
rp = (GdkRegionPrivate *)region;
|
|
|
|
GetRgnBox (rp->xregion, &r);
|
|
rectangle->x = r.left;
|
|
rectangle->y = r.top;
|
|
rectangle->width = r.right - r.left;
|
|
rectangle->height = r.bottom - r.top;
|
|
}
|
|
|
|
gboolean
|
|
gdk_region_point_in (GdkRegion *region,
|
|
gint x,
|
|
gint y)
|
|
{
|
|
GdkRegionPrivate *private;
|
|
|
|
g_return_val_if_fail (region != NULL, 0);
|
|
|
|
private = (GdkRegionPrivate *) region;
|
|
|
|
return PtInRegion (private->xregion, x, y);
|
|
}
|
|
|
|
GdkOverlapType
|
|
gdk_region_rect_in (GdkRegion *region,
|
|
GdkRectangle *rect)
|
|
{
|
|
GdkRegionPrivate *private;
|
|
RECT r;
|
|
int res;
|
|
|
|
g_return_val_if_fail (region != NULL, 0);
|
|
|
|
private = (GdkRegionPrivate *) region;
|
|
|
|
r.left = rect->x;
|
|
r.top = rect->y;
|
|
r.right = rect->x + rect->width;
|
|
r.bottom = rect->y + rect->height;
|
|
|
|
if (RectInRegion (private->xregion, &r))
|
|
return GDK_OVERLAP_RECTANGLE_PART;
|
|
|
|
return GDK_OVERLAP_RECTANGLE_OUT; /*what else ? */
|
|
}
|
|
|
|
GdkRegion *
|
|
gdk_region_polygon (GdkPoint *points,
|
|
gint npoints,
|
|
GdkFillRule fill_rule)
|
|
{
|
|
GdkRegionPrivate *private;
|
|
GdkRegion *region;
|
|
HRGN xregion;
|
|
POINT *pts;
|
|
gint xfill_rule = ALTERNATE;
|
|
gint i;
|
|
|
|
g_return_val_if_fail (points != NULL, NULL);
|
|
g_return_val_if_fail (npoints != 0, NULL); /* maybe we should check for at least three points */
|
|
|
|
switch (fill_rule)
|
|
{
|
|
case GDK_EVEN_ODD_RULE:
|
|
xfill_rule = ALTERNATE;
|
|
break;
|
|
|
|
case GDK_WINDING_RULE:
|
|
xfill_rule = WINDING;
|
|
break;
|
|
}
|
|
|
|
pts = g_malloc (npoints * sizeof (*pts));
|
|
for (i = 0; i < npoints; i++)
|
|
{
|
|
pts[i].x = points[i].x;
|
|
pts[i].y = points[i].y;
|
|
}
|
|
xregion = CreatePolygonRgn (pts, npoints, xfill_rule);
|
|
g_free (pts);
|
|
|
|
private = g_new (GdkRegionPrivate, 1);
|
|
private->xregion = xregion;
|
|
region = (GdkRegion *) private;
|
|
region->user_data = NULL;
|
|
|
|
return region;
|
|
}
|
|
|
|
void
|
|
gdk_region_offset (GdkRegion *region,
|
|
gint dx,
|
|
gint dy)
|
|
{
|
|
GdkRegionPrivate *private;
|
|
|
|
g_return_if_fail (region != NULL);
|
|
|
|
private = (GdkRegionPrivate *) region;
|
|
|
|
OffsetRgn (private->xregion, dx, dy);
|
|
}
|
|
|
|
void
|
|
gdk_region_shrink (GdkRegion *region,
|
|
gint dx,
|
|
gint dy)
|
|
{
|
|
GdkRegionPrivate *private;
|
|
HRGN shrunken_bbox;
|
|
RECT r;
|
|
|
|
g_return_if_fail (region != NULL);
|
|
|
|
private = (GdkRegionPrivate *) region;
|
|
|
|
if (dx > 0 || dy > 0)
|
|
{
|
|
/* We want to shrink it in one or both dimensions.
|
|
* Is it correct just to intersect it with a smaller bounding box?
|
|
* XXX
|
|
*/
|
|
GetRgnBox (private->xregion, &r);
|
|
if (dx > 0)
|
|
{
|
|
r.left += dx - dx/2;
|
|
r.right -= dx/2;
|
|
}
|
|
if (dy > 0)
|
|
{
|
|
r.top += dy - dy/2;
|
|
r.bottom -= dy/2;
|
|
}
|
|
|
|
shrunken_bbox = CreateRectRgnIndirect (&r);
|
|
CombineRgn (private->xregion, private->xregion,
|
|
shrunken_bbox, RGN_AND);
|
|
DeleteObject (shrunken_bbox);
|
|
}
|
|
else
|
|
{
|
|
/* Do nothing if the regions is expanded? XXX */
|
|
}
|
|
}
|
|
|
|
GdkRegion*
|
|
gdk_region_union_with_rect (GdkRegion *region,
|
|
GdkRectangle *rect)
|
|
{
|
|
GdkRegionPrivate *private;
|
|
GdkRegion *res;
|
|
GdkRegionPrivate *res_private;
|
|
RECT xrect;
|
|
HRGN rectangle;
|
|
|
|
g_return_val_if_fail (region != NULL, NULL);
|
|
|
|
private = (GdkRegionPrivate *) region;
|
|
|
|
xrect.left = rect->x;
|
|
xrect.top = rect->y;
|
|
xrect.right = rect->x + rect->width;
|
|
xrect.bottom = rect->y + rect->height;
|
|
|
|
res = gdk_region_new ();
|
|
res_private = (GdkRegionPrivate *) res;
|
|
|
|
rectangle = CreateRectRgnIndirect (&xrect);
|
|
CombineRgn (res_private->xregion, private->xregion,
|
|
rectangle, RGN_OR);
|
|
DeleteObject (rectangle);
|
|
return res;
|
|
}
|
|
|
|
static GdkRegion *
|
|
gdk_regions_op (GdkRegion *source1,
|
|
GdkRegion *source2,
|
|
guint op)
|
|
{
|
|
GdkRegionPrivate *private1;
|
|
GdkRegionPrivate *private2;
|
|
GdkRegion *res;
|
|
GdkRegionPrivate *res_private;
|
|
|
|
g_return_val_if_fail (source1 != NULL, NULL);
|
|
g_return_val_if_fail (source2 != NULL, NULL);
|
|
|
|
private1 = (GdkRegionPrivate *) source1;
|
|
private2 = (GdkRegionPrivate *) source2;
|
|
|
|
res = gdk_region_new ();
|
|
res_private = (GdkRegionPrivate *) res;
|
|
|
|
CombineRgn (res_private->xregion, private1->xregion, private2->xregion, op);
|
|
return res;
|
|
}
|
|
|
|
GdkRegion*
|
|
gdk_regions_intersect (GdkRegion *source1,
|
|
GdkRegion *source2)
|
|
{
|
|
return gdk_regions_op (source1, source2, RGN_AND);
|
|
}
|
|
|
|
GdkRegion*
|
|
gdk_regions_union (GdkRegion *source1,
|
|
GdkRegion *source2)
|
|
{
|
|
return gdk_regions_op (source1, source2, RGN_OR);
|
|
}
|
|
|
|
GdkRegion*
|
|
gdk_regions_subtract (GdkRegion *source1,
|
|
GdkRegion *source2)
|
|
{
|
|
return gdk_regions_op (source1, source2, RGN_DIFF);
|
|
}
|
|
|
|
GdkRegion*
|
|
gdk_regions_xor (GdkRegion *source1,
|
|
GdkRegion *source2)
|
|
{
|
|
return gdk_regions_op (source1, source2, RGN_XOR);
|
|
}
|