cvs remove the old files after copying the files over to the -win32 names in the repository
This commit is contained in:
parent
be83b5c9d3
commit
af73e9d21b
2115
gdk/win32/gdk.c
2115
gdk/win32/gdk.c
File diff suppressed because it is too large
Load Diff
2234
gdk/win32/gdkcolor.c
2234
gdk/win32/gdkcolor.c
File diff suppressed because it is too large
Load Diff
@ -1,274 +0,0 @@
|
|||||||
/* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "gdkcursor.h"
|
|
||||||
#include "gdkprivate.h"
|
|
||||||
|
|
||||||
static const struct { const char *name; int type; } cursors[] = {
|
|
||||||
{ "x_cursor", 0 },
|
|
||||||
{ "arrow", 2 },
|
|
||||||
{ "based_arrow_down", 4 },
|
|
||||||
{ "based_arrow_up", 6 },
|
|
||||||
{ "boat", 8 },
|
|
||||||
{ "bogosity", 10 },
|
|
||||||
{ "bottom_left_corner", 12 },
|
|
||||||
{ "bottom_right_corner", 14 },
|
|
||||||
{ "bottom_side", 16 },
|
|
||||||
{ "bottom_tee", 18 },
|
|
||||||
{ "box_spiral", 20 },
|
|
||||||
{ "center_ptr", 22 },
|
|
||||||
{ "circle", 24 },
|
|
||||||
{ "clock", 26 },
|
|
||||||
{ "coffee_mug", 28 },
|
|
||||||
{ "cross", 30 },
|
|
||||||
{ "cross_reverse", 32 },
|
|
||||||
{ "crosshair", 34 },
|
|
||||||
{ "diamond_cross", 36 },
|
|
||||||
{ "dot", 38 },
|
|
||||||
{ "dotbox", 40 },
|
|
||||||
{ "double_arrow", 42 },
|
|
||||||
{ "draft_large", 44 },
|
|
||||||
{ "draft_small", 46 },
|
|
||||||
{ "draped_box", 48 },
|
|
||||||
{ "exchange", 50 },
|
|
||||||
{ "fleur", 52 },
|
|
||||||
{ "gobbler", 54 },
|
|
||||||
{ "gumby", 56 },
|
|
||||||
{ "hand1", 58 },
|
|
||||||
{ "hand2", 60 },
|
|
||||||
{ "heart", 62 },
|
|
||||||
{ "icon", 64 },
|
|
||||||
{ "iron_cross", 66 },
|
|
||||||
{ "left_ptr", 68 },
|
|
||||||
{ "left_side", 70 },
|
|
||||||
{ "left_tee", 72 },
|
|
||||||
{ "leftbutton", 74 },
|
|
||||||
{ "ll_angle", 76 },
|
|
||||||
{ "lr_angle", 78 },
|
|
||||||
{ "man", 80 },
|
|
||||||
{ "middlebutton", 82 },
|
|
||||||
{ "mouse", 84 },
|
|
||||||
{ "pencil", 86 },
|
|
||||||
{ "pirate", 88 },
|
|
||||||
{ "plus", 90 },
|
|
||||||
{ "question_arrow", 92 },
|
|
||||||
{ "right_ptr", 94 },
|
|
||||||
{ "right_side", 96 },
|
|
||||||
{ "right_tee", 98 },
|
|
||||||
{ "rightbutton", 100 },
|
|
||||||
{ "rtl_logo", 102 },
|
|
||||||
{ "sailboat", 104 },
|
|
||||||
{ "sb_down_arrow", 106 },
|
|
||||||
{ "sb_h_double_arrow", 108 },
|
|
||||||
{ "sb_left_arrow", 110 },
|
|
||||||
{ "sb_right_arrow", 112 },
|
|
||||||
{ "sb_up_arrow", 114 },
|
|
||||||
{ "sb_v_double_arrow", 116 },
|
|
||||||
{ "shuttle", 118 },
|
|
||||||
{ "sizing", 120 },
|
|
||||||
{ "spider", 122 },
|
|
||||||
{ "spraycan", 124 },
|
|
||||||
{ "star", 126 },
|
|
||||||
{ "target", 128 },
|
|
||||||
{ "tcross", 130 },
|
|
||||||
{ "top_left_arrow", 132 },
|
|
||||||
{ "top_left_corner", 134 },
|
|
||||||
{ "top_right_corner", 136 },
|
|
||||||
{ "top_side", 138 },
|
|
||||||
{ "top_tee", 140 },
|
|
||||||
{ "trek", 142 },
|
|
||||||
{ "ul_angle", 144 },
|
|
||||||
{ "umbrella", 146 },
|
|
||||||
{ "ur_angle", 148 },
|
|
||||||
{ "watch", 150 },
|
|
||||||
{ "xterm", 152 },
|
|
||||||
{ NULL, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
GdkCursor*
|
|
||||||
gdk_cursor_new (GdkCursorType cursor_type)
|
|
||||||
{
|
|
||||||
GdkCursorPrivate *private;
|
|
||||||
GdkCursor *cursor;
|
|
||||||
HCURSOR xcursor;
|
|
||||||
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; cursors[i].name != NULL && cursors[i].type != cursor_type; i++)
|
|
||||||
;
|
|
||||||
if (cursors[i].name != NULL)
|
|
||||||
{
|
|
||||||
xcursor = LoadCursor (gdk_DLLInstance, cursors[i].name);
|
|
||||||
if (xcursor == NULL)
|
|
||||||
g_warning ("gdk_cursor_new: LoadCursor failed");
|
|
||||||
GDK_NOTE (MISC, g_print ("gdk_cursor_new: %#x %d\n",
|
|
||||||
xcursor, cursor_type));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_warning ("gdk_cursor_new: no cursor %d found",
|
|
||||||
cursor_type);
|
|
||||||
xcursor = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
private = g_new (GdkCursorPrivate, 1);
|
|
||||||
private->xcursor = xcursor;
|
|
||||||
cursor = (GdkCursor*) private;
|
|
||||||
cursor->type = cursor_type;
|
|
||||||
|
|
||||||
return cursor;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkCursor*
|
|
||||||
gdk_cursor_new_from_pixmap (GdkPixmap *source,
|
|
||||||
GdkPixmap *mask,
|
|
||||||
GdkColor *fg,
|
|
||||||
GdkColor *bg,
|
|
||||||
gint x,
|
|
||||||
gint y)
|
|
||||||
{
|
|
||||||
GdkCursorPrivate *private;
|
|
||||||
GdkCursor *cursor;
|
|
||||||
GdkDrawablePrivate *source_private, *mask_private;
|
|
||||||
GdkImage *source_image, *mask_image;
|
|
||||||
HCURSOR xcursor;
|
|
||||||
guchar *p, *q, *XORmask, *ANDmask;
|
|
||||||
gint width, height, cursor_width, cursor_height;
|
|
||||||
guchar residue;
|
|
||||||
gint ix, iy;
|
|
||||||
|
|
||||||
g_return_val_if_fail (source != NULL, NULL);
|
|
||||||
g_return_val_if_fail (mask != NULL, NULL);
|
|
||||||
|
|
||||||
source_private = (GdkDrawablePrivate *) source;
|
|
||||||
mask_private = (GdkDrawablePrivate *) mask;
|
|
||||||
|
|
||||||
g_return_val_if_fail (source_private->width == mask_private->width
|
|
||||||
&& source_private->height == mask_private->height,
|
|
||||||
NULL);
|
|
||||||
width = source_private->width;
|
|
||||||
height = source_private->height;
|
|
||||||
cursor_width = GetSystemMetrics (SM_CXCURSOR);
|
|
||||||
cursor_height = GetSystemMetrics (SM_CYCURSOR);
|
|
||||||
|
|
||||||
g_return_val_if_fail (width <= cursor_width
|
|
||||||
&& height <= cursor_height, NULL);
|
|
||||||
|
|
||||||
residue = (1 << ((8-(width%8))%8)) - 1;
|
|
||||||
|
|
||||||
source_image = gdk_image_get (source, 0, 0, width, height);
|
|
||||||
mask_image = gdk_image_get (mask, 0, 0, width, height);
|
|
||||||
|
|
||||||
if (source_image->depth != 1 || mask_image->depth != 1)
|
|
||||||
{
|
|
||||||
gdk_image_destroy (source_image);
|
|
||||||
gdk_image_destroy (mask_image);
|
|
||||||
g_return_val_if_fail (source_image->depth == 1 && mask_image->depth == 1,
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Such complex bit manipulation for this simple task, sigh.
|
|
||||||
* The X cursor and Windows cursor concepts are quite different.
|
|
||||||
* We assume here that we are always called with fg == black and
|
|
||||||
* bg == white.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* First set masked-out source bits, as all source bits matter on Windoze.
|
|
||||||
* As we invert them below, they will be clear in the final XORmask.
|
|
||||||
*/
|
|
||||||
for (iy = 0; iy < height; iy++)
|
|
||||||
{
|
|
||||||
p = (guchar *) source_image->mem + iy*source_image->bpl;
|
|
||||||
q = (guchar *) mask_image->mem + iy*mask_image->bpl;
|
|
||||||
|
|
||||||
for (ix = 0; ix < ((width-1)/8+1); ix++)
|
|
||||||
*p++ |= ~(*q++);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* XOR mask is initialized to zero */
|
|
||||||
XORmask = g_malloc0 (cursor_width/8 * cursor_height);
|
|
||||||
|
|
||||||
for (iy = 0; iy < height; iy++)
|
|
||||||
{
|
|
||||||
p = (guchar *) source_image->mem + iy*source_image->bpl;
|
|
||||||
q = XORmask + iy*cursor_width/8;
|
|
||||||
|
|
||||||
for (ix = 0; ix < ((width-1)/8+1); ix++)
|
|
||||||
*q++ = ~(*p++);
|
|
||||||
q[-1] &= ~residue; /* Clear left-over bits */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* AND mask is initialized to ones */
|
|
||||||
ANDmask = g_malloc (cursor_width/8 * cursor_height);
|
|
||||||
memset (ANDmask, 0xFF, cursor_width/8 * cursor_height);
|
|
||||||
|
|
||||||
for (iy = 0; iy < height; iy++)
|
|
||||||
{
|
|
||||||
p = (guchar *) mask_image->mem + iy*mask_image->bpl;
|
|
||||||
q = ANDmask + iy*cursor_width/8;
|
|
||||||
|
|
||||||
for (ix = 0; ix < ((width-1)/8+1); ix++)
|
|
||||||
*q++ = ~(*p++);
|
|
||||||
q[-1] |= residue; /* Set left-over bits */
|
|
||||||
}
|
|
||||||
|
|
||||||
xcursor = CreateCursor (gdk_ProgInstance, x, y, cursor_width, cursor_height,
|
|
||||||
ANDmask, XORmask);
|
|
||||||
|
|
||||||
GDK_NOTE (MISC, g_print ("gdk_cursor_new_from_pixmap: "
|
|
||||||
"%#x (%dx%d) %#x (%dx%d) = %#x (%dx%d)\n",
|
|
||||||
source_private->xwindow,
|
|
||||||
source_private->width, source_private->height,
|
|
||||||
mask_private->xwindow,
|
|
||||||
mask_private->width, mask_private->height,
|
|
||||||
xcursor, cursor_width, cursor_height));
|
|
||||||
|
|
||||||
g_free (XORmask);
|
|
||||||
g_free (ANDmask);
|
|
||||||
|
|
||||||
gdk_image_destroy (source_image);
|
|
||||||
gdk_image_destroy (mask_image);
|
|
||||||
|
|
||||||
private = g_new (GdkCursorPrivate, 1);
|
|
||||||
private->xcursor = xcursor;
|
|
||||||
cursor = (GdkCursor*) private;
|
|
||||||
cursor->type = GDK_CURSOR_IS_PIXMAP;
|
|
||||||
|
|
||||||
return cursor;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_cursor_destroy (GdkCursor *cursor)
|
|
||||||
{
|
|
||||||
GdkCursorPrivate *private;
|
|
||||||
|
|
||||||
g_return_if_fail (cursor != NULL);
|
|
||||||
private = (GdkCursorPrivate *) cursor;
|
|
||||||
|
|
||||||
GDK_NOTE (MISC, g_print ("gdk_cursor_destroy: %#x\n",
|
|
||||||
(cursor->type == GDK_CURSOR_IS_PIXMAP) ? private->xcursor : 0));
|
|
||||||
|
|
||||||
if (cursor->type == GDK_CURSOR_IS_PIXMAP)
|
|
||||||
if (!DestroyIcon (private->xcursor))
|
|
||||||
g_warning ("gdk_cursor_destroy: DestroyIcon failed");
|
|
||||||
|
|
||||||
g_free (private);
|
|
||||||
}
|
|
@ -1,973 +0,0 @@
|
|||||||
/* GDK - The GIMP Drawing Kit
|
|
||||||
* Copyright (C) 1995-1999 Peter Mattis, Spencer Kimball and Josh MacDonald
|
|
||||||
* Copyright (C) 1998-1999 Tor Lillqvist
|
|
||||||
*
|
|
||||||
* 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 <string.h>
|
|
||||||
|
|
||||||
/* #define OLE2_DND */
|
|
||||||
|
|
||||||
#define INITGUID
|
|
||||||
|
|
||||||
#include "gdkdnd.h"
|
|
||||||
#include "gdkproperty.h"
|
|
||||||
#include "gdkprivate.h"
|
|
||||||
#include "gdkx.h"
|
|
||||||
|
|
||||||
#ifdef OLE2_DND
|
|
||||||
#include <ole2.h>
|
|
||||||
#else
|
|
||||||
#include <objbase.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _MSC_VER /* These aren't in mingw32 */
|
|
||||||
#include <shlobj.h>
|
|
||||||
#include <shlguid.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _MSC_VER
|
|
||||||
static IID IID_IUnknown = {
|
|
||||||
0x00000000, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
|
|
||||||
static IID IID_IDropSource = {
|
|
||||||
0x00000121, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
|
|
||||||
static IID IID_IDropTarget = {
|
|
||||||
0x00000122, 0x0000, 0x0000, { 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46 } };
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
|
||||||
|
|
||||||
typedef struct _GdkDragContextPrivate GdkDragContextPrivate;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
GDK_DRAG_STATUS_DRAG,
|
|
||||||
GDK_DRAG_STATUS_MOTION_WAIT,
|
|
||||||
GDK_DRAG_STATUS_ACTION_WAIT,
|
|
||||||
GDK_DRAG_STATUS_DROP
|
|
||||||
} GtkDragStatus;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
GDK_DRAG_SOURCE,
|
|
||||||
GDK_DRAG_TARGET
|
|
||||||
} GdkDragKind;
|
|
||||||
|
|
||||||
#ifdef OLE2_DND
|
|
||||||
|
|
||||||
#define PRINT_GUID(guid) \
|
|
||||||
g_print ("guid = %.08x-%.04x-%.04x-%.02x%.02x-%.02x%.02x%.02x%.02x%.02x%.02x", \
|
|
||||||
((gulong *) guid)[0], \
|
|
||||||
((gushort *) guid)[2], \
|
|
||||||
((gushort *) guid)[3], \
|
|
||||||
((guchar *) guid)[8], \
|
|
||||||
((guchar *) guid)[9], \
|
|
||||||
((guchar *) guid)[10], \
|
|
||||||
((guchar *) guid)[11], \
|
|
||||||
((guchar *) guid)[12], \
|
|
||||||
((guchar *) guid)[13], \
|
|
||||||
((guchar *) guid)[14], \
|
|
||||||
((guchar *) guid)[15]);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* OLE2_DND */
|
|
||||||
|
|
||||||
/* Structure that holds information about a drag in progress.
|
|
||||||
* this is used on both source and destination sides.
|
|
||||||
*/
|
|
||||||
struct _GdkDragContextPrivate {
|
|
||||||
GdkDragContext context;
|
|
||||||
|
|
||||||
guint ref_count;
|
|
||||||
|
|
||||||
guint16 last_x; /* Coordinates from last event */
|
|
||||||
guint16 last_y;
|
|
||||||
HWND dest_xid;
|
|
||||||
guint drag_status; /* Current status of drag */
|
|
||||||
};
|
|
||||||
|
|
||||||
GdkDragContext *current_dest_drag = NULL;
|
|
||||||
|
|
||||||
/* Drag Contexts */
|
|
||||||
|
|
||||||
static GList *contexts;
|
|
||||||
|
|
||||||
GdkDragContext *
|
|
||||||
gdk_drag_context_new (void)
|
|
||||||
{
|
|
||||||
GdkDragContextPrivate *result;
|
|
||||||
|
|
||||||
result = g_new0 (GdkDragContextPrivate, 1);
|
|
||||||
|
|
||||||
result->ref_count = 1;
|
|
||||||
|
|
||||||
contexts = g_list_prepend (contexts, result);
|
|
||||||
|
|
||||||
return (GdkDragContext *)result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_drag_context_ref (GdkDragContext *context)
|
|
||||||
{
|
|
||||||
g_return_if_fail (context != NULL);
|
|
||||||
|
|
||||||
((GdkDragContextPrivate *)context)->ref_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_drag_context_unref (GdkDragContext *context)
|
|
||||||
{
|
|
||||||
GdkDragContextPrivate *private = (GdkDragContextPrivate *)context;
|
|
||||||
|
|
||||||
g_return_if_fail (context != NULL);
|
|
||||||
|
|
||||||
private->ref_count--;
|
|
||||||
|
|
||||||
GDK_NOTE (DND, g_print ("gdk_drag_context_unref: %d%s\n",
|
|
||||||
private->ref_count,
|
|
||||||
(private->ref_count == 0 ? " freeing" : "")));
|
|
||||||
|
|
||||||
if (private->ref_count == 0)
|
|
||||||
{
|
|
||||||
g_dataset_destroy (private);
|
|
||||||
|
|
||||||
g_list_free (context->targets);
|
|
||||||
|
|
||||||
if (context->source_window)
|
|
||||||
gdk_window_unref (context->source_window);
|
|
||||||
|
|
||||||
if (context->dest_window)
|
|
||||||
gdk_window_unref (context->dest_window);
|
|
||||||
|
|
||||||
contexts = g_list_remove (contexts, private);
|
|
||||||
g_free (private);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
static GdkDragContext *
|
|
||||||
gdk_drag_context_find (gboolean is_source,
|
|
||||||
HWND source_xid,
|
|
||||||
HWND dest_xid)
|
|
||||||
{
|
|
||||||
GList *tmp_list = contexts;
|
|
||||||
GdkDragContext *context;
|
|
||||||
|
|
||||||
while (tmp_list)
|
|
||||||
{
|
|
||||||
context = (GdkDragContext *)tmp_list->data;
|
|
||||||
|
|
||||||
if ((!context->is_source == !is_source) &&
|
|
||||||
((source_xid == None) || (context->source_window &&
|
|
||||||
(GDK_WINDOW_XWINDOW (context->source_window) == source_xid))) &&
|
|
||||||
((dest_xid == None) || (context->dest_window &&
|
|
||||||
(GDK_WINDOW_XWINDOW (context->dest_window) == dest_xid))))
|
|
||||||
return context;
|
|
||||||
|
|
||||||
tmp_list = tmp_list->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
#ifdef OLE2_DND
|
|
||||||
IDropTarget idt;
|
|
||||||
#endif
|
|
||||||
GdkDragContext *context;
|
|
||||||
} target_drag_context;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
#ifdef OLE2_DND
|
|
||||||
IDropSource ids;
|
|
||||||
#endif
|
|
||||||
GdkDragContext *context;
|
|
||||||
} source_drag_context;
|
|
||||||
|
|
||||||
#ifdef OLE2_DND
|
|
||||||
|
|
||||||
static ULONG STDMETHODCALLTYPE
|
|
||||||
m_add_ref_target (IDropTarget __RPC_FAR *This)
|
|
||||||
{
|
|
||||||
target_drag_context *ctx = (target_drag_context *) This;
|
|
||||||
GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
|
|
||||||
|
|
||||||
GDK_NOTE (DND, g_print ("m_add_ref_target\n"));
|
|
||||||
gdk_drag_context_ref (ctx->context);
|
|
||||||
|
|
||||||
return private->ref_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_query_interface_target (IDropTarget __RPC_FAR *This,
|
|
||||||
REFIID riid,
|
|
||||||
void __RPC_FAR *__RPC_FAR *ppvObject)
|
|
||||||
{
|
|
||||||
GDK_NOTE (DND, g_print ("m_query_interface_target\n"));
|
|
||||||
|
|
||||||
*ppvObject = NULL;
|
|
||||||
|
|
||||||
PRINT_GUID (riid);
|
|
||||||
|
|
||||||
if (IsEqualGUID (riid, &IID_IUnknown))
|
|
||||||
{
|
|
||||||
g_print ("...IUnknown\n");
|
|
||||||
m_add_ref_target (This);
|
|
||||||
*ppvObject = This;
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
else if (IsEqualGUID (riid, &IID_IDropTarget))
|
|
||||||
{
|
|
||||||
g_print ("...IDropTarget\n");
|
|
||||||
m_add_ref_target (This);
|
|
||||||
*ppvObject = This;
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_print ("...Huh?\n");
|
|
||||||
return E_NOINTERFACE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static ULONG STDMETHODCALLTYPE
|
|
||||||
m_release_target (IDropTarget __RPC_FAR *This)
|
|
||||||
{
|
|
||||||
target_drag_context *ctx = (target_drag_context *) This;
|
|
||||||
GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
|
|
||||||
|
|
||||||
GDK_NOTE (DND, g_print ("m_release_target\n"));
|
|
||||||
gdk_drag_context_unref (ctx->context);
|
|
||||||
|
|
||||||
if (private->ref_count == 1)
|
|
||||||
{
|
|
||||||
gdk_drag_context_unref (ctx->context);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return private->ref_count - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_drag_enter (IDropTarget __RPC_FAR *This,
|
|
||||||
IDataObject __RPC_FAR *pDataObj,
|
|
||||||
DWORD grfKeyState,
|
|
||||||
POINTL pt,
|
|
||||||
DWORD __RPC_FAR *pdwEffect)
|
|
||||||
{
|
|
||||||
GDK_NOTE (DND, g_print ("m_drag_enter\n"));
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_drag_over (IDropTarget __RPC_FAR *This,
|
|
||||||
DWORD grfKeyState,
|
|
||||||
POINTL pt,
|
|
||||||
DWORD __RPC_FAR *pdwEffect)
|
|
||||||
{
|
|
||||||
GDK_NOTE (DND, g_print ("m_drag_over\n"));
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_drag_leave (IDropTarget __RPC_FAR *This)
|
|
||||||
{
|
|
||||||
GDK_NOTE (DND, g_print ("m_drag_leave\n"));
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_drop (IDropTarget __RPC_FAR *This,
|
|
||||||
IDataObject __RPC_FAR *pDataObj,
|
|
||||||
DWORD grfKeyState,
|
|
||||||
POINTL pt,
|
|
||||||
DWORD __RPC_FAR *pdwEffect)
|
|
||||||
{
|
|
||||||
GDK_NOTE (DND, g_print ("m_drop\n"));
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ULONG STDMETHODCALLTYPE
|
|
||||||
m_add_ref_source (IDropSource __RPC_FAR *This)
|
|
||||||
{
|
|
||||||
source_drag_context *ctx = (source_drag_context *) This;
|
|
||||||
GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
|
|
||||||
|
|
||||||
GDK_NOTE (DND, g_print ("m_add_ref_source\n"));
|
|
||||||
gdk_drag_context_ref (ctx->context);
|
|
||||||
|
|
||||||
return private->ref_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_query_interface_source (IDropSource __RPC_FAR *This,
|
|
||||||
REFIID riid,
|
|
||||||
void __RPC_FAR *__RPC_FAR *ppvObject)
|
|
||||||
{
|
|
||||||
GDK_NOTE (DND, g_print ("m_query_interface_source\n"));
|
|
||||||
|
|
||||||
*ppvObject = NULL;
|
|
||||||
|
|
||||||
PRINT_GUID (riid);
|
|
||||||
if (IsEqualGUID (riid, &IID_IUnknown))
|
|
||||||
{
|
|
||||||
g_print ("...IUnknown\n");
|
|
||||||
m_add_ref_source (This);
|
|
||||||
*ppvObject = This;
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
else if (IsEqualGUID (riid, &IID_IDropSource))
|
|
||||||
{
|
|
||||||
g_print ("...IDropSource\n");
|
|
||||||
m_add_ref_source (This);
|
|
||||||
*ppvObject = This;
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_print ("...Huh?\n");
|
|
||||||
return E_NOINTERFACE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static ULONG STDMETHODCALLTYPE
|
|
||||||
m_release_source (IDropSource __RPC_FAR *This)
|
|
||||||
{
|
|
||||||
source_drag_context *ctx = (source_drag_context *) This;
|
|
||||||
GdkDragContextPrivate *private = (GdkDragContextPrivate *) ctx->context;
|
|
||||||
|
|
||||||
GDK_NOTE (DND, g_print ("m_release_source\n"));
|
|
||||||
gdk_drag_context_unref (ctx->context);
|
|
||||||
|
|
||||||
if (private->ref_count == 1)
|
|
||||||
{
|
|
||||||
gdk_drag_context_unref (ctx->context);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return private->ref_count - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_query_continue_drag (IDropSource __RPC_FAR *This,
|
|
||||||
BOOL fEscapePressed,
|
|
||||||
DWORD grfKeyState)
|
|
||||||
{
|
|
||||||
GDK_NOTE (DND, g_print ("m_query_continue_drag\n"));
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_give_feedback (IDropSource __RPC_FAR *This,
|
|
||||||
DWORD dwEffect)
|
|
||||||
{
|
|
||||||
GDK_NOTE (DND, g_print ("m_give_feedback\n"));
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_query_interface_object (IDataObject __RPC_FAR *This,
|
|
||||||
REFIID riid,
|
|
||||||
void __RPC_FAR *__RPC_FAR *ppvObject)
|
|
||||||
{
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ULONG STDMETHODCALLTYPE
|
|
||||||
m_add_ref_object (IDataObject __RPC_FAR *This)
|
|
||||||
{
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ULONG STDMETHODCALLTYPE
|
|
||||||
m_release_object (IDataObject __RPC_FAR *This)
|
|
||||||
{
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_get_data (IDataObject __RPC_FAR *This,
|
|
||||||
FORMATETC *pFormatEtc,
|
|
||||||
STGMEDIUM *pMedium)
|
|
||||||
{
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_get_data_here (IDataObject __RPC_FAR *This,
|
|
||||||
FORMATETC *pFormatEtc,
|
|
||||||
STGMEDIUM *pMedium)
|
|
||||||
{
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_query_get_data (IDataObject __RPC_FAR *This,
|
|
||||||
FORMATETC *pFormatEtc)
|
|
||||||
{
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_get_canonical_format_etc (IDataObject __RPC_FAR *This,
|
|
||||||
FORMATETC *pFormatEtcIn,
|
|
||||||
FORMATETC *pFormatEtcOut)
|
|
||||||
{
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_set_data (IDataObject __RPC_FAR *This,
|
|
||||||
FORMATETC *pFormatEtc,
|
|
||||||
STGMEDIUM *pMedium,
|
|
||||||
BOOL fRelease)
|
|
||||||
{
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_enum_format_etc (IDataObject __RPC_FAR *This,
|
|
||||||
DWORD dwDirection,
|
|
||||||
IEnumFORMATETC **ppEnumFormatEtc)
|
|
||||||
{
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_d_advise (IDataObject __RPC_FAR *This,
|
|
||||||
FORMATETC *pFormatetc,
|
|
||||||
DWORD advf,
|
|
||||||
IAdviseSink *pAdvSink,
|
|
||||||
DWORD *pdwConnection)
|
|
||||||
{
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_d_unadvise (IDataObject __RPC_FAR *This,
|
|
||||||
DWORD dwConnection)
|
|
||||||
{
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE
|
|
||||||
m_enum_d_advise (IDataObject __RPC_FAR *This,
|
|
||||||
IEnumSTATDATA **ppenumAdvise)
|
|
||||||
{
|
|
||||||
return E_UNEXPECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static IDropTargetVtbl idt_vtbl = {
|
|
||||||
m_query_interface_target,
|
|
||||||
m_add_ref_target,
|
|
||||||
m_release_target,
|
|
||||||
m_drag_enter,
|
|
||||||
m_drag_over,
|
|
||||||
m_drag_leave,
|
|
||||||
m_drop
|
|
||||||
};
|
|
||||||
|
|
||||||
static IDropSourceVtbl ids_vtbl = {
|
|
||||||
m_query_interface_source,
|
|
||||||
m_add_ref_source,
|
|
||||||
m_release_source,
|
|
||||||
m_query_continue_drag,
|
|
||||||
m_give_feedback
|
|
||||||
};
|
|
||||||
|
|
||||||
static IDataObjectVtbl ido_vtbl = {
|
|
||||||
m_query_interface_object,
|
|
||||||
m_add_ref_object,
|
|
||||||
m_release_object,
|
|
||||||
m_get_data,
|
|
||||||
m_get_data_here,
|
|
||||||
m_query_get_data,
|
|
||||||
m_get_canonical_format_etc,
|
|
||||||
m_set_data,
|
|
||||||
m_enum_format_etc,
|
|
||||||
m_d_advise,
|
|
||||||
m_d_unadvise,
|
|
||||||
m_enum_d_advise
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* OLE2_DND */
|
|
||||||
|
|
||||||
static target_drag_context *
|
|
||||||
target_context_new (void)
|
|
||||||
{
|
|
||||||
target_drag_context *result;
|
|
||||||
|
|
||||||
result = g_new0 (target_drag_context, 1);
|
|
||||||
|
|
||||||
#ifdef OLE2_DND
|
|
||||||
result->idt.lpVtbl = &idt_vtbl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
result->context = gdk_drag_context_new ();
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static source_drag_context *
|
|
||||||
source_context_new (void)
|
|
||||||
{
|
|
||||||
source_drag_context *result;
|
|
||||||
|
|
||||||
result = g_new0 (source_drag_context, 1);
|
|
||||||
|
|
||||||
#ifdef OLE2_DND
|
|
||||||
result->ids.lpVtbl = &ids_vtbl;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
result->context = gdk_drag_context_new ();
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
|
|
||||||
/* From MS Knowledge Base article Q130698 */
|
|
||||||
|
|
||||||
/* resolve_link() fills the filename and path buffer
|
|
||||||
* with relevant information
|
|
||||||
* hWnd - calling app's window handle.
|
|
||||||
*
|
|
||||||
* lpszLinkName - name of the link file passed into the function.
|
|
||||||
*
|
|
||||||
* lpszPath - the buffer that will receive the file pathname.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static HRESULT
|
|
||||||
resolve_link(HWND hWnd,
|
|
||||||
LPCTSTR lpszLinkName,
|
|
||||||
LPSTR lpszPath,
|
|
||||||
LPSTR lpszDescription)
|
|
||||||
{
|
|
||||||
HRESULT hres;
|
|
||||||
IShellLink *psl;
|
|
||||||
WIN32_FIND_DATA wfd;
|
|
||||||
|
|
||||||
/* Assume Failure to start with: */
|
|
||||||
*lpszPath = 0;
|
|
||||||
if (lpszDescription)
|
|
||||||
*lpszDescription = 0;
|
|
||||||
|
|
||||||
/* Call CoCreateInstance to obtain the IShellLink interface
|
|
||||||
* pointer. This call fails if CoInitialize is not called, so it is
|
|
||||||
* assumed that CoInitialize has been called.
|
|
||||||
*/
|
|
||||||
|
|
||||||
hres = CoCreateInstance (&CLSID_ShellLink,
|
|
||||||
NULL,
|
|
||||||
CLSCTX_INPROC_SERVER,
|
|
||||||
&IID_IShellLink,
|
|
||||||
(LPVOID *)&psl);
|
|
||||||
if (SUCCEEDED (hres))
|
|
||||||
{
|
|
||||||
IPersistFile *ppf;
|
|
||||||
|
|
||||||
/* The IShellLink interface supports the IPersistFile
|
|
||||||
* interface. Get an interface pointer to it.
|
|
||||||
*/
|
|
||||||
hres = psl->lpVtbl->QueryInterface (psl,
|
|
||||||
&IID_IPersistFile,
|
|
||||||
(LPVOID *) &ppf);
|
|
||||||
if (SUCCEEDED (hres))
|
|
||||||
{
|
|
||||||
WORD wsz[MAX_PATH];
|
|
||||||
|
|
||||||
/* Convert the given link name string to wide character string. */
|
|
||||||
MultiByteToWideChar (CP_ACP, 0,
|
|
||||||
lpszLinkName,
|
|
||||||
-1, wsz, MAX_PATH);
|
|
||||||
/* Load the file. */
|
|
||||||
hres = ppf->lpVtbl->Load (ppf, wsz, STGM_READ);
|
|
||||||
if (SUCCEEDED (hres))
|
|
||||||
{
|
|
||||||
/* Resolve the link by calling the Resolve()
|
|
||||||
* interface function.
|
|
||||||
*/
|
|
||||||
hres = psl->lpVtbl->Resolve(psl, hWnd,
|
|
||||||
SLR_ANY_MATCH |
|
|
||||||
SLR_NO_UI);
|
|
||||||
if (SUCCEEDED (hres))
|
|
||||||
{
|
|
||||||
hres = psl->lpVtbl->GetPath (psl, lpszPath,
|
|
||||||
MAX_PATH,
|
|
||||||
(WIN32_FIND_DATA*)&wfd,
|
|
||||||
0);
|
|
||||||
|
|
||||||
if (SUCCEEDED (hres) && lpszDescription != NULL)
|
|
||||||
{
|
|
||||||
hres = psl->lpVtbl->GetDescription (psl,
|
|
||||||
lpszDescription,
|
|
||||||
MAX_PATH );
|
|
||||||
|
|
||||||
if (!SUCCEEDED (hres))
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ppf->lpVtbl->Release (ppf);
|
|
||||||
}
|
|
||||||
psl->lpVtbl->Release (psl);
|
|
||||||
}
|
|
||||||
return SUCCEEDED (hres);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define resolve_link(hWnd, lpszLinkName, lpszPath, lpszDescription) FALSE
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static GdkFilterReturn
|
|
||||||
gdk_dropfiles_filter (GdkXEvent *xev,
|
|
||||||
GdkEvent *event,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
GdkDragContext *context;
|
|
||||||
GdkDragContextPrivate *private;
|
|
||||||
static GdkAtom text_uri_list_atom = GDK_NONE;
|
|
||||||
GString *result;
|
|
||||||
MSG *msg = (MSG *) xev;
|
|
||||||
HANDLE hdrop;
|
|
||||||
POINT pt;
|
|
||||||
gint nfiles, i, k;
|
|
||||||
guchar fileName[MAX_PATH], linkedFile[MAX_PATH];
|
|
||||||
|
|
||||||
if (text_uri_list_atom == GDK_NONE)
|
|
||||||
text_uri_list_atom = gdk_atom_intern ("text/uri-list", FALSE);
|
|
||||||
|
|
||||||
if (msg->message == WM_DROPFILES)
|
|
||||||
{
|
|
||||||
GDK_NOTE (DND, g_print ("WM_DROPFILES: %#x\n", msg->hwnd));
|
|
||||||
|
|
||||||
context = gdk_drag_context_new ();
|
|
||||||
private = (GdkDragContextPrivate *) context;
|
|
||||||
context->protocol = GDK_DRAG_PROTO_WIN32_DROPFILES;
|
|
||||||
context->is_source = FALSE;
|
|
||||||
context->source_window = (GdkWindow *) gdk_root_parent;
|
|
||||||
context->dest_window = event->any.window;
|
|
||||||
gdk_window_ref (context->dest_window);
|
|
||||||
/* WM_DROPFILES drops are always file names */
|
|
||||||
context->targets =
|
|
||||||
g_list_append (NULL, GUINT_TO_POINTER (text_uri_list_atom));
|
|
||||||
current_dest_drag = context;
|
|
||||||
|
|
||||||
event->dnd.type = GDK_DROP_START;
|
|
||||||
event->dnd.context = current_dest_drag;
|
|
||||||
gdk_drag_context_ref (current_dest_drag);
|
|
||||||
|
|
||||||
hdrop = (HANDLE) msg->wParam;
|
|
||||||
DragQueryPoint (hdrop, &pt);
|
|
||||||
ClientToScreen (msg->hwnd, &pt);
|
|
||||||
|
|
||||||
event->dnd.x_root = pt.x;
|
|
||||||
event->dnd.y_root = pt.y;
|
|
||||||
event->dnd.time = msg->time;
|
|
||||||
|
|
||||||
nfiles = DragQueryFile (hdrop, 0xFFFFFFFF, NULL, 0);
|
|
||||||
|
|
||||||
result = g_string_new (NULL);
|
|
||||||
for (i = 0; i < nfiles; i++)
|
|
||||||
{
|
|
||||||
g_string_append (result, "file:");
|
|
||||||
DragQueryFile (hdrop, i, fileName, MAX_PATH);
|
|
||||||
|
|
||||||
/* Resolve shortcuts */
|
|
||||||
if (resolve_link (msg->hwnd, fileName, linkedFile, NULL))
|
|
||||||
{
|
|
||||||
g_string_append (result, linkedFile);
|
|
||||||
GDK_NOTE (DND, g_print ("...%s link to %s\n",
|
|
||||||
fileName, linkedFile));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_string_append (result, fileName);
|
|
||||||
GDK_NOTE (DND, g_print ("...%s\n", fileName));
|
|
||||||
}
|
|
||||||
g_string_append (result, "\015\012");
|
|
||||||
}
|
|
||||||
gdk_sel_prop_store ((GdkWindow *) gdk_root_parent,
|
|
||||||
text_uri_list_atom, 8, result->str, result->len + 1);
|
|
||||||
|
|
||||||
DragFinish (hdrop);
|
|
||||||
|
|
||||||
return GDK_FILTER_TRANSLATE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return GDK_FILTER_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************
|
|
||||||
************************** Public API ***********************
|
|
||||||
*************************************************************/
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_dnd_init (void)
|
|
||||||
{
|
|
||||||
HRESULT hres;
|
|
||||||
#ifdef OLE2_DND
|
|
||||||
hres = OleInitialize (NULL);
|
|
||||||
|
|
||||||
if (! SUCCEEDED (hres))
|
|
||||||
g_error ("OleInitialize failed");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_dnd_exit (void)
|
|
||||||
{
|
|
||||||
#ifdef OLE2_DND
|
|
||||||
OleUninitialize ();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Source side */
|
|
||||||
|
|
||||||
static void
|
|
||||||
gdk_drag_do_leave (GdkDragContext *context, guint32 time)
|
|
||||||
{
|
|
||||||
if (context->dest_window)
|
|
||||||
{
|
|
||||||
GDK_NOTE (DND, g_print ("gdk_drag_do_leave\n"));
|
|
||||||
gdk_window_unref (context->dest_window);
|
|
||||||
context->dest_window = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkDragContext *
|
|
||||||
gdk_drag_begin (GdkWindow *window,
|
|
||||||
GList *targets)
|
|
||||||
{
|
|
||||||
GList *tmp_list;
|
|
||||||
source_drag_context *ctx;
|
|
||||||
|
|
||||||
g_return_val_if_fail (window != NULL, NULL);
|
|
||||||
|
|
||||||
GDK_NOTE (DND, g_print ("gdk_drag_begin\n"));
|
|
||||||
|
|
||||||
ctx = source_context_new ();
|
|
||||||
ctx->context->is_source = TRUE;
|
|
||||||
ctx->context->source_window = window;
|
|
||||||
gdk_window_ref (window);
|
|
||||||
|
|
||||||
tmp_list = g_list_last (targets);
|
|
||||||
ctx->context->targets = NULL;
|
|
||||||
while (tmp_list)
|
|
||||||
{
|
|
||||||
ctx->context->targets = g_list_prepend (ctx->context->targets,
|
|
||||||
tmp_list->data);
|
|
||||||
tmp_list = tmp_list->prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->context->actions = 0;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
DoDragDrop (...);
|
|
||||||
#endif
|
|
||||||
return ctx->context;
|
|
||||||
}
|
|
||||||
|
|
||||||
guint32
|
|
||||||
gdk_drag_get_protocol (guint32 xid,
|
|
||||||
GdkDragProtocol *protocol)
|
|
||||||
{
|
|
||||||
/* This isn't used */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_drag_find_window (GdkDragContext *context,
|
|
||||||
GdkWindow *drag_window,
|
|
||||||
gint x_root,
|
|
||||||
gint y_root,
|
|
||||||
GdkWindow **dest_window,
|
|
||||||
GdkDragProtocol *protocol)
|
|
||||||
{
|
|
||||||
GdkDragContextPrivate *private = (GdkDragContextPrivate *)context;
|
|
||||||
GdkDrawablePrivate *drag_window_private = (GdkDrawablePrivate*) drag_window;
|
|
||||||
HWND recipient;
|
|
||||||
POINT pt;
|
|
||||||
|
|
||||||
GDK_NOTE (DND, g_print ("gdk_drag_find_window: %#x +%d+%d\n",
|
|
||||||
(drag_window ? drag_window_private->xwindow : 0),
|
|
||||||
x_root, y_root));
|
|
||||||
|
|
||||||
pt.x = x_root;
|
|
||||||
pt.y = y_root;
|
|
||||||
recipient = WindowFromPoint (pt);
|
|
||||||
if (recipient == NULL)
|
|
||||||
*dest_window = NULL;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*dest_window = gdk_window_lookup (recipient);
|
|
||||||
if (*dest_window)
|
|
||||||
gdk_window_ref (*dest_window);
|
|
||||||
*protocol = GDK_DRAG_PROTO_WIN32_DROPFILES;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
gdk_drag_motion (GdkDragContext *context,
|
|
||||||
GdkWindow *dest_window,
|
|
||||||
GdkDragProtocol protocol,
|
|
||||||
gint x_root,
|
|
||||||
gint y_root,
|
|
||||||
GdkDragAction suggested_action,
|
|
||||||
GdkDragAction possible_actions,
|
|
||||||
guint32 time)
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_drag_drop (GdkDragContext *context,
|
|
||||||
guint32 time)
|
|
||||||
{
|
|
||||||
g_return_if_fail (context != NULL);
|
|
||||||
|
|
||||||
g_warning ("gdk_drag_drop: not implemented\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_drag_abort (GdkDragContext *context,
|
|
||||||
guint32 time)
|
|
||||||
{
|
|
||||||
g_return_if_fail (context != NULL);
|
|
||||||
|
|
||||||
gdk_drag_do_leave (context, time);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Destination side */
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_drag_status (GdkDragContext *context,
|
|
||||||
GdkDragAction action,
|
|
||||||
guint32 time)
|
|
||||||
{
|
|
||||||
GDK_NOTE (DND, g_print ("gdk_drag_status\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_drop_reply (GdkDragContext *context,
|
|
||||||
gboolean ok,
|
|
||||||
guint32 time)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_drop_finish (GdkDragContext *context,
|
|
||||||
gboolean success,
|
|
||||||
guint32 time)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static GdkFilterReturn
|
|
||||||
gdk_destroy_filter (GdkXEvent *xev,
|
|
||||||
GdkEvent *event,
|
|
||||||
gpointer data)
|
|
||||||
{
|
|
||||||
#ifdef OLE2_DND
|
|
||||||
MSG *msg = (MSG *) xev;
|
|
||||||
|
|
||||||
if (msg->message == WM_DESTROY)
|
|
||||||
{
|
|
||||||
IDropTarget *idtp = (IDropTarget *) data;
|
|
||||||
|
|
||||||
GDK_NOTE (DND, g_print ("gdk_destroy_filter: WM_DESTROY: %#x\n", msg->hwnd));
|
|
||||||
RevokeDragDrop (msg->hwnd);
|
|
||||||
CoLockObjectExternal (idtp, FALSE, TRUE);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return GDK_FILTER_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_window_register_dnd (GdkWindow *window)
|
|
||||||
{
|
|
||||||
GdkDrawablePrivate *private = (GdkDrawablePrivate *) window;
|
|
||||||
#ifdef OLE2_DND
|
|
||||||
target_drag_context *context;
|
|
||||||
HRESULT hres;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
g_return_if_fail (window != NULL);
|
|
||||||
|
|
||||||
GDK_NOTE (DND, g_print ("gdk_window_register_dnd: %#x\n", private->xwindow));
|
|
||||||
|
|
||||||
/* We always claim to accept dropped files, but in fact we might not,
|
|
||||||
* of course. This function is called in such a way that it cannot know
|
|
||||||
* whether the window (widget) in question actually accepts files
|
|
||||||
* (in gtk, data of type text/uri-list) or not.
|
|
||||||
*/
|
|
||||||
gdk_window_add_filter (window, gdk_dropfiles_filter, NULL);
|
|
||||||
DragAcceptFiles (private->xwindow, TRUE);
|
|
||||||
|
|
||||||
#ifdef OLE2_DND
|
|
||||||
/* Register for OLE2 d&d */
|
|
||||||
context = target_context_new ();
|
|
||||||
hres = CoLockObjectExternal ((IUnknown *) &context->idt, TRUE, FALSE);
|
|
||||||
if (!SUCCEEDED (hres))
|
|
||||||
g_warning ("gdk_window_register_dnd: CoLockObjectExternal failed");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
hres = RegisterDragDrop (private->xwindow, &context->idt);
|
|
||||||
if (hres == DRAGDROP_E_ALREADYREGISTERED)
|
|
||||||
{
|
|
||||||
g_print ("DRAGDROP_E_ALREADYREGISTERED\n");
|
|
||||||
CoLockObjectExternal ((IUnknown *) &context->idt, FALSE, FALSE);
|
|
||||||
}
|
|
||||||
else if (!SUCCEEDED (hres))
|
|
||||||
g_warning ("gdk_window_register_dnd: RegisterDragDrop failed");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gdk_window_add_filter (window, gdk_destroy_filter, &context->idt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************
|
|
||||||
* gdk_drag_get_selection:
|
|
||||||
* Returns the selection atom for the current source window
|
|
||||||
* arguments:
|
|
||||||
*
|
|
||||||
* results:
|
|
||||||
*************************************************************/
|
|
||||||
|
|
||||||
GdkAtom
|
|
||||||
gdk_drag_get_selection (GdkDragContext *context)
|
|
||||||
{
|
|
||||||
if (context->protocol == GDK_DRAG_PROTO_WIN32_DROPFILES)
|
|
||||||
return gdk_win32_dropfiles_atom;
|
|
||||||
else if (context->protocol == GDK_DRAG_PROTO_OLE2)
|
|
||||||
return gdk_ole2_dnd_atom;
|
|
||||||
else
|
|
||||||
return GDK_NONE;
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
1501
gdk/win32/gdkfont.c
1501
gdk/win32/gdkfont.c
File diff suppressed because it is too large
Load Diff
1392
gdk/win32/gdkgc.c
1392
gdk/win32/gdkgc.c
File diff suppressed because it is too large
Load Diff
@ -1,51 +0,0 @@
|
|||||||
/* 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 "gdktypes.h"
|
|
||||||
#include "gdkprivate.h"
|
|
||||||
|
|
||||||
guint gdk_debug_flags = 0;
|
|
||||||
HWND gdk_root_window = NULL;
|
|
||||||
HWND gdk_leader_window;
|
|
||||||
GDKVAR GdkWindowPrivate *gdk_root_parent = NULL;
|
|
||||||
HDC gdk_DC;
|
|
||||||
HINSTANCE gdk_DLLInstance;
|
|
||||||
HINSTANCE gdk_ProgInstance;
|
|
||||||
UINT gdk_selection_notify_msg;
|
|
||||||
UINT gdk_selection_request_msg;
|
|
||||||
UINT gdk_selection_clear_msg;
|
|
||||||
GdkAtom gdk_clipboard_atom;
|
|
||||||
GdkAtom gdk_win32_dropfiles_atom;
|
|
||||||
GdkAtom gdk_ole2_dnd_atom;
|
|
||||||
Atom gdk_selection_property;
|
|
||||||
gchar *gdk_progclass = NULL;
|
|
||||||
gint gdk_error_code;
|
|
||||||
gint gdk_error_warnings = TRUE;
|
|
||||||
gint gdk_null_window_warnings = TRUE;
|
|
||||||
|
|
||||||
GMutex *gdk_threads_mutex = NULL;
|
|
||||||
|
|
||||||
DWORD windows_version = 0;
|
|
@ -1,394 +0,0 @@
|
|||||||
/* 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/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "gdkim.h"
|
|
||||||
#include "gdkpixmap.h"
|
|
||||||
#include "gdkprivate.h"
|
|
||||||
#include "gdki18n.h"
|
|
||||||
#include "gdkx.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
*--------------------------------------------------------------
|
|
||||||
* gdk_set_locale
|
|
||||||
*
|
|
||||||
* Arguments:
|
|
||||||
*
|
|
||||||
* Results:
|
|
||||||
*
|
|
||||||
* Side effects:
|
|
||||||
*
|
|
||||||
*--------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
gchar*
|
|
||||||
gdk_set_locale (void)
|
|
||||||
{
|
|
||||||
gchar *current_locale;
|
|
||||||
|
|
||||||
if (!setlocale (LC_ALL,""))
|
|
||||||
g_warning ("locale not supported by C library");
|
|
||||||
|
|
||||||
current_locale = setlocale (LC_ALL, NULL);
|
|
||||||
|
|
||||||
return current_locale;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_im_begin (GdkIC *ic, GdkWindow* window)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_im_end (void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkIMStyle
|
|
||||||
gdk_im_decide_style (GdkIMStyle supported_style)
|
|
||||||
{
|
|
||||||
return GDK_IM_PREEDIT_NONE | GDK_IM_STATUS_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkIMStyle
|
|
||||||
gdk_im_set_best_style (GdkIMStyle style)
|
|
||||||
{
|
|
||||||
return GDK_IM_PREEDIT_NONE | GDK_IM_STATUS_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gint
|
|
||||||
gdk_im_ready (void)
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkIC *
|
|
||||||
gdk_ic_new (GdkICAttr *attr, GdkICAttributesType mask)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_ic_destroy (GdkIC *ic)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkIMStyle
|
|
||||||
gdk_ic_get_style (GdkIC *ic)
|
|
||||||
{
|
|
||||||
return GDK_IM_PREEDIT_NONE | GDK_IM_STATUS_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_ic_set_values (GdkIC *ic, ...)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_ic_get_values (GdkIC *ic, ...)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkICAttributesType
|
|
||||||
gdk_ic_set_attr (GdkIC *ic, GdkICAttr *attr, GdkICAttributesType mask)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkICAttributesType
|
|
||||||
gdk_ic_get_attr (GdkIC *ic, GdkICAttr *attr, GdkICAttributesType mask)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkEventMask
|
|
||||||
gdk_ic_get_events (GdkIC *ic)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* gdk_wcstombs
|
|
||||||
*
|
|
||||||
* Returns a multi-byte string converted from the specified array
|
|
||||||
* of wide characters. The string is newly allocated. The array of
|
|
||||||
* wide characters must be null-terminated. If the conversion is
|
|
||||||
* failed, it returns NULL.
|
|
||||||
*
|
|
||||||
* On Win32, we always use UTF-8.
|
|
||||||
*/
|
|
||||||
gchar *
|
|
||||||
gdk_wcstombs (const GdkWChar *src)
|
|
||||||
{
|
|
||||||
gint len;
|
|
||||||
const GdkWChar *wcp;
|
|
||||||
guchar *mbstr, *bp;
|
|
||||||
|
|
||||||
wcp = src;
|
|
||||||
len = 0;
|
|
||||||
while (*wcp)
|
|
||||||
{
|
|
||||||
const GdkWChar c = *wcp++;
|
|
||||||
|
|
||||||
if (c < 0x80)
|
|
||||||
len += 1;
|
|
||||||
else if (c < 0x800)
|
|
||||||
len += 2;
|
|
||||||
else if (c < 0x10000)
|
|
||||||
len += 3;
|
|
||||||
else if (c < 0x200000)
|
|
||||||
len += 4;
|
|
||||||
else if (c < 0x4000000)
|
|
||||||
len += 5;
|
|
||||||
else
|
|
||||||
len += 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
mbstr = g_malloc (len + 1);
|
|
||||||
|
|
||||||
wcp = src;
|
|
||||||
bp = mbstr;
|
|
||||||
while (*wcp)
|
|
||||||
{
|
|
||||||
int first;
|
|
||||||
int i;
|
|
||||||
GdkWChar c = *wcp++;
|
|
||||||
|
|
||||||
if (c < 0x80)
|
|
||||||
{
|
|
||||||
first = 0;
|
|
||||||
len = 1;
|
|
||||||
}
|
|
||||||
else if (c < 0x800)
|
|
||||||
{
|
|
||||||
first = 0xc0;
|
|
||||||
len = 2;
|
|
||||||
}
|
|
||||||
else if (c < 0x10000)
|
|
||||||
{
|
|
||||||
first = 0xe0;
|
|
||||||
len = 3;
|
|
||||||
}
|
|
||||||
else if (c < 0x200000)
|
|
||||||
{
|
|
||||||
first = 0xf0;
|
|
||||||
len = 4;
|
|
||||||
}
|
|
||||||
else if (c < 0x4000000)
|
|
||||||
{
|
|
||||||
first = 0xf8;
|
|
||||||
len = 5;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
first = 0xfc;
|
|
||||||
len = 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Woo-hoo! */
|
|
||||||
switch (len)
|
|
||||||
{
|
|
||||||
case 6: bp[5] = (c & 0x3f) | 0x80; c >>= 6; /* Fall through */
|
|
||||||
case 5: bp[4] = (c & 0x3f) | 0x80; c >>= 6; /* Fall through */
|
|
||||||
case 4: bp[3] = (c & 0x3f) | 0x80; c >>= 6; /* Fall through */
|
|
||||||
case 3: bp[2] = (c & 0x3f) | 0x80; c >>= 6; /* Fall through */
|
|
||||||
case 2: bp[1] = (c & 0x3f) | 0x80; c >>= 6; /* Fall through */
|
|
||||||
case 1: bp[0] = c | first;
|
|
||||||
}
|
|
||||||
|
|
||||||
bp += len;
|
|
||||||
}
|
|
||||||
*bp = 0;
|
|
||||||
return mbstr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* gdk_mbstowcs
|
|
||||||
*
|
|
||||||
* Converts the specified string into GDK wide characters, and,
|
|
||||||
* returns the number of wide characters written. The string 'src'
|
|
||||||
* must be null-terminated. If the conversion is failed, it returns
|
|
||||||
* -1.
|
|
||||||
*
|
|
||||||
* On Win32, thr string is assumed to be in UTF-8. Also note that
|
|
||||||
* GdkWChar is 32 bits, while wchar_t, and the wide characters the
|
|
||||||
* Windows API uses, are 16 bits!
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* First a helper function for not zero-terminated strings */
|
|
||||||
gint
|
|
||||||
gdk_nmbstowcs (GdkWChar *dest,
|
|
||||||
const gchar *src,
|
|
||||||
gint src_len,
|
|
||||||
gint dest_max)
|
|
||||||
{
|
|
||||||
guchar *cp, *end;
|
|
||||||
gint n;
|
|
||||||
|
|
||||||
cp = (guchar *) src;
|
|
||||||
end = cp + src_len;
|
|
||||||
n = 0;
|
|
||||||
while (cp != end && dest != dest + dest_max)
|
|
||||||
{
|
|
||||||
gint i, mask = 0, len;
|
|
||||||
guchar c = *cp;
|
|
||||||
|
|
||||||
if (c < 0x80)
|
|
||||||
{
|
|
||||||
len = 1;
|
|
||||||
mask = 0x7f;
|
|
||||||
}
|
|
||||||
else if ((c & 0xe0) == 0xc0)
|
|
||||||
{
|
|
||||||
len = 2;
|
|
||||||
mask = 0x1f;
|
|
||||||
}
|
|
||||||
else if ((c & 0xf0) == 0xe0)
|
|
||||||
{
|
|
||||||
len = 3;
|
|
||||||
mask = 0x0f;
|
|
||||||
}
|
|
||||||
else if ((c & 0xf8) == 0xf0)
|
|
||||||
{
|
|
||||||
len = 4;
|
|
||||||
mask = 0x07;
|
|
||||||
}
|
|
||||||
else if ((c & 0xfc) == 0xf8)
|
|
||||||
{
|
|
||||||
len = 5;
|
|
||||||
mask = 0x03;
|
|
||||||
}
|
|
||||||
else if ((c & 0xfc) == 0xfc)
|
|
||||||
{
|
|
||||||
len = 6;
|
|
||||||
mask = 0x01;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (cp + len > end)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
*dest = (cp[0] & mask);
|
|
||||||
for (i = 1; i < len; i++)
|
|
||||||
{
|
|
||||||
if ((cp[i] & 0xc0) != 0x80)
|
|
||||||
return -1;
|
|
||||||
*dest <<= 6;
|
|
||||||
*dest |= (cp[i] & 0x3f);
|
|
||||||
}
|
|
||||||
if (*dest == -1)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
cp += len;
|
|
||||||
dest++;
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
if (cp != end)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
gint
|
|
||||||
gdk_mbstowcs (GdkWChar *dest,
|
|
||||||
const gchar *src,
|
|
||||||
gint dest_max)
|
|
||||||
{
|
|
||||||
return gdk_nmbstowcs (dest, src, strlen (src), dest_max);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* A version that converts to wchar_t wide chars */
|
|
||||||
|
|
||||||
gint
|
|
||||||
gdk_nmbstowchar_ts (wchar_t *dest,
|
|
||||||
const gchar *src,
|
|
||||||
gint src_len,
|
|
||||||
gint dest_max)
|
|
||||||
{
|
|
||||||
wchar_t *wcp;
|
|
||||||
guchar *cp, *end;
|
|
||||||
gint n;
|
|
||||||
|
|
||||||
wcp = dest;
|
|
||||||
cp = (guchar *) src;
|
|
||||||
end = cp + src_len;
|
|
||||||
n = 0;
|
|
||||||
while (cp != end && wcp != dest + dest_max)
|
|
||||||
{
|
|
||||||
gint i, mask = 0, len;
|
|
||||||
guchar c = *cp;
|
|
||||||
|
|
||||||
if (c < 0x80)
|
|
||||||
{
|
|
||||||
len = 1;
|
|
||||||
mask = 0x7f;
|
|
||||||
}
|
|
||||||
else if ((c & 0xe0) == 0xc0)
|
|
||||||
{
|
|
||||||
len = 2;
|
|
||||||
mask = 0x1f;
|
|
||||||
}
|
|
||||||
else if ((c & 0xf0) == 0xe0)
|
|
||||||
{
|
|
||||||
len = 3;
|
|
||||||
mask = 0x0f;
|
|
||||||
}
|
|
||||||
else /* Other lengths are not possible with 16-bit wchar_t! */
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (cp + len > end)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
*wcp = (cp[0] & mask);
|
|
||||||
for (i = 1; i < len; i++)
|
|
||||||
{
|
|
||||||
if ((cp[i] & 0xc0) != 0x80)
|
|
||||||
return -1;
|
|
||||||
*wcp <<= 6;
|
|
||||||
*wcp |= (cp[i] & 0x3f);
|
|
||||||
}
|
|
||||||
if (*wcp == 0xFFFF)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
cp += len;
|
|
||||||
wcp++;
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
if (cp != end)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
1685
gdk/win32/gdkinput.c
1685
gdk/win32/gdkinput.c
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,228 +0,0 @@
|
|||||||
/* 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 <string.h>
|
|
||||||
|
|
||||||
#include "gdkproperty.h"
|
|
||||||
#include "gdkselection.h"
|
|
||||||
#include "gdkprivate.h"
|
|
||||||
#include "gdkx.h"
|
|
||||||
|
|
||||||
GdkAtom
|
|
||||||
gdk_atom_intern (const gchar *atom_name,
|
|
||||||
gint only_if_exists)
|
|
||||||
{
|
|
||||||
GdkAtom retval;
|
|
||||||
static GHashTable *atom_hash = NULL;
|
|
||||||
|
|
||||||
if (!atom_hash)
|
|
||||||
atom_hash = g_hash_table_new (g_str_hash, g_str_equal);
|
|
||||||
|
|
||||||
retval = GPOINTER_TO_UINT (g_hash_table_lookup (atom_hash, atom_name));
|
|
||||||
if (!retval)
|
|
||||||
{
|
|
||||||
if (strcmp (atom_name, "PRIMARY") == 0)
|
|
||||||
retval = GDK_SELECTION_PRIMARY;
|
|
||||||
else if (strcmp (atom_name, "SECONDARY") == 0)
|
|
||||||
retval = GDK_SELECTION_SECONDARY;
|
|
||||||
else if (strcmp (atom_name, "ATOM") == 0)
|
|
||||||
retval = GDK_SELECTION_TYPE_ATOM;
|
|
||||||
else if (strcmp (atom_name, "BITMAP") == 0)
|
|
||||||
retval = GDK_SELECTION_TYPE_BITMAP;
|
|
||||||
else if (strcmp (atom_name, "COLORMAP") == 0)
|
|
||||||
retval = GDK_SELECTION_TYPE_COLORMAP;
|
|
||||||
else if (strcmp (atom_name, "DRAWABLE") == 0)
|
|
||||||
retval = GDK_SELECTION_TYPE_DRAWABLE;
|
|
||||||
else if (strcmp (atom_name, "INTEGER") == 0)
|
|
||||||
retval = GDK_SELECTION_TYPE_INTEGER;
|
|
||||||
else if (strcmp (atom_name, "PIXMAP") == 0)
|
|
||||||
retval = GDK_SELECTION_TYPE_PIXMAP;
|
|
||||||
else if (strcmp (atom_name, "WINDOW") == 0)
|
|
||||||
retval = GDK_SELECTION_TYPE_WINDOW;
|
|
||||||
else if (strcmp (atom_name, "STRING") == 0)
|
|
||||||
retval = GDK_SELECTION_TYPE_STRING;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
retval = GlobalFindAtom (atom_name);
|
|
||||||
if (only_if_exists && retval == 0)
|
|
||||||
retval = 0;
|
|
||||||
else
|
|
||||||
retval = GlobalAddAtom (atom_name);
|
|
||||||
}
|
|
||||||
g_hash_table_insert (atom_hash,
|
|
||||||
g_strdup (atom_name),
|
|
||||||
GUINT_TO_POINTER (retval));
|
|
||||||
}
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
gchar *
|
|
||||||
gdk_atom_name (GdkAtom atom)
|
|
||||||
{
|
|
||||||
gchar name[256];
|
|
||||||
|
|
||||||
switch (atom)
|
|
||||||
{
|
|
||||||
case GDK_SELECTION_PRIMARY: return g_strdup ("PRIMARY");
|
|
||||||
case GDK_SELECTION_SECONDARY: return g_strdup ("SECONDARY");
|
|
||||||
case GDK_SELECTION_TYPE_ATOM: return g_strdup ("ATOM");
|
|
||||||
case GDK_SELECTION_TYPE_BITMAP: return g_strdup ("BITMAP");
|
|
||||||
case GDK_SELECTION_TYPE_COLORMAP: return g_strdup ("COLORMAP");
|
|
||||||
case GDK_SELECTION_TYPE_DRAWABLE: return g_strdup ("DRAWABLE");
|
|
||||||
case GDK_SELECTION_TYPE_INTEGER: return g_strdup ("INTEGER");
|
|
||||||
case GDK_SELECTION_TYPE_PIXMAP: return g_strdup ("PIXMAP");
|
|
||||||
case GDK_SELECTION_TYPE_WINDOW: return g_strdup ("WINDOW");
|
|
||||||
case GDK_SELECTION_TYPE_STRING: return g_strdup ("STRING");
|
|
||||||
}
|
|
||||||
if (atom < 0xC000)
|
|
||||||
return g_strdup_printf ("#%x", atom);
|
|
||||||
else if (GlobalGetAtomName (atom, name, sizeof (name)) == 0)
|
|
||||||
return NULL;
|
|
||||||
return g_strdup (name);
|
|
||||||
}
|
|
||||||
|
|
||||||
gint
|
|
||||||
gdk_property_get (GdkWindow *window,
|
|
||||||
GdkAtom property,
|
|
||||||
GdkAtom type,
|
|
||||||
gulong offset,
|
|
||||||
gulong length,
|
|
||||||
gint pdelete,
|
|
||||||
GdkAtom *actual_property_type,
|
|
||||||
gint *actual_format_type,
|
|
||||||
gint *actual_length,
|
|
||||||
guchar **data)
|
|
||||||
{
|
|
||||||
g_warning ("gdk_property_get: Not implemented");
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_property_change (GdkWindow *window,
|
|
||||||
GdkAtom property,
|
|
||||||
GdkAtom type,
|
|
||||||
gint format,
|
|
||||||
GdkPropMode mode,
|
|
||||||
guchar *data,
|
|
||||||
gint nelements)
|
|
||||||
{
|
|
||||||
HGLOBAL hdata;
|
|
||||||
gint i, length;
|
|
||||||
gchar *prop_name, *type_name;
|
|
||||||
guchar *ptr;
|
|
||||||
|
|
||||||
if (GDK_DRAWABLE_DESTROYED (window))
|
|
||||||
return;
|
|
||||||
|
|
||||||
GDK_NOTE (SELECTION,
|
|
||||||
(prop_name = gdk_atom_name (property),
|
|
||||||
type_name = gdk_atom_name (type),
|
|
||||||
g_print ("gdk_property_change: %#x %#x (%s) %#x (%s) %s %d*%d bytes %.10s\n",
|
|
||||||
GDK_DRAWABLE_XID (window), property, prop_name,
|
|
||||||
type, type_name,
|
|
||||||
(mode == GDK_PROP_MODE_REPLACE ? "REPLACE" :
|
|
||||||
(mode == GDK_PROP_MODE_PREPEND ? "PREPEND" :
|
|
||||||
(mode == GDK_PROP_MODE_APPEND ? "APPEND" :
|
|
||||||
"???"))),
|
|
||||||
format, nelements, data),
|
|
||||||
g_free (prop_name),
|
|
||||||
g_free (type_name)));
|
|
||||||
|
|
||||||
if (property == gdk_selection_property
|
|
||||||
&& type == GDK_TARGET_STRING
|
|
||||||
&& format == 8
|
|
||||||
&& mode == GDK_PROP_MODE_REPLACE)
|
|
||||||
{
|
|
||||||
length = nelements;
|
|
||||||
ptr = data;
|
|
||||||
for (i = 0; i < nelements; i++)
|
|
||||||
if (*ptr++ == '\n')
|
|
||||||
length++;
|
|
||||||
#if 1
|
|
||||||
GDK_NOTE (SELECTION, g_print ("...OpenClipboard(%#x)\n",
|
|
||||||
GDK_DRAWABLE_XID (window)));
|
|
||||||
if (!OpenClipboard (GDK_DRAWABLE_XID (window)))
|
|
||||||
{
|
|
||||||
g_warning ("gdk_property_change: OpenClipboard failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
hdata = GlobalAlloc (GMEM_MOVEABLE|GMEM_DDESHARE, length + 1);
|
|
||||||
ptr = GlobalLock (hdata);
|
|
||||||
GDK_NOTE (SELECTION, g_print ("...hdata=%#x, ptr=%#x\n", hdata, ptr));
|
|
||||||
|
|
||||||
for (i = 0; i < nelements; i++)
|
|
||||||
{
|
|
||||||
if (*data == '\n')
|
|
||||||
*ptr++ = '\r';
|
|
||||||
*ptr++ = *data++;
|
|
||||||
}
|
|
||||||
*ptr++ = '\0';
|
|
||||||
GlobalUnlock (hdata);
|
|
||||||
GDK_NOTE (SELECTION, g_print ("...SetClipboardData(CF_TEXT, %#x)\n",
|
|
||||||
hdata));
|
|
||||||
if (!SetClipboardData(CF_TEXT, hdata))
|
|
||||||
g_warning ("gdk_property_change: SetClipboardData failed: %d",
|
|
||||||
GetLastError ());
|
|
||||||
#if 1
|
|
||||||
GDK_NOTE (SELECTION, g_print ("...CloseClipboard()\n"));
|
|
||||||
if (!CloseClipboard ())
|
|
||||||
{
|
|
||||||
g_warning ("gdk_property_change: CloseClipboard failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else
|
|
||||||
g_warning ("gdk_property_change: General case not implemented");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_property_delete (GdkWindow *window,
|
|
||||||
GdkAtom property)
|
|
||||||
{
|
|
||||||
gchar *prop_name, *type_name;
|
|
||||||
extern void gdk_selection_property_delete (GdkWindow *);
|
|
||||||
|
|
||||||
if (GDK_DRAWABLE_DESTROYED (window))
|
|
||||||
return;
|
|
||||||
|
|
||||||
GDK_NOTE (SELECTION,
|
|
||||||
(prop_name = gdk_atom_name (property),
|
|
||||||
g_print ("gdk_property_delete: %#x %#x (%s)\n",
|
|
||||||
(window ? GDK_DRAWABLE_XID (window) : 0),
|
|
||||||
property, prop_name),
|
|
||||||
g_free (prop_name)));
|
|
||||||
|
|
||||||
if (property == gdk_selection_property)
|
|
||||||
gdk_selection_property_delete (window);
|
|
||||||
else
|
|
||||||
g_warning ("gdk_property_delete: General case not implemented");
|
|
||||||
}
|
|
@ -1,367 +0,0 @@
|
|||||||
/* 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.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;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkRegion*
|
|
||||||
gdk_regions_intersect (GdkRegion *source1,
|
|
||||||
GdkRegion *source2)
|
|
||||||
{
|
|
||||||
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,
|
|
||||||
RGN_AND);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkRegion*
|
|
||||||
gdk_regions_union (GdkRegion *source1,
|
|
||||||
GdkRegion *source2)
|
|
||||||
{
|
|
||||||
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,
|
|
||||||
RGN_OR);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkRegion*
|
|
||||||
gdk_regions_subtract (GdkRegion *source1,
|
|
||||||
GdkRegion *source2)
|
|
||||||
{
|
|
||||||
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,
|
|
||||||
RGN_DIFF);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkRegion*
|
|
||||||
gdk_regions_xor (GdkRegion *source1,
|
|
||||||
GdkRegion *source2)
|
|
||||||
{
|
|
||||||
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,
|
|
||||||
RGN_XOR);
|
|
||||||
return res;
|
|
||||||
}
|
|
@ -1,403 +0,0 @@
|
|||||||
/* 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 <string.h>
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
|
||||||
#include "gdkx.h"
|
|
||||||
|
|
||||||
/* We emulate the GDK_SELECTION window properties by storing
|
|
||||||
* it's data in a per-window hashtable.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
guchar *data;
|
|
||||||
gint length;
|
|
||||||
gint format;
|
|
||||||
GdkAtom type;
|
|
||||||
} GdkSelProp;
|
|
||||||
|
|
||||||
static GHashTable *sel_prop_table = NULL;
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_selection_init (void)
|
|
||||||
{
|
|
||||||
if (sel_prop_table == NULL)
|
|
||||||
sel_prop_table = g_hash_table_new (g_int_hash, g_int_equal);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_sel_prop_store (GdkWindow *owner,
|
|
||||||
GdkAtom type,
|
|
||||||
gint format,
|
|
||||||
guchar *data,
|
|
||||||
gint length)
|
|
||||||
{
|
|
||||||
GdkSelProp *prop;
|
|
||||||
|
|
||||||
prop = g_hash_table_lookup (sel_prop_table, &GDK_DRAWABLE_XID (owner));
|
|
||||||
if (prop != NULL)
|
|
||||||
{
|
|
||||||
g_free (prop->data);
|
|
||||||
g_hash_table_remove (sel_prop_table, &GDK_DRAWABLE_XID (owner));
|
|
||||||
}
|
|
||||||
prop = g_new (GdkSelProp, 1);
|
|
||||||
prop->data = data;
|
|
||||||
prop->length = length;
|
|
||||||
prop->format = format;
|
|
||||||
prop->type = type;
|
|
||||||
g_hash_table_insert (sel_prop_table, &GDK_DRAWABLE_XID (owner), prop);
|
|
||||||
}
|
|
||||||
|
|
||||||
gint
|
|
||||||
gdk_selection_owner_set (GdkWindow *owner,
|
|
||||||
GdkAtom selection,
|
|
||||||
guint32 time,
|
|
||||||
gint send_event)
|
|
||||||
{
|
|
||||||
gchar *sel_name;
|
|
||||||
HWND xwindow;
|
|
||||||
|
|
||||||
GDK_NOTE (SELECTION,
|
|
||||||
(sel_name = gdk_atom_name (selection),
|
|
||||||
g_print ("gdk_selection_owner_set: %#x %#x (%s)\n",
|
|
||||||
(owner ? GDK_DRAWABLE_XID (owner) : 0),
|
|
||||||
selection, sel_name),
|
|
||||||
g_free (sel_name)));
|
|
||||||
|
|
||||||
if (selection != gdk_clipboard_atom)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (owner != NULL)
|
|
||||||
xwindow = GDK_DRAWABLE_XID (owner);
|
|
||||||
else
|
|
||||||
xwindow = NULL;
|
|
||||||
|
|
||||||
GDK_NOTE (SELECTION, g_print ("...OpenClipboard(%#x)\n", xwindow));
|
|
||||||
if (!OpenClipboard (xwindow))
|
|
||||||
{
|
|
||||||
g_warning ("gdk_selection_owner_set: OpenClipboard failed");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
GDK_NOTE (SELECTION, g_print ("...EmptyClipboard()\n"));
|
|
||||||
if (!EmptyClipboard ())
|
|
||||||
{
|
|
||||||
g_warning ("gdk_selection_owner_set: EmptyClipboard failed");
|
|
||||||
CloseClipboard ();
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#if 0
|
|
||||||
/* No delayed rendering */
|
|
||||||
if (xwindow != NULL)
|
|
||||||
SetClipboardData (CF_TEXT, NULL);
|
|
||||||
#endif
|
|
||||||
GDK_NOTE (SELECTION, g_print ("...CloseClipboard()\n"));
|
|
||||||
if (!CloseClipboard ())
|
|
||||||
{
|
|
||||||
g_warning ("gdk_selection_owner_set: CloseClipboard failed");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (owner != NULL)
|
|
||||||
{
|
|
||||||
/* Send ourselves an ersatz selection request message so that
|
|
||||||
* gdk_property_change will be called to store the clipboard data.
|
|
||||||
*/
|
|
||||||
SendMessage (xwindow, gdk_selection_request_msg,
|
|
||||||
selection, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkWindow*
|
|
||||||
gdk_selection_owner_get (GdkAtom selection)
|
|
||||||
{
|
|
||||||
GdkWindow *window;
|
|
||||||
gchar *sel_name;
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
/* XXX Hmm, gtk selections seem to work best with this. This causes
|
|
||||||
* gtk to always get the clipboard contents from Windows, and not
|
|
||||||
* from the editable's own stashed-away copy.
|
|
||||||
*/
|
|
||||||
return NULL;
|
|
||||||
#else
|
|
||||||
if (selection != gdk_clipboard_atom)
|
|
||||||
window = NULL;
|
|
||||||
else
|
|
||||||
window = gdk_window_lookup (GetClipboardOwner ());
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GDK_NOTE (SELECTION,
|
|
||||||
(sel_name = gdk_atom_name (selection),
|
|
||||||
g_print ("gdk_selection_owner_get: %#x (%s) = %#x\n",
|
|
||||||
selection, sel_name,
|
|
||||||
(window ? GDK_DRAWABLE_XID (window) : 0)),
|
|
||||||
g_free (sel_name)));
|
|
||||||
|
|
||||||
return window;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_selection_convert (GdkWindow *requestor,
|
|
||||||
GdkAtom selection,
|
|
||||||
GdkAtom target,
|
|
||||||
guint32 time)
|
|
||||||
{
|
|
||||||
HGLOBAL hdata;
|
|
||||||
GdkSelProp *prop;
|
|
||||||
guchar *ptr, *data, *datap, *p;
|
|
||||||
guint i, length, slength;
|
|
||||||
gchar *sel_name, *tgt_name;
|
|
||||||
|
|
||||||
g_return_if_fail (requestor != NULL);
|
|
||||||
if (GDK_DRAWABLE_DESTROYED (requestor))
|
|
||||||
return;
|
|
||||||
|
|
||||||
GDK_NOTE (SELECTION,
|
|
||||||
(sel_name = gdk_atom_name (selection),
|
|
||||||
tgt_name = gdk_atom_name (target),
|
|
||||||
g_print ("gdk_selection_convert: %#x %#x (%s) %#x (%s)\n",
|
|
||||||
GDK_DRAWABLE_XID (requestor), selection, sel_name, target, tgt_name),
|
|
||||||
g_free (sel_name),
|
|
||||||
g_free (tgt_name)));
|
|
||||||
|
|
||||||
if (selection == gdk_clipboard_atom)
|
|
||||||
{
|
|
||||||
/* Converting the CLIPBOARD selection means he wants the
|
|
||||||
* contents of the clipboard. Get the clipboard data,
|
|
||||||
* and store it for later.
|
|
||||||
*/
|
|
||||||
GDK_NOTE (SELECTION, g_print ("...OpenClipboard(%#x)\n",
|
|
||||||
GDK_DRAWABLE_XID (requestor)));
|
|
||||||
if (!OpenClipboard (GDK_DRAWABLE_XID (requestor)))
|
|
||||||
{
|
|
||||||
g_warning ("gdk_selection_convert: OpenClipboard failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
GDK_NOTE (SELECTION, g_print ("...GetClipboardData(CF_TEXT)\n"));
|
|
||||||
if ((hdata = GetClipboardData (CF_TEXT)) != NULL)
|
|
||||||
{
|
|
||||||
if ((ptr = GlobalLock (hdata)) != NULL)
|
|
||||||
{
|
|
||||||
length = GlobalSize (hdata);
|
|
||||||
|
|
||||||
GDK_NOTE (SELECTION, g_print ("...got data: %d bytes: %.10s\n",
|
|
||||||
length, ptr));
|
|
||||||
|
|
||||||
slength = 0;
|
|
||||||
p = ptr;
|
|
||||||
for (i = 0; i < length; i++)
|
|
||||||
{
|
|
||||||
if (*p == '\0')
|
|
||||||
break;
|
|
||||||
else if (*p != '\r')
|
|
||||||
slength++;
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
data = datap = g_malloc (slength + 1);
|
|
||||||
p = ptr;
|
|
||||||
for (i = 0; i < length; i++)
|
|
||||||
{
|
|
||||||
if (*p == '\0')
|
|
||||||
break;
|
|
||||||
else if (*p != '\r')
|
|
||||||
*datap++ = *p;
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
*datap++ = '\0';
|
|
||||||
gdk_sel_prop_store (requestor, GDK_TARGET_STRING, 8,
|
|
||||||
data, strlen (data) + 1);
|
|
||||||
|
|
||||||
GlobalUnlock (hdata);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GDK_NOTE (SELECTION, g_print ("...CloseClipboard()\n"));
|
|
||||||
CloseClipboard ();
|
|
||||||
|
|
||||||
|
|
||||||
/* Send ourselves an ersatz selection notify message so that we actually
|
|
||||||
* fetch the data.
|
|
||||||
*/
|
|
||||||
SendMessage (GDK_DRAWABLE_XID (requestor), gdk_selection_notify_msg, selection, target);
|
|
||||||
}
|
|
||||||
else if (selection == gdk_win32_dropfiles_atom)
|
|
||||||
{
|
|
||||||
/* This means he wants the names of the dropped files.
|
|
||||||
* gdk_dropfiles_filter already has stored the text/uri-list
|
|
||||||
* data, tempoarily on gdk_root_parent's selection "property".
|
|
||||||
*/
|
|
||||||
GdkSelProp *prop;
|
|
||||||
|
|
||||||
prop = g_hash_table_lookup (sel_prop_table, &gdk_root_parent->drawable.xwindow);
|
|
||||||
|
|
||||||
if (prop != NULL)
|
|
||||||
{
|
|
||||||
g_hash_table_remove (sel_prop_table, &gdk_root_parent->drawable.xwindow);
|
|
||||||
gdk_sel_prop_store (requestor, prop->type, prop->format,
|
|
||||||
prop->data, prop->length);
|
|
||||||
g_free (prop);
|
|
||||||
SendMessage (GDK_DRAWABLE_XID (requestor), gdk_selection_notify_msg, selection, target);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_warning ("gdk_selection_convert: General case not implemented");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gint
|
|
||||||
gdk_selection_property_get (GdkWindow *requestor,
|
|
||||||
guchar **data,
|
|
||||||
GdkAtom *ret_type,
|
|
||||||
gint *ret_format)
|
|
||||||
{
|
|
||||||
GdkSelProp *prop;
|
|
||||||
|
|
||||||
g_return_val_if_fail (requestor != NULL, 0);
|
|
||||||
g_return_val_if_fail (GDK_IS_WINDOW (requestor), 0);
|
|
||||||
|
|
||||||
if (GDK_DRAWABLE_DESTROYED (requestor))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
GDK_NOTE (SELECTION, g_print ("gdk_selection_property_get: %#x\n",
|
|
||||||
GDK_DRAWABLE_XID (requestor)));
|
|
||||||
|
|
||||||
prop = g_hash_table_lookup (sel_prop_table, &GDK_DRAWABLE_XID (requestor));
|
|
||||||
|
|
||||||
if (prop == NULL)
|
|
||||||
{
|
|
||||||
*data = NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
*data = g_malloc (prop->length);
|
|
||||||
if (prop->length > 0)
|
|
||||||
memmove (*data, prop->data, prop->length);
|
|
||||||
if (ret_type)
|
|
||||||
*ret_type = prop->type;
|
|
||||||
if (ret_format)
|
|
||||||
*ret_format = prop->format;
|
|
||||||
|
|
||||||
return prop->length;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_selection_property_delete (GdkWindow *window)
|
|
||||||
{
|
|
||||||
GdkSelProp *prop;
|
|
||||||
|
|
||||||
prop = g_hash_table_lookup (sel_prop_table, &GDK_DRAWABLE_XID (window));
|
|
||||||
if (prop != NULL)
|
|
||||||
{
|
|
||||||
g_free (prop->data);
|
|
||||||
g_hash_table_remove (sel_prop_table, &GDK_DRAWABLE_XID (window));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
g_warning ("huh?");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_selection_send_notify (guint32 requestor,
|
|
||||||
GdkAtom selection,
|
|
||||||
GdkAtom target,
|
|
||||||
GdkAtom property,
|
|
||||||
guint32 time)
|
|
||||||
{
|
|
||||||
gchar *sel_name, *tgt_name, *prop_name;
|
|
||||||
|
|
||||||
GDK_NOTE (SELECTION,
|
|
||||||
(sel_name = gdk_atom_name (selection),
|
|
||||||
tgt_name = gdk_atom_name (target),
|
|
||||||
prop_name = gdk_atom_name (property),
|
|
||||||
g_print ("gdk_selection_send_notify: %#x %#x (%s) %#x (%s) %#x (%s)\n",
|
|
||||||
requestor,
|
|
||||||
selection, sel_name,
|
|
||||||
target, tgt_name,
|
|
||||||
property, prop_name),
|
|
||||||
g_free (sel_name),
|
|
||||||
g_free (tgt_name),
|
|
||||||
g_free (prop_name)));
|
|
||||||
|
|
||||||
/* Send ourselves a selection clear message so that gtk thinks we don't
|
|
||||||
* have the selection, and will claim it anew when needed, and
|
|
||||||
* we thus get a chance to store data in the Windows clipboard.
|
|
||||||
* Otherwise, if a gtkeditable does a copy to clipboard several times
|
|
||||||
* only the first one actually gets copied to the Windows clipboard,
|
|
||||||
* as only he first one causes a call to gdk_property_change.
|
|
||||||
*
|
|
||||||
* Hmm, there is something fishy with this. Cut and paste inside the
|
|
||||||
* same app didn't work, the gtkeditable immediately forgot the
|
|
||||||
* clipboard contents in gtk_editable_selection_clear as a result of
|
|
||||||
* this message. OTOH, when I changed gdk_selection_owner_get to
|
|
||||||
* always return NULL, it works. Sigh.
|
|
||||||
*/
|
|
||||||
|
|
||||||
SendMessage ((HWND) requestor, gdk_selection_clear_msg, selection, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
gint
|
|
||||||
gdk_text_property_to_text_list (GdkAtom encoding,
|
|
||||||
gint format,
|
|
||||||
guchar *text,
|
|
||||||
gint length,
|
|
||||||
gchar ***list)
|
|
||||||
{
|
|
||||||
GDK_NOTE (SELECTION,
|
|
||||||
g_print ("gdk_text_property_to_text_list not implemented\n"));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_free_text_list (gchar **list)
|
|
||||||
{
|
|
||||||
g_return_if_fail (list != NULL);
|
|
||||||
|
|
||||||
/* ??? */
|
|
||||||
}
|
|
||||||
|
|
||||||
gint
|
|
||||||
gdk_string_to_compound_text (gchar *str,
|
|
||||||
GdkAtom *encoding,
|
|
||||||
gint *format,
|
|
||||||
guchar **ctext,
|
|
||||||
gint *length)
|
|
||||||
{
|
|
||||||
g_warning ("gdk_string_to_compound_text: Not implemented");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_free_compound_text (guchar *ctext)
|
|
||||||
{
|
|
||||||
g_warning ("gdk_free_compound_text: Not implemented");
|
|
||||||
}
|
|
@ -1,346 +0,0 @@
|
|||||||
/* 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 "gdkvisual.h"
|
|
||||||
#include "gdkprivate.h"
|
|
||||||
|
|
||||||
static void gdk_visual_decompose_mask (gulong mask,
|
|
||||||
gint *shift,
|
|
||||||
gint *prec);
|
|
||||||
|
|
||||||
static GdkVisualPrivate *system_visual;
|
|
||||||
|
|
||||||
static gint available_depths[1];
|
|
||||||
|
|
||||||
static GdkVisualType available_types[1];
|
|
||||||
|
|
||||||
#ifdef G_ENABLE_DEBUG
|
|
||||||
|
|
||||||
static const gchar* visual_names[] =
|
|
||||||
{
|
|
||||||
"static gray",
|
|
||||||
"grayscale",
|
|
||||||
"static color",
|
|
||||||
"pseudo color",
|
|
||||||
"true color",
|
|
||||||
"direct color",
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* G_ENABLE_DEBUG */
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_visual_init (void)
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
BITMAPINFOHEADER bi;
|
|
||||||
union
|
|
||||||
{
|
|
||||||
RGBQUAD colors[256];
|
|
||||||
DWORD fields[256];
|
|
||||||
} u;
|
|
||||||
} bmi;
|
|
||||||
HBITMAP hbm;
|
|
||||||
|
|
||||||
int rastercaps, numcolors, sizepalette, bitspixel;
|
|
||||||
|
|
||||||
system_visual = g_new (GdkVisualPrivate, 1);
|
|
||||||
|
|
||||||
bitspixel = GetDeviceCaps (gdk_DC, BITSPIXEL);
|
|
||||||
rastercaps = GetDeviceCaps (gdk_DC, RASTERCAPS);
|
|
||||||
system_visual->xvisual = g_new (Visual, 1);
|
|
||||||
system_visual->xvisual->visualid = 0;
|
|
||||||
system_visual->xvisual->bitspixel = bitspixel;
|
|
||||||
|
|
||||||
if (rastercaps & RC_PALETTE)
|
|
||||||
{
|
|
||||||
system_visual->visual.type = GDK_VISUAL_PSEUDO_COLOR;
|
|
||||||
numcolors = GetDeviceCaps (gdk_DC, NUMCOLORS);
|
|
||||||
sizepalette = GetDeviceCaps (gdk_DC, SIZEPALETTE);
|
|
||||||
system_visual->xvisual->map_entries = sizepalette;
|
|
||||||
}
|
|
||||||
else if (bitspixel == 1)
|
|
||||||
{
|
|
||||||
system_visual->visual.type = GDK_VISUAL_STATIC_GRAY;
|
|
||||||
system_visual->xvisual->map_entries = 2;
|
|
||||||
}
|
|
||||||
else if (bitspixel == 4)
|
|
||||||
{
|
|
||||||
system_visual->visual.type = GDK_VISUAL_STATIC_COLOR;
|
|
||||||
system_visual->xvisual->map_entries = 16;
|
|
||||||
}
|
|
||||||
else if (bitspixel == 8)
|
|
||||||
{
|
|
||||||
system_visual->visual.type = GDK_VISUAL_STATIC_COLOR;
|
|
||||||
system_visual->xvisual->map_entries = 256;
|
|
||||||
}
|
|
||||||
else if (bitspixel == 16)
|
|
||||||
{
|
|
||||||
system_visual->visual.type = GDK_VISUAL_TRUE_COLOR;
|
|
||||||
#if 1
|
|
||||||
/* This code by Mike Enright,
|
|
||||||
* see http://www.users.cts.com/sd/m/menright/display.html
|
|
||||||
*/
|
|
||||||
memset (&bmi, 0, sizeof (bmi));
|
|
||||||
bmi.bi.biSize = sizeof (bmi.bi);
|
|
||||||
|
|
||||||
hbm = CreateCompatibleBitmap (gdk_DC, 1, 1);
|
|
||||||
GetDIBits (gdk_DC, hbm, 0, 1, NULL,
|
|
||||||
(BITMAPINFO *) &bmi, DIB_RGB_COLORS);
|
|
||||||
GetDIBits (gdk_DC, hbm, 0, 1, NULL,
|
|
||||||
(BITMAPINFO *) &bmi, DIB_RGB_COLORS);
|
|
||||||
DeleteObject (hbm);
|
|
||||||
|
|
||||||
if (bmi.bi.biCompression != BI_BITFIELDS)
|
|
||||||
{
|
|
||||||
/* Either BI_RGB or BI_RLE_something
|
|
||||||
* .... or perhaps (!!) something else.
|
|
||||||
* Theoretically biCompression might be
|
|
||||||
* mmioFourCC('c','v','i','d') but I doubt it.
|
|
||||||
*/
|
|
||||||
if (bmi.bi.biCompression == BI_RGB)
|
|
||||||
{
|
|
||||||
/* It's 555 */
|
|
||||||
bitspixel = 15;
|
|
||||||
system_visual->visual.red_mask = 0x00007C00;
|
|
||||||
system_visual->visual.green_mask = 0x000003E0;
|
|
||||||
system_visual->visual.blue_mask = 0x0000001F;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DWORD allmasks =
|
|
||||||
bmi.u.fields[0] | bmi.u.fields[1] | bmi.u.fields[2];
|
|
||||||
int k = 0;
|
|
||||||
while (allmasks)
|
|
||||||
{
|
|
||||||
if (allmasks&1)
|
|
||||||
k++;
|
|
||||||
allmasks/=2;
|
|
||||||
}
|
|
||||||
bitspixel = k;
|
|
||||||
system_visual->visual.red_mask = bmi.u.fields[0];
|
|
||||||
system_visual->visual.green_mask = bmi.u.fields[1];
|
|
||||||
system_visual->visual.blue_mask = bmi.u.fields[2];
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* Old, incorrect (but still working) code. */
|
|
||||||
#if 0
|
|
||||||
system_visual->visual.red_mask = 0x0000F800;
|
|
||||||
system_visual->visual.green_mask = 0x000007E0;
|
|
||||||
system_visual->visual.blue_mask = 0x0000001F;
|
|
||||||
#else
|
|
||||||
system_visual->visual.red_mask = 0x00007C00;
|
|
||||||
system_visual->visual.green_mask = 0x000003E0;
|
|
||||||
system_visual->visual.blue_mask = 0x0000001F;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else if (bitspixel == 24 || bitspixel == 32)
|
|
||||||
{
|
|
||||||
bitspixel = 24;
|
|
||||||
system_visual->visual.type = GDK_VISUAL_TRUE_COLOR;
|
|
||||||
system_visual->visual.red_mask = 0x00FF0000;
|
|
||||||
system_visual->visual.green_mask = 0x0000FF00;
|
|
||||||
system_visual->visual.blue_mask = 0x000000FF;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
g_error ("gdk_visual_init: unsupported BITSPIXEL: %d\n", bitspixel);
|
|
||||||
|
|
||||||
system_visual->visual.depth = bitspixel;
|
|
||||||
system_visual->visual.byte_order = GDK_LSB_FIRST;
|
|
||||||
system_visual->visual.bits_per_rgb = 42; /* Not used? */
|
|
||||||
|
|
||||||
if ((system_visual->visual.type == GDK_VISUAL_TRUE_COLOR) ||
|
|
||||||
(system_visual->visual.type == GDK_VISUAL_DIRECT_COLOR))
|
|
||||||
{
|
|
||||||
gdk_visual_decompose_mask (system_visual->visual.red_mask,
|
|
||||||
&system_visual->visual.red_shift,
|
|
||||||
&system_visual->visual.red_prec);
|
|
||||||
|
|
||||||
gdk_visual_decompose_mask (system_visual->visual.green_mask,
|
|
||||||
&system_visual->visual.green_shift,
|
|
||||||
&system_visual->visual.green_prec);
|
|
||||||
|
|
||||||
gdk_visual_decompose_mask (system_visual->visual.blue_mask,
|
|
||||||
&system_visual->visual.blue_shift,
|
|
||||||
&system_visual->visual.blue_prec);
|
|
||||||
system_visual->xvisual->map_entries =
|
|
||||||
1 << (MAX (system_visual->visual.red_prec,
|
|
||||||
MAX (system_visual->visual.green_prec,
|
|
||||||
system_visual->visual.blue_prec)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
system_visual->visual.red_mask = 0;
|
|
||||||
system_visual->visual.red_shift = 0;
|
|
||||||
system_visual->visual.red_prec = 0;
|
|
||||||
|
|
||||||
system_visual->visual.green_mask = 0;
|
|
||||||
system_visual->visual.green_shift = 0;
|
|
||||||
system_visual->visual.green_prec = 0;
|
|
||||||
|
|
||||||
system_visual->visual.blue_mask = 0;
|
|
||||||
system_visual->visual.blue_shift = 0;
|
|
||||||
system_visual->visual.blue_prec = 0;
|
|
||||||
}
|
|
||||||
system_visual->visual.colormap_size = system_visual->xvisual->map_entries;
|
|
||||||
|
|
||||||
available_depths[0] = system_visual->visual.depth;
|
|
||||||
available_types[0] = system_visual->visual.type;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkVisual*
|
|
||||||
gdk_visual_ref (GdkVisual *visual)
|
|
||||||
{
|
|
||||||
return visual;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_visual_unref (GdkVisual *visual)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
gint
|
|
||||||
gdk_visual_get_best_depth (void)
|
|
||||||
{
|
|
||||||
return available_depths[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkVisualType
|
|
||||||
gdk_visual_get_best_type (void)
|
|
||||||
{
|
|
||||||
return available_types[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkVisual*
|
|
||||||
gdk_visual_get_system (void)
|
|
||||||
{
|
|
||||||
return ((GdkVisual*) system_visual);
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkVisual*
|
|
||||||
gdk_visual_get_best (void)
|
|
||||||
{
|
|
||||||
return ((GdkVisual*) system_visual);
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkVisual*
|
|
||||||
gdk_visual_get_best_with_depth (gint depth)
|
|
||||||
{
|
|
||||||
if (depth == system_visual->visual.depth)
|
|
||||||
return (GdkVisual*) system_visual;
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkVisual*
|
|
||||||
gdk_visual_get_best_with_type (GdkVisualType visual_type)
|
|
||||||
{
|
|
||||||
if (visual_type == system_visual->visual.type)
|
|
||||||
return (GdkVisual*) system_visual;
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkVisual*
|
|
||||||
gdk_visual_get_best_with_both (gint depth,
|
|
||||||
GdkVisualType visual_type)
|
|
||||||
{
|
|
||||||
if ((depth == system_visual->visual.depth) &&
|
|
||||||
(visual_type == system_visual->visual.type))
|
|
||||||
return (GdkVisual*) system_visual;
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_query_depths (gint **depths,
|
|
||||||
gint *count)
|
|
||||||
{
|
|
||||||
*count = 1;
|
|
||||||
*depths = available_depths;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdk_query_visual_types (GdkVisualType **visual_types,
|
|
||||||
gint *count)
|
|
||||||
{
|
|
||||||
*count = 1;
|
|
||||||
*visual_types = available_types;
|
|
||||||
}
|
|
||||||
|
|
||||||
GList*
|
|
||||||
gdk_list_visuals (void)
|
|
||||||
{
|
|
||||||
return g_list_append (NULL, (gpointer) system_visual);
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkVisual*
|
|
||||||
gdk_visual_lookup (Visual *xvisual)
|
|
||||||
{
|
|
||||||
if (system_visual->xvisual == xvisual)
|
|
||||||
return (GdkVisual *) system_visual;
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
GdkVisual*
|
|
||||||
gdkx_visual_get (VisualID xvisualid)
|
|
||||||
{
|
|
||||||
if (xvisualid == system_visual->xvisual->visualid)
|
|
||||||
return (GdkVisual*) system_visual;
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gdk_visual_decompose_mask (gulong mask,
|
|
||||||
gint *shift,
|
|
||||||
gint *prec)
|
|
||||||
{
|
|
||||||
*shift = 0;
|
|
||||||
*prec = 0;
|
|
||||||
|
|
||||||
while (!(mask & 0x1))
|
|
||||||
{
|
|
||||||
(*shift)++;
|
|
||||||
mask >>= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (mask & 0x1)
|
|
||||||
{
|
|
||||||
(*prec)++;
|
|
||||||
mask >>= 1;
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user