emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 5079f42446: Add support for changing pointer types on Haiku


From: Po Lu
Subject: master 5079f42446: Add support for changing pointer types on Haiku
Date: Wed, 11 May 2022 08:41:26 -0400 (EDT)

branch: master
commit 5079f42446aab520e20aad30f825ccbc448ba4e3
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Add support for changing pointer types on Haiku
    
    * doc/lispref/frames.texi (Pointer Shape): Document that the
    pointer shape can now be changed on some window systems other
    than X.
    
    * lisp/term/haiku-win.el (x-pointer-X-cursor, x-pointer-arrow)
    (x-pointer-bottom-left-corner, x-pointer-bottom-right-corner)
    (x-pointer-bottom-side, x-pointer-clock, x-pointer-cross)
    (x-pointer-cross-reverse, x-pointer-crosshair)
    (x-pointer-diamond-cross, x-pointer-hand1, x-pointer-hand2)
    (x-pointer-left-side, x-pointer-right-side)
    (x-pointer-sb-down-arrow, x-pointer-sb-left-arrow)
    (x-pointer-sb-right-arrow, x-pointer-sb-up-arrow, x-pointer-target)
    (x-pointer-top-left-corner, x-pointer-top-right-corner)
    (x-pointer-top-side, x-pointer-watch, x-pointer-invisible): New
    pointer constants.
    
    * src/haiku_support.cc (BCursor_from_id): Accept int instead of
    enum.
    * src/haiku_support.h: Update prototypes.
    
    * src/haikufns.c (haiku_create_frame): Stop manually assigning
    cursors and set default value of the mouse color property.
    (haiku_free_frame_resources): Free custom cursors too.
    (struct user_cursor_info, INIT_USER_CURSOR): New struct.
    (haiku_free_custom_cursors): New function.
    (haiku_set_mouse_color): New param handler.
    (haiku_frame_parm_handlers): Add param handler.
    (syms_of_haikufns): New cursor shape variables from X.
    
    * src/haikuterm.h: Update prototypes.
---
 doc/lispref/frames.texi |   5 +-
 lisp/term/haiku-win.el  |  31 +++++++++
 src/haiku_support.cc    |   2 +-
 src/haiku_support.h     |   2 +-
 src/haikufns.c          | 173 ++++++++++++++++++++++++++++++++++++++++--------
 src/haikuterm.h         |   1 +
 6 files changed, 184 insertions(+), 30 deletions(-)

diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi
index 05c6e4b719..3bbeef005b 100644
--- a/doc/lispref/frames.texi
+++ b/doc/lispref/frames.texi
@@ -3877,8 +3877,9 @@ in the buffer.  The default is to use the @code{arrow} 
(non-text)
 pointer style.
 @end defopt
 
-  When using X, you can specify what the @code{text} pointer style
-really looks like by setting the variable @code{x-pointer-shape}.
+  When using some window systems, you can specify what the @code{text}
+pointer style really looks like by setting the variable
+@code{x-pointer-shape}.
 
 @defvar x-pointer-shape
 This variable specifies the pointer shape to use ordinarily in the
diff --git a/lisp/term/haiku-win.el b/lisp/term/haiku-win.el
index 6396779d60..7f3bba52e5 100644
--- a/lisp/term/haiku-win.el
+++ b/lisp/term/haiku-win.el
@@ -392,6 +392,37 @@ take effect on menu items until the menu bar is updated 
again."
     ;; the Deskbar will not, so kill ourself here.
     (unless cancel-shutdown (kill-emacs))))
 
+
+;;;; Cursors.
+
+;; We use the same interface as X, but the cursor numbers are
+;; different, and there are also less cursors.
+
+(defconst x-pointer-X-cursor 5)                        ; B_CURSOR_ID_CROSS_HAIR
+(defconst x-pointer-arrow 1)                   ; B_CURSOR_ID_SYSTEM_DEFAULT
+(defconst x-pointer-bottom-left-corner 22)     ; B_CURSOR_ID_RESIZE_SOUTH_WEST
+(defconst x-pointer-bottom-right-corner 21)    ; B_CURSOR_ID_RESIZE_SOUTH_EAST
+(defconst x-pointer-bottom-side 17)            ; B_CURSOR_ID_RESIZE_SOUTH
+(defconst x-pointer-clock 14)                  ; B_CURSOR_ID_PROGRESS
+(defconst x-pointer-cross 5)                   ; B_CURSOR_ID_CROSS_HAIR
+(defconst x-pointer-cross-reverse 5)           ; B_CURSOR_ID_CROSS_HAIR
+(defconst x-pointer-crosshair 5)               ; B_CURSOR_ID_CROSS_HAIR
+(defconst x-pointer-diamond-cross 5)           ; B_CURSOR_ID_CROSS_HAIR
+(defconst x-pointer-hand1 7)                   ; B_CURSOR_ID_GRAB
+(defconst x-pointer-hand2 8)                   ; B_CURSOR_ID_GRABBING
+(defconst x-pointer-left-side 18)              ; B_CURSOR_ID_RESIZE_WEST
+(defconst x-pointer-right-side 16)             ; B_CURSOR_ID_RESIZE_EAST
+(defconst x-pointer-sb-down-arrow 17)          ; B_CURSOR_ID_RESIZE_SOUTH
+(defconst x-pointer-sb-left-arrow 18)          ; B_CURSOR_ID_RESIZE_WEST
+(defconst x-pointer-sb-right-arrow 16)         ; B_CURSOR_ID_RESIZE_EAST
+(defconst x-pointer-sb-up-arrow 16)            ; B_CURSOR_ID_RESIZE_NORTH
+(defconst x-pointer-target 5)                  ; B_CURSOR_ID_CROSS_HAIR
+(defconst x-pointer-top-left-corner 20)                ; 
B_CURSOR_ID_RESIZE_NORTH_WEST
+(defconst x-pointer-top-right-corner 19)       ; B_CURSOR_ID_RESIZE_NORTH_EAST
+(defconst x-pointer-top-side 16)               ; B_CURSOR_ID_RESIZE_NORTH
+(defconst x-pointer-watch 14)                  ; B_CURSOR_ID_PROGRESS
+(defconst x-pointer-invisible 12)              ; B_CURSOR_ID_NO_CURSOR
+
 (provide 'haiku-win)
 (provide 'term/haiku-win)
 
diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index 6caf8049d1..39e8daa826 100644
--- a/src/haiku_support.cc
+++ b/src/haiku_support.cc
@@ -3392,7 +3392,7 @@ BCursor_create_modeline (void)
 }
 
 void *
-BCursor_from_id (enum haiku_cursor cursor)
+BCursor_from_id (int cursor)
 {
   return new BCursor ((enum BCursorID) cursor);
 }
diff --git a/src/haiku_support.h b/src/haiku_support.h
index 416c717546..3ea6e838d7 100644
--- a/src/haiku_support.h
+++ b/src/haiku_support.h
@@ -557,7 +557,7 @@ extern void be_get_screen_dimensions (int *, int *);
 
 /* Functions for creating and freeing cursors.  */
 extern void *BCursor_create_default (void);
-extern void *BCursor_from_id (enum haiku_cursor);
+extern void *BCursor_from_id (int);
 extern void *BCursor_create_modeline (void);
 extern void *BCursor_create_i_beam (void);
 extern void *BCursor_create_progress_cursor (void);
diff --git a/src/haikufns.c b/src/haikufns.c
index 8596317de2..0abb418895 100644
--- a/src/haikufns.c
+++ b/src/haikufns.c
@@ -763,6 +763,8 @@ haiku_create_frame (Lisp_Object parms)
                          "foreground", "Foreground", RES_TYPE_STRING);
   gui_default_parameter (f, parms, Qbackground_color, build_string ("white"),
                          "background", "Background", RES_TYPE_STRING);
+  gui_default_parameter (f, parms, Qmouse_color, build_string ("black"),
+                         "pointerColor", "Foreground", RES_TYPE_STRING);
   gui_default_parameter (f, parms, Qline_spacing, Qnil,
                          "lineSpacing", "LineSpacing", RES_TYPE_NUMBER);
   gui_default_parameter (f, parms, Qleft_fringe, Qnil,
@@ -820,33 +822,11 @@ haiku_create_frame (Lisp_Object parms)
                              RES_TYPE_BOOLEAN);
   f->no_split = minibuffer_only || (!EQ (tem, Qunbound) && !NILP (tem));
 
-  block_input ();
-#define ASSIGN_CURSOR(cursor) \
-  (FRAME_OUTPUT_DATA (f)->cursor = dpyinfo->cursor)
-
-  ASSIGN_CURSOR (text_cursor);
-  ASSIGN_CURSOR (nontext_cursor);
-  ASSIGN_CURSOR (modeline_cursor);
-  ASSIGN_CURSOR (hand_cursor);
-  ASSIGN_CURSOR (hourglass_cursor);
-  ASSIGN_CURSOR (horizontal_drag_cursor);
-  ASSIGN_CURSOR (vertical_drag_cursor);
-  ASSIGN_CURSOR (left_edge_cursor);
-  ASSIGN_CURSOR (top_left_corner_cursor);
-  ASSIGN_CURSOR (top_edge_cursor);
-  ASSIGN_CURSOR (top_right_corner_cursor);
-  ASSIGN_CURSOR (right_edge_cursor);
-  ASSIGN_CURSOR (bottom_right_corner_cursor);
-  ASSIGN_CURSOR (bottom_edge_cursor);
-  ASSIGN_CURSOR (bottom_left_corner_cursor);
-  ASSIGN_CURSOR (no_cursor);
-
-  FRAME_OUTPUT_DATA (f)->current_cursor = dpyinfo->text_cursor;
-#undef ASSIGN_CURSOR
-
   f->terminal->reference_count++;
 
-  FRAME_OUTPUT_DATA (f)->window = BWindow_new (&FRAME_OUTPUT_DATA (f)->view);
+  block_input ();
+  FRAME_OUTPUT_DATA (f)->window
+    = BWindow_new (&FRAME_OUTPUT_DATA (f)->view);
   unblock_input ();
 
   if (!FRAME_OUTPUT_DATA (f)->window)
@@ -1567,6 +1547,7 @@ haiku_free_frame_resources (struct frame *f)
   dpyinfo = FRAME_DISPLAY_INFO (f);
 
   free_frame_faces (f);
+  haiku_free_custom_cursors (f);
 
   /* Free scroll bars */
   for (bar = FRAME_SCROLL_BARS (f); !NILP (bar); bar = b->next)
@@ -1792,6 +1773,133 @@ haiku_set_sticky (struct frame *f, Lisp_Object 
new_value,
   unblock_input ();
 }
 
+struct user_cursor_info
+{
+  /* A pointer to the Lisp_Object describing the cursor.  */
+  Lisp_Object *lisp_cursor;
+
+  /* The offset of the cursor in the `struct haiku_output' of each
+     frame.  */
+  ptrdiff_t output_offset;
+
+  /* The offset of the default value of the cursor in the display
+     info structure.  */
+  ptrdiff_t default_offset;
+};
+
+#define INIT_USER_CURSOR(lisp, cursor)                 \
+  { (lisp), offsetof (struct haiku_output, cursor),    \
+      offsetof (struct haiku_display_info, cursor) }
+
+struct user_cursor_info custom_cursors[] =
+  {
+    INIT_USER_CURSOR (&Vx_pointer_shape,               text_cursor),
+    INIT_USER_CURSOR (NULL,                            nontext_cursor),
+    INIT_USER_CURSOR (NULL,                            modeline_cursor),
+    INIT_USER_CURSOR (&Vx_sensitive_text_pointer_shape,        hand_cursor),
+    INIT_USER_CURSOR (&Vx_hourglass_pointer_shape,     hourglass_cursor),
+    INIT_USER_CURSOR (NULL,                            horizontal_drag_cursor),
+    INIT_USER_CURSOR (NULL,                            vertical_drag_cursor),
+    INIT_USER_CURSOR (NULL,                            left_edge_cursor),
+    INIT_USER_CURSOR (NULL,                            top_left_corner_cursor),
+    INIT_USER_CURSOR (NULL,                            top_edge_cursor),
+    INIT_USER_CURSOR (NULL,                            
top_right_corner_cursor),
+    INIT_USER_CURSOR (NULL,                            right_edge_cursor),
+    INIT_USER_CURSOR (NULL,                            
bottom_right_corner_cursor),
+    INIT_USER_CURSOR (NULL,                            bottom_edge_cursor),
+    INIT_USER_CURSOR (NULL,                            
bottom_left_corner_cursor),
+    INIT_USER_CURSOR (NULL,                            no_cursor),
+  };
+
+/* Free all cursors not default in F.  */
+void
+haiku_free_custom_cursors (struct frame *f)
+{
+  struct user_cursor_info *cursor;
+  struct haiku_output *output;
+  struct haiku_display_info *dpyinfo;
+  Emacs_Cursor *frame_cursor;
+  Emacs_Cursor *display_cursor;
+  int i;
+
+  output = FRAME_OUTPUT_DATA (f);
+  dpyinfo = FRAME_DISPLAY_INFO (f);
+
+  for (i = 0; i < ARRAYELTS (custom_cursors); ++i)
+    {
+      cursor = &custom_cursors[i];
+      frame_cursor = (Emacs_Cursor *) ((char *) output
+                                      + cursor->output_offset);
+      display_cursor = (Emacs_Cursor *) ((char *) dpyinfo
+                                        + cursor->default_offset);
+
+      if (*frame_cursor != *display_cursor
+         && *frame_cursor)
+       {
+         BCursor_delete (*frame_cursor);
+
+         if (output->current_cursor == *frame_cursor)
+           output->current_cursor = *display_cursor;
+       }
+
+      *frame_cursor = *display_cursor;
+    }
+}
+
+static void
+haiku_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
+{
+  struct haiku_output *output;
+  Emacs_Cursor *frame_cursor, old;
+  int i, n;
+
+  output = FRAME_OUTPUT_DATA (f);
+
+  /* This will also reset all the cursors back to their default
+     values.  */
+  haiku_free_custom_cursors (f);
+
+  for (i = 0; i < ARRAYELTS (custom_cursors); ++i)
+    {
+      frame_cursor = (Emacs_Cursor *) ((char *) output
+                                      + custom_cursors[i].output_offset);
+      old = *frame_cursor;
+
+      if (custom_cursors[i].lisp_cursor
+         && FIXNUMP (*custom_cursors[i].lisp_cursor))
+       {
+         if (!RANGED_FIXNUMP (0, *custom_cursors[i].lisp_cursor,
+                              28)) /* 28 is the largest Haiku cursor ID.  */
+           signal_error ("Invalid cursor",
+                         *custom_cursors[i].lisp_cursor);
+
+         n = XFIXNUM (*custom_cursors[i].lisp_cursor);
+
+         /* Create and set the custom cursor.  */
+         block_input ();
+         *frame_cursor = BCursor_from_id (n);
+         unblock_input ();
+
+         /* This function can be called before the frame's window is
+            created.  */
+         if (FRAME_HAIKU_WINDOW (f))
+           {
+             if (output->current_cursor == old)
+               {
+                 output->current_cursor = *frame_cursor;
+
+                 block_input ();
+                 BView_set_view_cursor (FRAME_HAIKU_VIEW (f),
+                                        *frame_cursor);
+                 unblock_input ();
+               }
+           }
+       }
+    }
+
+  update_face_from_frame_parameter (f, Qmouse_color, arg);
+}
+
 
 
 DEFUN ("haiku-set-mouse-absolute-pixel-position",
@@ -2701,7 +2809,7 @@ frame_parm_handler haiku_frame_parm_handlers[] =
     gui_set_right_divider_width,
     gui_set_bottom_divider_width,
     haiku_set_menu_bar_lines,
-    NULL, /* set mouse color */
+    haiku_set_mouse_color,
     haiku_explicitly_set_name,
     gui_set_scroll_bar_width,
     gui_set_scroll_bar_height,
@@ -2805,6 +2913,19 @@ syms_of_haikufns (void)
               doc: /* SKIP: real doc in xfns.c.  */);
   Vx_cursor_fore_pixel = Qnil;
 
+  DEFVAR_LISP ("x-pointer-shape", Vx_pointer_shape,
+              doc: /* SKIP: real doc in xfns.c.  */);
+  Vx_pointer_shape = Qnil;
+
+  DEFVAR_LISP ("x-hourglass-pointer-shape", Vx_hourglass_pointer_shape,
+              doc: /* SKIP: real doc in xfns.c.  */);
+  Vx_hourglass_pointer_shape = Qnil;
+
+  DEFVAR_LISP ("x-sensitive-text-pointer-shape",
+              Vx_sensitive_text_pointer_shape,
+              doc: /* SKIP: real doc in xfns.c.  */);
+  Vx_sensitive_text_pointer_shape = Qnil;
+
   DEFVAR_LISP ("haiku-allowed-ui-colors", Vhaiku_allowed_ui_colors,
               doc: /* Vector of UI colors that Emacs can look up from the 
system.
 If this is set up incorrectly, Emacs can crash when encoutering an
diff --git a/src/haikuterm.h b/src/haikuterm.h
index cc032d0389..4b124a6ba3 100644
--- a/src/haikuterm.h
+++ b/src/haikuterm.h
@@ -304,6 +304,7 @@ extern void haiku_set_cursor_type (struct frame *, 
Lisp_Object, Lisp_Object);
 extern void haiku_set_internal_border_width (struct frame *, Lisp_Object, 
Lisp_Object);
 extern void haiku_change_tab_bar_height (struct frame *, int);
 extern void haiku_change_tool_bar_height (struct frame *, int);
+extern void haiku_free_custom_cursors (struct frame *);
 
 extern void haiku_query_color (uint32_t, Emacs_Color *);
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]