]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1368: GTK3 and GTK4 will drop numeric cursor support. v9.1.1368
authorDrew Vogel <dvogel@github>
Wed, 7 May 2025 19:32:03 +0000 (21:32 +0200)
committerChristian Brabandt <cb@256bit.org>
Wed, 7 May 2025 19:36:03 +0000 (21:36 +0200)
Problem:  GTK3 and GTK4 will drop numeric cursor support.
Solution: Adopt GTK3 code and use CSS cursor convention (Drew Vogel).

closes: #14610

Signed-off-by: Drew Vogel <dvogel@github>
Signed-off-by: Christian Brabandt <cb@256bit.org>
runtime/doc/options.txt
runtime/doc/version9.txt
src/gui_gtk_x11.c
src/version.c

index 6c60b5896815b580775963e1c984411d790e556d..bed14abb13e0c7f9c8fad0c0486eaf039d62f83f 100644 (file)
@@ -1,4 +1,4 @@
-*options.txt*  For Vim version 9.1.  Last change: 2025 Apr 30
+*options.txt*  For Vim version 9.1.  Last change: 2025 May 07
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -6038,7 +6038,7 @@ A jump table for the options with a short description can be found at |Q_op|.
                        feature}
        This option tells Vim what the mouse pointer should look like in
        different modes.  The option is a comma-separated list of parts, much
-       like used for 'guicursor'.  Each part consist of a mode/location-list
+       like used for 'guicursor'.  Each part consists of a mode/location-list
        and an argument-list:
                mode-list:shape,mode-list:shape,..
        The mode-list is a dash separated list of these modes/locations:
@@ -6066,26 +6066,26 @@ A jump table for the options with a short description can be found at |Q_op|.
 
        The shape is one of the following:
        avail   name            looks like ~
-       w x     arrow           Normal mouse pointer
-       w x     blank           no pointer at all (use with care!)
-       w x     beam            I-beam
-       w x     updown          up-down sizing arrows
-       w x     leftright       left-right sizing arrows
-       w x     busy            The system's usual busy pointer
-       w x     no              The system's usual 'no input' pointer
-         x     udsizing        indicates up-down resizing
-         x     lrsizing        indicates left-right resizing
-         x     crosshair       like a big thin +
-         x     hand1           black hand
-         x     hand2           white hand
-         x     pencil          what you write with
-         x     question        big ?
-         x     rightup-arrow   arrow pointing right-up
-       w x     up-arrow        arrow pointing up
+       w x g   arrow           Normal mouse pointer
+       w x     blank           no pointer at all (use with care!)
+       w x g   beam            I-beam
+       w x g   updown          up-down sizing arrows
+       w x g   leftright       left-right sizing arrows
+       w x g   busy            The system's usual busy pointer
+       w x g   no              The system's usual 'no input' pointer
+         x g   udsizing        indicates up-down resizing
+         x g   lrsizing        indicates left-right resizing
+         x g   crosshair       like a big thin +
+         x g   hand1           black hand
+         x g   hand2           white hand
+         x     pencil          what you write with
+         x g   question        big ?
+         x     rightup-arrow   arrow pointing right-up
+       w x     up-arrow        arrow pointing up
          x     <number>        any X11 pointer number (see X11/cursorfont.h)
 
        The "avail" column contains a 'w' if the shape is available for Win32,
-       x for X11.
+       x for X11 (including GTK+ 2), g for GTK+ 3.
        Any modes not specified or shapes not available use the normal mouse
        pointer.
 
index 9560b1dfb93c508e48834b19a7a5cfb0bb5c93ea..afa800d86d74fc24ad04e6ca318385f0a9c0fd0d 100644 (file)
@@ -1,4 +1,4 @@
-*version9.txt*  For Vim version 9.1.  Last change: 2025 Apr 24
+*version9.txt*  For Vim version 9.1.  Last change: 2025 May 07
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -41641,6 +41641,7 @@ Options: ~
 - New option value for 'fillchars':
        "trunc"         - configure truncation indicator, 'pummaxwidth'
        "truncrl"       - like "trunc" but in 'rl' mode, 'pummaxwidth'
+- adjust for GTK3 dropping some mouse cursors 'mouseshape'
 
 Ex commands: ~
 - allow to specify a priority when defining a new sign |:sign-define|
index f9d593f916d02dd5184edc3de201fbfd70ba37e2..2a11c4a04a68544b0d3ea6c009db726b983b0a6a 100644 (file)
@@ -2767,57 +2767,19 @@ mainwin_realize(GtkWidget *widget UNUSED, gpointer data UNUSED)
     static GdkCursor *
 create_blank_pointer(void)
 {
-    GdkWindow  *root_window = NULL;
-#if GTK_CHECK_VERSION(3,0,0)
-    GdkPixbuf   *blank_mask;
-#else
-    GdkPixmap  *blank_mask;
-#endif
     GdkCursor  *cursor;
+
 #if GTK_CHECK_VERSION(3,0,0)
-    GdkRGBA    color = { 0.0, 0.0, 0.0, 0.0 };
+    GdkDisplay  *disp = gtk_widget_get_display(gui.mainwin);
+    cursor = gdk_cursor_new_from_name(disp, "none");
 #else
+    // Create a pseudo blank pointer, which is in fact one pixel by one pixel
+    // in size.
+    GdkWindow  *root_window = NULL;
     GdkColor   color = { 0, 0, 0, 0 };
+    GdkPixmap  *blank_mask;
     char       blank_data[] = { 0x0 };
-#endif
-
-#if GTK_CHECK_VERSION(3,12,0)
-    {
-       GdkWindow * const win = gtk_widget_get_window(gui.mainwin);
-       GdkScreen * const scrn = gdk_window_get_screen(win);
-       root_window = gdk_screen_get_root_window(scrn);
-    }
-#else
     root_window = gtk_widget_get_root_window(gui.mainwin);
-#endif
-
-    // Create a pseudo blank pointer, which is in fact one pixel by one pixel
-    // in size.
-#if GTK_CHECK_VERSION(3,0,0)
-    {
-       cairo_surface_t *surf;
-       cairo_t         *cr;
-
-       surf = cairo_image_surface_create(CAIRO_FORMAT_A1, 1, 1);
-       cr = cairo_create(surf);
-
-       cairo_set_source_rgba(cr,
-                            color.red,
-                            color.green,
-                            color.blue,
-                            color.alpha);
-       cairo_rectangle(cr, 0, 0, 1, 1);
-       cairo_fill(cr);
-       cairo_destroy(cr);
-
-       blank_mask = gdk_pixbuf_get_from_surface(surf, 0, 0, 1, 1);
-       cairo_surface_destroy(surf);
-
-       cursor = gdk_cursor_new_from_pixbuf(gdk_window_get_display(root_window),
-                                           blank_mask, 0, 0);
-       g_object_unref(blank_mask);
-    }
-#else
     blank_mask = gdk_bitmap_create_from_data(root_window, blank_data, 1, 1);
     cursor = gdk_cursor_new_from_pixmap(blank_mask, blank_mask,
                                        &color, &color, 0, 0);
@@ -7242,6 +7204,28 @@ gui_mch_mousehide(int hide)
 
 #if defined(FEAT_MOUSESHAPE) || defined(PROTO)
 
+# if GTK_CHECK_VERSION(3,0,0)
+static const char * mshape_css_names[] =
+{
+    "default",                  // arrow aka GDK_LEFT_PTR
+    "blank",                    // blank aka GDK_CURSOR_IS_PIXMAP
+    "text",                     // beam aka GDK_XTERM
+    "ns-resize",                // updown aka GDK_SB_V_DOUBLE_ARROW
+    "nwse-resize",              // udsizing aka GDK_SIZING
+    "ew-resize",                // leftright aka GDK_SB_H_DOUBLE_ARROW
+    "ew-resize",                // lrsizing aka GDK_SIZING
+    "progress",                 // busy aka GDK_WATCH
+    "not-allowed",              // no aka GDK_X_CURSOR
+    "crosshair",                // crosshair aka GDK_CROSSHAIR
+    "pointer",                  // hand1 aka GDK_HAND1
+    "pointer",                  // hand2 aka GDK_HAND2
+    "default",                  // pencil aka GDK_PENCIL (no css analogue)
+    "help",                     // question aka GDK_QUESTION_ARROW
+    "default",                  // right-arrow aka GDK_RIGHT_PTR (no css analogue)
+    "default",                  // up-arrow aka GDK_CENTER_PTR (no css analogue)
+    "default"                   // GDK_LEFT_PTR (no css analogue)
+};
+# else
 // Table for shape IDs.  Keep in sync with the mshape_names[] table in
 // misc2.c!
 static const int mshape_ids[] =
@@ -7264,12 +7248,17 @@ static const int mshape_ids[] =
     GDK_CENTER_PTR,            // up-arrow
     GDK_LEFT_PTR               // last one
 };
+# endif // GTK_CHECK_VERSION(3,0,0)
 
     void
 mch_set_mouse_shape(int shape)
 {
-    int                   id;
     GdkCursor     *c;
+    int                   id;                    // Only id or css_name is used.
+# if GTK_CHECK_VERSION(3,0,0)
+    const char     *css_name = "default";
+    GdkDisplay     *disp;
+# endif
 
     if (gtk_widget_get_window(gui.drawarea) == NULL)
        return;
@@ -7287,12 +7276,22 @@ mch_set_mouse_shape(int shape)
            else
                id &= ~1;       // they are always even (why?)
        }
+# if GTK_CHECK_VERSION(3,0,0)
+       else if (shape < (int)ARRAY_LENGTH(mshape_css_names))
+           css_name = mshape_css_names[shape];
+# else
        else if (shape < (int)ARRAY_LENGTH(mshape_ids))
            id = mshape_ids[shape];
+# endif
        else
            return;
+# if GTK_CHECK_VERSION(3,0,0)
+       disp = gtk_widget_get_display(gui.drawarea);
+       c = gdk_cursor_new_from_name(disp, css_name);
+# else
        c = gdk_cursor_new_for_display(
                gtk_widget_get_display(gui.drawarea), (GdkCursorType)id);
+# endif
        gdk_window_set_cursor(gtk_widget_get_window(gui.drawarea), c);
 # if GTK_CHECK_VERSION(3,0,0)
        g_object_unref(G_OBJECT(c));
index 721007330cfb7ecf4bfba9893f93baba12174e0c..0805703fa004dfa65a5eacd4407ac581b31df67e 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1368,
 /**/
     1367,
 /**/