1 /* Dia -- an diagram creation/manipulation program
2 * Copyright (C) 1998 Alexander Larsson
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program 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
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 #define DIA_CURSOR GDK_LAST_CURSOR
28 #include "pixmaps/hand-open-data.xbm"
29 #include "pixmaps/hand-open-mask.xbm"
30 #include "pixmaps/hand-closed-data.xbm"
31 #include "pixmaps/hand-closed-mask.xbm"
32 #include "pixmaps/magnify-plus-data.xbm"
33 #include "pixmaps/magnify-plus-mask.xbm"
34 #include "pixmaps/magnify-minus-data.xbm"
35 #include "pixmaps/magnify-minus-mask.xbm"
38 /* Can't use a union because it can't be statically initialized
39 (except for the first element) */
40 int gdk_cursor_number
;
48 } cursors
[MAX_CURSORS
] = {
53 hand_open_data_width
, hand_open_data_height
,
55 hand_open_data_width
/2, hand_open_data_height
/2},
57 hand_closed_data_bits
,
58 hand_closed_data_width
, hand_closed_data_height
,
59 hand_closed_mask_bits
,
60 hand_closed_data_width
/2, hand_closed_data_height
/2},
62 magnify_minus_data_bits
,
63 magnify_minus_data_width
, magnify_minus_data_height
,
64 magnify_minus_mask_bits
,
65 magnify_minus_data_x_hot
, magnify_minus_data_y_hot
},
67 magnify_plus_data_bits
,
68 magnify_plus_data_width
, magnify_plus_data_height
,
69 magnify_plus_mask_bits
,
70 magnify_plus_data_x_hot
, magnify_plus_data_y_hot
},
71 { GDK_CROSS_REVERSE
},
75 get_cursor(DiaCursorType ctype
) {
76 if (ctype
>= MAX_CURSORS
|| ctype
< 0) {
79 if (cursors
[ctype
].cursor
== NULL
) {
80 GdkCursor
*new_cursor
= NULL
;
82 if (cursors
[ctype
].gdk_cursor_number
!= DIA_CURSOR
) {
83 new_cursor
= gdk_cursor_new(cursors
[ctype
].gdk_cursor_number
);
85 DDisplay
*active_display
= ddisplay_active ();
86 if (active_display
!= NULL
)
87 new_cursor
= create_cursor(active_display
->canvas
->window
,
90 cursors
[ctype
].height
,
93 cursors
[ctype
].hot_y
);
95 cursors
[ctype
].cursor
= new_cursor
;
98 return cursors
[ctype
].cursor
;
102 create_cursor(GdkWindow
*window
,
103 const gchar
*data
, int width
, int height
,
104 const gchar
*mask
, int hot_x
, int hot_y
)
106 GdkBitmap
*dbit
, *mbit
;
107 GdkColor black
, white
;
110 g_return_val_if_fail(window
!= NULL
, NULL
);
112 dbit
= gdk_bitmap_create_from_data(window
, data
, width
, height
);
113 mbit
= gdk_bitmap_create_from_data(window
, mask
, width
, height
);
114 g_assert(dbit
!= NULL
&& mbit
!= NULL
);
116 /* For some odd reason, black and white is inverted */
117 gdk_color_black(gdk_window_get_colormap(window
), &white
);
118 gdk_color_white(gdk_window_get_colormap(window
), &black
);
120 cursor
= gdk_cursor_new_from_pixmap(dbit
, mbit
, &white
, &black
, hot_x
,hot_y
);
121 g_assert(cursor
!= NULL
);
123 gdk_bitmap_unref(dbit
);
124 gdk_bitmap_unref(mbit
);