1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
23 #include "gdkprivate.h"
25 static const struct { const char *name; int type; } cursors[] = {
28 { "based_arrow_down", 4 },
29 { "based_arrow_up", 6 },
32 { "bottom_left_corner", 12 },
33 { "bottom_right_corner", 14 },
34 { "bottom_side", 16 },
42 { "cross_reverse", 32 },
44 { "diamond_cross", 36 },
47 { "double_arrow", 42 },
48 { "draft_large", 44 },
49 { "draft_small", 46 },
67 { "middlebutton", 82 },
72 { "question_arrow", 92 },
76 { "rightbutton", 100 },
79 { "sb_down_arrow", 106 },
80 { "sb_h_double_arrow", 108 },
81 { "sb_left_arrow", 110 },
82 { "sb_right_arrow", 112 },
83 { "sb_up_arrow", 114 },
84 { "sb_v_double_arrow", 116 },
92 { "top_left_arrow", 132 },
93 { "top_left_corner", 134 },
94 { "top_right_corner", 136 },
107 gdk_cursor_new (GdkCursorType cursor_type)
109 GdkCursorPrivate *private;
115 for (i = 0; cursors[i].name != NULL && cursors[i].type != cursor_type; i++)
117 if (cursors[i].name != NULL)
119 xcursor = LoadCursor (gdk_DLLInstance, cursors[i].name);
121 g_warning ("gdk_cursor_new: LoadCursor failed");
122 GDK_NOTE (MISC, g_print ("gdk_cursor_new: %#x %d\n",
123 xcursor, cursor_type));
127 g_warning ("gdk_cursor_new: no cursor %d found",
132 private = g_new (GdkCursorPrivate, 1);
133 private->xcursor = xcursor;
134 cursor = (GdkCursor*) private;
135 cursor->type = cursor_type;
141 gdk_cursor_new_from_pixmap (GdkPixmap *source, GdkPixmap *mask, GdkColor *fg, GdkColor *bg, gint x, gint y)
143 #if 0 /* I don't understand cursors, sigh */
144 GdkCursorPrivate *private;
147 GdkPixmapPrivate *source_private, *mask_private;
148 GdkPixmapPrivate *s2_private;
154 HGDIOBJ oldbm1, oldbm2;
156 source_private = (GdkPixmapPrivate *) source;
157 mask_private = (GdkPixmapPrivate *) mask;
159 s2 = gdk_pixmap_new (source, source_private->width, source_private->height, 1);
160 gc = gdk_gc_new (s2);
161 gdk_gc_set_foreground (gc, fg);
162 gdk_gc_set_background (gc, bg);
163 gdk_draw_pixmap (s2, gc, source, 0, 0, 0, 0,
164 source_private->width, source_private->height);
167 iconinfo.fIcon = FALSE;
168 iconinfo.xHotspot = x;
169 iconinfo.yHotspot = y;
171 invmask = CreateBitmap (mask_private->width, mask_private->height, 1, 1, NULL);
172 hdc1 = CreateCompatibleDC (gdk_DC);
173 oldbm1 = SelectObject (hdc1, invmask);
174 hdc2 = CreateCompatibleDC (gdk_DC);
175 oldbm2 = SelectObject (hdc2, mask_private->xwindow);
176 BitBlt (hdc1, 0, 0, mask_private->width, mask_private->height, hdc2, 0, 0, NOTSRCCOPY);
177 SelectObject (hdc2, oldbm2);
179 SelectObject (hdc1, oldbm1);
181 iconinfo.hbmMask = invmask;
183 iconinfo.hbmMask = mask_private->xwindow;;
185 iconinfo.hbmColor = ((GdkPixmapPrivate *) s2)->xwindow;
187 if ((xcursor = CreateIconIndirect (&iconinfo)) == NULL)
189 g_warning ("gdk_cursor_new_from_private: CreateIconIndirect failed");
190 gdk_pixmap_unref (s2);
191 return gdk_cursor_new (GDK_PIRATE);
195 g_print ("gdk_cursor_new_from_private: %#x (%dx%d) %#x (%dx%d) = %#x\n",
196 source_private->xwindow,
197 source_private->width, source_private->height,
198 mask_private->xwindow,
199 mask_private->width, mask_private->height,
202 gdk_pixmap_unref (s2);
203 private = g_new (GdkCursorPrivate, 1);
204 private->xcursor = xcursor;
205 cursor = (GdkCursor*) private;
206 cursor->type = GDK_CURSOR_IS_PIXMAP;
209 #else /* Just return some cursor ;-) */
210 return gdk_cursor_new (GDK_PIRATE);
215 gdk_cursor_destroy (GdkCursor *cursor)
217 GdkCursorPrivate *private;
219 g_return_if_fail (cursor != NULL);
220 private = (GdkCursorPrivate *) cursor;
222 if (cursor->type == GDK_CURSOR_IS_PIXMAP)
223 DestroyIcon (private->xcursor);