@@ -43,56 +43,220 @@ struct _MetaCursorSpriteXcursor
4343G_DEFINE_TYPE (MetaCursorSpriteXcursor , meta_cursor_sprite_xcursor ,
4444 META_TYPE_CURSOR_SPRITE )
4545
46- static const char *
47- translate_meta_cursor (MetaCursor cursor )
46+ const char *
47+ meta_cursor_get_name (MetaCursor cursor )
4848{
4949 switch (cursor )
5050 {
5151 case META_CURSOR_DEFAULT :
5252 return "left_ptr" ;
53- case META_CURSOR_NORTH_RESIZE :
53+ case META_CURSOR_CONTEXT_MENU :
54+ return "left_ptr" ;
55+ case META_CURSOR_HELP :
56+ return "question_arrow" ;
57+ case META_CURSOR_POINTER :
58+ return "hand" ;
59+ case META_CURSOR_PROGRESS :
60+ return "left_ptr_watch" ;
61+ case META_CURSOR_WAIT :
62+ return "watch" ;
63+ case META_CURSOR_CELL :
64+ return "crosshair" ;
65+ case META_CURSOR_CROSSHAIR :
66+ return "cross" ;
67+ case META_CURSOR_TEXT :
68+ return "xterm" ;
69+ case META_CURSOR_VERTICAL_TEXT :
70+ return "xterm" ;
71+ case META_CURSOR_ALIAS :
72+ return "dnd-link" ;
73+ case META_CURSOR_COPY :
74+ return "dnd-copy" ;
75+ case META_CURSOR_MOVE :
76+ return "dnd-move" ;
77+ case META_CURSOR_NO_DROP :
78+ return "dnd-none" ;
79+ case META_CURSOR_NOT_ALLOWED :
80+ return "crossed_circle" ;
81+ case META_CURSOR_GRAB :
82+ return "hand2" ;
83+ case META_CURSOR_GRABBING :
84+ return "hand2" ;
85+ case META_CURSOR_E_RESIZE :
86+ return "right_side" ;
87+ case META_CURSOR_N_RESIZE :
5488 return "top_side" ;
55- case META_CURSOR_SOUTH_RESIZE :
89+ case META_CURSOR_NE_RESIZE :
90+ return "top_right_corner" ;
91+ case META_CURSOR_NW_RESIZE :
92+ return "top_left_corner" ;
93+ case META_CURSOR_S_RESIZE :
5694 return "bottom_side" ;
57- case META_CURSOR_WEST_RESIZE :
58- return "left_side" ;
59- case META_CURSOR_EAST_RESIZE :
60- return "right_side" ;
6195 case META_CURSOR_SE_RESIZE :
6296 return "bottom_right_corner" ;
6397 case META_CURSOR_SW_RESIZE :
6498 return "bottom_left_corner" ;
99+ case META_CURSOR_W_RESIZE :
100+ return "left_side" ;
101+ case META_CURSOR_EW_RESIZE :
102+ return "h_double_arrow" ;
103+ case META_CURSOR_NS_RESIZE :
104+ return "v_double_arrow" ;
105+ case META_CURSOR_NESW_RESIZE :
106+ return "fd_double_arrow" ;
107+ case META_CURSOR_NWSE_RESIZE :
108+ return "bd_double_arrow" ;
109+ case META_CURSOR_COL_RESIZE :
110+ return "h_double_arrow" ;
111+ case META_CURSOR_ROW_RESIZE :
112+ return "v_double_arrow" ;
113+ case META_CURSOR_ALL_SCROLL :
114+ return "left_ptr" ;
115+ case META_CURSOR_ZOOM_IN :
116+ return "left_ptr" ;
117+ case META_CURSOR_ZOOM_OUT :
118+ return "left_ptr" ;
119+ case META_CURSOR_DND_ASK :
120+ return "dnd-copy" ;
121+ case META_CURSOR_ALL_RESIZE :
122+ return "dnd-move" ;
123+ case META_CURSOR_INVALID :
124+ case META_CURSOR_NONE :
125+ break ;
126+ }
127+
128+ g_assert_not_reached ();
129+ return NULL ;
130+ }
131+
132+ const char *
133+ meta_cursor_get_legacy_name (MetaCursor cursor )
134+ {
135+ switch (cursor )
136+ {
137+ case META_CURSOR_DEFAULT :
138+ return "left_ptr" ;
139+ case META_CURSOR_CONTEXT_MENU :
140+ return "left_ptr" ;
141+ case META_CURSOR_HELP :
142+ return "question_arrow" ;
143+ case META_CURSOR_POINTER :
144+ return "hand" ;
145+ case META_CURSOR_PROGRESS :
146+ return "left_ptr_watch" ;
147+ case META_CURSOR_WAIT :
148+ return "watch" ;
149+ case META_CURSOR_CELL :
150+ return "crosshair" ;
151+ case META_CURSOR_CROSSHAIR :
152+ return "cross" ;
153+ case META_CURSOR_TEXT :
154+ return "xterm" ;
155+ case META_CURSOR_VERTICAL_TEXT :
156+ return "xterm" ;
157+ case META_CURSOR_ALIAS :
158+ return "dnd-link" ;
159+ case META_CURSOR_COPY :
160+ return "dnd-copy" ;
161+ case META_CURSOR_MOVE :
162+ return "dnd-move" ;
163+ case META_CURSOR_NO_DROP :
164+ return "dnd-none" ;
165+ case META_CURSOR_NOT_ALLOWED :
166+ return "crossed_circle" ;
167+ case META_CURSOR_GRAB :
168+ return "hand2" ;
169+ case META_CURSOR_GRABBING :
170+ return "hand2" ;
171+ case META_CURSOR_E_RESIZE :
172+ return "right_side" ;
173+ case META_CURSOR_N_RESIZE :
174+ return "top_side" ;
65175 case META_CURSOR_NE_RESIZE :
66176 return "top_right_corner" ;
67177 case META_CURSOR_NW_RESIZE :
68178 return "top_left_corner" ;
69- case META_CURSOR_MOVE_OR_RESIZE_WINDOW :
70- return "fleur" ;
71- case META_CURSOR_BUSY :
72- return "watch" ;
73- case META_CURSOR_DND_IN_DRAG :
74- return "dnd-none" ;
75- case META_CURSOR_DND_MOVE :
76- return "dnd-move" ;
77- case META_CURSOR_DND_COPY :
179+ case META_CURSOR_S_RESIZE :
180+ return "bottom_side" ;
181+ case META_CURSOR_SE_RESIZE :
182+ return "bottom_right_corner" ;
183+ case META_CURSOR_SW_RESIZE :
184+ return "bottom_left_corner" ;
185+ case META_CURSOR_W_RESIZE :
186+ return "left_side" ;
187+ case META_CURSOR_EW_RESIZE :
188+ return "h_double_arrow" ;
189+ case META_CURSOR_NS_RESIZE :
190+ return "v_double_arrow" ;
191+ case META_CURSOR_NESW_RESIZE :
192+ return "fd_double_arrow" ;
193+ case META_CURSOR_NWSE_RESIZE :
194+ return "bd_double_arrow" ;
195+ case META_CURSOR_COL_RESIZE :
196+ return "h_double_arrow" ;
197+ case META_CURSOR_ROW_RESIZE :
198+ return "v_double_arrow" ;
199+ case META_CURSOR_ALL_SCROLL :
200+ return "left_ptr" ;
201+ case META_CURSOR_ZOOM_IN :
202+ return "left_ptr" ;
203+ case META_CURSOR_ZOOM_OUT :
204+ return "left_ptr" ;
205+ case META_CURSOR_DND_ASK :
78206 return "dnd-copy" ;
79- case META_CURSOR_DND_UNSUPPORTED_TARGET :
80- return "dnd-none" ;
81- case META_CURSOR_POINTING_HAND :
82- return "hand2" ;
83- case META_CURSOR_CROSSHAIR :
84- return "crosshair" ;
85- case META_CURSOR_IBEAM :
86- return "xterm" ;
207+ case META_CURSOR_ALL_RESIZE :
208+ return "dnd-move" ;
209+ case META_CURSOR_INVALID :
87210 case META_CURSOR_NONE :
88- case META_CURSOR_LAST :
89211 break ;
90- }
212+ }
91213
92214 g_assert_not_reached ();
93215 return NULL ;
94216}
95217
218+ static Cursor
219+ create_blank_cursor (Display * xdisplay )
220+ {
221+ Pixmap pixmap ;
222+ XColor color ;
223+ Cursor cursor ;
224+ XGCValues gc_values ;
225+ GC gc ;
226+
227+ pixmap = XCreatePixmap (xdisplay , DefaultRootWindow (xdisplay ), 1 , 1 , 1 );
228+
229+ gc_values .foreground = BlackPixel (xdisplay , DefaultScreen (xdisplay ));
230+ gc = XCreateGC (xdisplay , pixmap , GCForeground , & gc_values );
231+
232+ XFillRectangle (xdisplay , pixmap , gc , 0 , 0 , 1 , 1 );
233+
234+ color .pixel = 0 ;
235+ color .red = color .blue = color .green = 0 ;
236+
237+ cursor = XCreatePixmapCursor (xdisplay , pixmap , pixmap , & color , & color , 1 , 1 );
238+
239+ XFreeGC (xdisplay , gc );
240+ XFreePixmap (xdisplay , pixmap );
241+
242+ return cursor ;
243+ }
244+
245+ static XcursorImages *
246+ create_blank_cursor_images (void )
247+ {
248+ XcursorImages * images ;
249+
250+ images = XcursorImagesCreate (1 );
251+ images -> images [0 ] = XcursorImageCreate (1 , 1 );
252+
253+ images -> images [0 ]-> xhot = 0 ;
254+ images -> images [0 ]-> yhot = 0 ;
255+ memset (images -> images [0 ]-> pixels , 0 , sizeof (int32_t ));
256+
257+ return images ;
258+ }
259+
96260MetaCursor
97261meta_cursor_sprite_xcursor_get_cursor (MetaCursorSpriteXcursor * sprite_xcursor )
98262{
@@ -103,17 +267,30 @@ Cursor
103267meta_create_x_cursor (Display * xdisplay ,
104268 MetaCursor cursor )
105269{
106- return XcursorLibraryLoadCursor (xdisplay , translate_meta_cursor (cursor ));
270+ Cursor result ;
271+
272+ if (cursor == META_CURSOR_NONE )
273+ return create_blank_cursor (xdisplay );
274+
275+ result = XcursorLibraryLoadCursor (xdisplay , meta_cursor_get_name (cursor ));
276+ if (!result )
277+ result = XcursorLibraryLoadCursor (xdisplay , meta_cursor_get_legacy_name (cursor ));
278+
279+ return result ;
107280}
108281
109282static XcursorImages *
110- load_cursor_on_client (MetaCursor cursor , int scale )
283+ load_cursor_on_client (MetaCursor cursor ,
284+ int scale )
111285{
286+ if (cursor == META_CURSOR_INVALID )
287+ return create_blank_cursor_images ();
288+
112289 XcursorImages * xcursor_images ;
113290 int fallback_size ;
114291
115292 xcursor_images =
116- XcursorLibraryLoadImages (translate_meta_cursor (cursor ),
293+ XcursorLibraryLoadImages (meta_cursor_get_name (cursor ),
117294 meta_prefs_get_cursor_theme (),
118295 meta_prefs_get_cursor_size () * scale );
119296 if (xcursor_images )
@@ -248,7 +425,7 @@ load_cursor_from_theme (MetaCursorSprite *sprite)
248425{
249426 MetaCursorSpriteXcursor * sprite_xcursor = META_CURSOR_SPRITE_XCURSOR (sprite );
250427
251- g_assert (sprite_xcursor -> cursor != META_CURSOR_NONE );
428+ g_assert (sprite_xcursor -> cursor != META_CURSOR_INVALID );
252429
253430 sprite_xcursor -> theme_dirty = FALSE;
254431
0 commit comments