aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2022-05-11 12:40:32 +0000
committerPo Lu2022-05-11 12:40:53 +0000
commit5079f42446aab520e20aad30f825ccbc448ba4e3 (patch)
tree68972443171942d16b5c9880dc7833e348ff5954 /src
parent125cda74981fddf63f827f96844cf6d9a413aa1a (diff)
downloademacs-5079f42446aab520e20aad30f825ccbc448ba4e3.tar.gz
emacs-5079f42446aab520e20aad30f825ccbc448ba4e3.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/haiku_support.cc2
-rw-r--r--src/haiku_support.h2
-rw-r--r--src/haikufns.c173
-rw-r--r--src/haikuterm.h1
4 files changed, 150 insertions, 28 deletions
diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index 6caf8049d1f..39e8daa8269 100644
--- a/src/haiku_support.cc
+++ b/src/haiku_support.cc
@@ -3392,7 +3392,7 @@ BCursor_create_modeline (void)
3392} 3392}
3393 3393
3394void * 3394void *
3395BCursor_from_id (enum haiku_cursor cursor) 3395BCursor_from_id (int cursor)
3396{ 3396{
3397 return new BCursor ((enum BCursorID) cursor); 3397 return new BCursor ((enum BCursorID) cursor);
3398} 3398}
diff --git a/src/haiku_support.h b/src/haiku_support.h
index 416c717546f..3ea6e838d7f 100644
--- a/src/haiku_support.h
+++ b/src/haiku_support.h
@@ -557,7 +557,7 @@ extern void be_get_screen_dimensions (int *, int *);
557 557
558/* Functions for creating and freeing cursors. */ 558/* Functions for creating and freeing cursors. */
559extern void *BCursor_create_default (void); 559extern void *BCursor_create_default (void);
560extern void *BCursor_from_id (enum haiku_cursor); 560extern void *BCursor_from_id (int);
561extern void *BCursor_create_modeline (void); 561extern void *BCursor_create_modeline (void);
562extern void *BCursor_create_i_beam (void); 562extern void *BCursor_create_i_beam (void);
563extern void *BCursor_create_progress_cursor (void); 563extern void *BCursor_create_progress_cursor (void);
diff --git a/src/haikufns.c b/src/haikufns.c
index 8596317de25..0abb4188955 100644
--- a/src/haikufns.c
+++ b/src/haikufns.c
@@ -763,6 +763,8 @@ haiku_create_frame (Lisp_Object parms)
763 "foreground", "Foreground", RES_TYPE_STRING); 763 "foreground", "Foreground", RES_TYPE_STRING);
764 gui_default_parameter (f, parms, Qbackground_color, build_string ("white"), 764 gui_default_parameter (f, parms, Qbackground_color, build_string ("white"),
765 "background", "Background", RES_TYPE_STRING); 765 "background", "Background", RES_TYPE_STRING);
766 gui_default_parameter (f, parms, Qmouse_color, build_string ("black"),
767 "pointerColor", "Foreground", RES_TYPE_STRING);
766 gui_default_parameter (f, parms, Qline_spacing, Qnil, 768 gui_default_parameter (f, parms, Qline_spacing, Qnil,
767 "lineSpacing", "LineSpacing", RES_TYPE_NUMBER); 769 "lineSpacing", "LineSpacing", RES_TYPE_NUMBER);
768 gui_default_parameter (f, parms, Qleft_fringe, Qnil, 770 gui_default_parameter (f, parms, Qleft_fringe, Qnil,
@@ -820,33 +822,11 @@ haiku_create_frame (Lisp_Object parms)
820 RES_TYPE_BOOLEAN); 822 RES_TYPE_BOOLEAN);
821 f->no_split = minibuffer_only || (!EQ (tem, Qunbound) && !NILP (tem)); 823 f->no_split = minibuffer_only || (!EQ (tem, Qunbound) && !NILP (tem));
822 824
823 block_input ();
824#define ASSIGN_CURSOR(cursor) \
825 (FRAME_OUTPUT_DATA (f)->cursor = dpyinfo->cursor)
826
827 ASSIGN_CURSOR (text_cursor);
828 ASSIGN_CURSOR (nontext_cursor);
829 ASSIGN_CURSOR (modeline_cursor);
830 ASSIGN_CURSOR (hand_cursor);
831 ASSIGN_CURSOR (hourglass_cursor);
832 ASSIGN_CURSOR (horizontal_drag_cursor);
833 ASSIGN_CURSOR (vertical_drag_cursor);
834 ASSIGN_CURSOR (left_edge_cursor);
835 ASSIGN_CURSOR (top_left_corner_cursor);
836 ASSIGN_CURSOR (top_edge_cursor);
837 ASSIGN_CURSOR (top_right_corner_cursor);
838 ASSIGN_CURSOR (right_edge_cursor);
839 ASSIGN_CURSOR (bottom_right_corner_cursor);
840 ASSIGN_CURSOR (bottom_edge_cursor);
841 ASSIGN_CURSOR (bottom_left_corner_cursor);
842 ASSIGN_CURSOR (no_cursor);
843
844 FRAME_OUTPUT_DATA (f)->current_cursor = dpyinfo->text_cursor;
845#undef ASSIGN_CURSOR
846
847 f->terminal->reference_count++; 825 f->terminal->reference_count++;
848 826
849 FRAME_OUTPUT_DATA (f)->window = BWindow_new (&FRAME_OUTPUT_DATA (f)->view); 827 block_input ();
828 FRAME_OUTPUT_DATA (f)->window
829 = BWindow_new (&FRAME_OUTPUT_DATA (f)->view);
850 unblock_input (); 830 unblock_input ();
851 831
852 if (!FRAME_OUTPUT_DATA (f)->window) 832 if (!FRAME_OUTPUT_DATA (f)->window)
@@ -1567,6 +1547,7 @@ haiku_free_frame_resources (struct frame *f)
1567 dpyinfo = FRAME_DISPLAY_INFO (f); 1547 dpyinfo = FRAME_DISPLAY_INFO (f);
1568 1548
1569 free_frame_faces (f); 1549 free_frame_faces (f);
1550 haiku_free_custom_cursors (f);
1570 1551
1571 /* Free scroll bars */ 1552 /* Free scroll bars */
1572 for (bar = FRAME_SCROLL_BARS (f); !NILP (bar); bar = b->next) 1553 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,
1792 unblock_input (); 1773 unblock_input ();
1793} 1774}
1794 1775
1776struct user_cursor_info
1777{
1778 /* A pointer to the Lisp_Object describing the cursor. */
1779 Lisp_Object *lisp_cursor;
1780
1781 /* The offset of the cursor in the `struct haiku_output' of each
1782 frame. */
1783 ptrdiff_t output_offset;
1784
1785 /* The offset of the default value of the cursor in the display
1786 info structure. */
1787 ptrdiff_t default_offset;
1788};
1789
1790#define INIT_USER_CURSOR(lisp, cursor) \
1791 { (lisp), offsetof (struct haiku_output, cursor), \
1792 offsetof (struct haiku_display_info, cursor) }
1793
1794struct user_cursor_info custom_cursors[] =
1795 {
1796 INIT_USER_CURSOR (&Vx_pointer_shape, text_cursor),
1797 INIT_USER_CURSOR (NULL, nontext_cursor),
1798 INIT_USER_CURSOR (NULL, modeline_cursor),
1799 INIT_USER_CURSOR (&Vx_sensitive_text_pointer_shape, hand_cursor),
1800 INIT_USER_CURSOR (&Vx_hourglass_pointer_shape, hourglass_cursor),
1801 INIT_USER_CURSOR (NULL, horizontal_drag_cursor),
1802 INIT_USER_CURSOR (NULL, vertical_drag_cursor),
1803 INIT_USER_CURSOR (NULL, left_edge_cursor),
1804 INIT_USER_CURSOR (NULL, top_left_corner_cursor),
1805 INIT_USER_CURSOR (NULL, top_edge_cursor),
1806 INIT_USER_CURSOR (NULL, top_right_corner_cursor),
1807 INIT_USER_CURSOR (NULL, right_edge_cursor),
1808 INIT_USER_CURSOR (NULL, bottom_right_corner_cursor),
1809 INIT_USER_CURSOR (NULL, bottom_edge_cursor),
1810 INIT_USER_CURSOR (NULL, bottom_left_corner_cursor),
1811 INIT_USER_CURSOR (NULL, no_cursor),
1812 };
1813
1814/* Free all cursors not default in F. */
1815void
1816haiku_free_custom_cursors (struct frame *f)
1817{
1818 struct user_cursor_info *cursor;
1819 struct haiku_output *output;
1820 struct haiku_display_info *dpyinfo;
1821 Emacs_Cursor *frame_cursor;
1822 Emacs_Cursor *display_cursor;
1823 int i;
1824
1825 output = FRAME_OUTPUT_DATA (f);
1826 dpyinfo = FRAME_DISPLAY_INFO (f);
1827
1828 for (i = 0; i < ARRAYELTS (custom_cursors); ++i)
1829 {
1830 cursor = &custom_cursors[i];
1831 frame_cursor = (Emacs_Cursor *) ((char *) output
1832 + cursor->output_offset);
1833 display_cursor = (Emacs_Cursor *) ((char *) dpyinfo
1834 + cursor->default_offset);
1835
1836 if (*frame_cursor != *display_cursor
1837 && *frame_cursor)
1838 {
1839 BCursor_delete (*frame_cursor);
1840
1841 if (output->current_cursor == *frame_cursor)
1842 output->current_cursor = *display_cursor;
1843 }
1844
1845 *frame_cursor = *display_cursor;
1846 }
1847}
1848
1849static void
1850haiku_set_mouse_color (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
1851{
1852 struct haiku_output *output;
1853 Emacs_Cursor *frame_cursor, old;
1854 int i, n;
1855
1856 output = FRAME_OUTPUT_DATA (f);
1857
1858 /* This will also reset all the cursors back to their default
1859 values. */
1860 haiku_free_custom_cursors (f);
1861
1862 for (i = 0; i < ARRAYELTS (custom_cursors); ++i)
1863 {
1864 frame_cursor = (Emacs_Cursor *) ((char *) output
1865 + custom_cursors[i].output_offset);
1866 old = *frame_cursor;
1867
1868 if (custom_cursors[i].lisp_cursor
1869 && FIXNUMP (*custom_cursors[i].lisp_cursor))
1870 {
1871 if (!RANGED_FIXNUMP (0, *custom_cursors[i].lisp_cursor,
1872 28)) /* 28 is the largest Haiku cursor ID. */
1873 signal_error ("Invalid cursor",
1874 *custom_cursors[i].lisp_cursor);
1875
1876 n = XFIXNUM (*custom_cursors[i].lisp_cursor);
1877
1878 /* Create and set the custom cursor. */
1879 block_input ();
1880 *frame_cursor = BCursor_from_id (n);
1881 unblock_input ();
1882
1883 /* This function can be called before the frame's window is
1884 created. */
1885 if (FRAME_HAIKU_WINDOW (f))
1886 {
1887 if (output->current_cursor == old)
1888 {
1889 output->current_cursor = *frame_cursor;
1890
1891 block_input ();
1892 BView_set_view_cursor (FRAME_HAIKU_VIEW (f),
1893 *frame_cursor);
1894 unblock_input ();
1895 }
1896 }
1897 }
1898 }
1899
1900 update_face_from_frame_parameter (f, Qmouse_color, arg);
1901}
1902
1795 1903
1796 1904
1797DEFUN ("haiku-set-mouse-absolute-pixel-position", 1905DEFUN ("haiku-set-mouse-absolute-pixel-position",
@@ -2701,7 +2809,7 @@ frame_parm_handler haiku_frame_parm_handlers[] =
2701 gui_set_right_divider_width, 2809 gui_set_right_divider_width,
2702 gui_set_bottom_divider_width, 2810 gui_set_bottom_divider_width,
2703 haiku_set_menu_bar_lines, 2811 haiku_set_menu_bar_lines,
2704 NULL, /* set mouse color */ 2812 haiku_set_mouse_color,
2705 haiku_explicitly_set_name, 2813 haiku_explicitly_set_name,
2706 gui_set_scroll_bar_width, 2814 gui_set_scroll_bar_width,
2707 gui_set_scroll_bar_height, 2815 gui_set_scroll_bar_height,
@@ -2805,6 +2913,19 @@ syms_of_haikufns (void)
2805 doc: /* SKIP: real doc in xfns.c. */); 2913 doc: /* SKIP: real doc in xfns.c. */);
2806 Vx_cursor_fore_pixel = Qnil; 2914 Vx_cursor_fore_pixel = Qnil;
2807 2915
2916 DEFVAR_LISP ("x-pointer-shape", Vx_pointer_shape,
2917 doc: /* SKIP: real doc in xfns.c. */);
2918 Vx_pointer_shape = Qnil;
2919
2920 DEFVAR_LISP ("x-hourglass-pointer-shape", Vx_hourglass_pointer_shape,
2921 doc: /* SKIP: real doc in xfns.c. */);
2922 Vx_hourglass_pointer_shape = Qnil;
2923
2924 DEFVAR_LISP ("x-sensitive-text-pointer-shape",
2925 Vx_sensitive_text_pointer_shape,
2926 doc: /* SKIP: real doc in xfns.c. */);
2927 Vx_sensitive_text_pointer_shape = Qnil;
2928
2808 DEFVAR_LISP ("haiku-allowed-ui-colors", Vhaiku_allowed_ui_colors, 2929 DEFVAR_LISP ("haiku-allowed-ui-colors", Vhaiku_allowed_ui_colors,
2809 doc: /* Vector of UI colors that Emacs can look up from the system. 2930 doc: /* Vector of UI colors that Emacs can look up from the system.
2810If this is set up incorrectly, Emacs can crash when encoutering an 2931If this is set up incorrectly, Emacs can crash when encoutering an
diff --git a/src/haikuterm.h b/src/haikuterm.h
index cc032d03892..4b124a6ba30 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);
304extern void haiku_set_internal_border_width (struct frame *, Lisp_Object, Lisp_Object); 304extern void haiku_set_internal_border_width (struct frame *, Lisp_Object, Lisp_Object);
305extern void haiku_change_tab_bar_height (struct frame *, int); 305extern void haiku_change_tab_bar_height (struct frame *, int);
306extern void haiku_change_tool_bar_height (struct frame *, int); 306extern void haiku_change_tool_bar_height (struct frame *, int);
307extern void haiku_free_custom_cursors (struct frame *);
307 308
308extern void haiku_query_color (uint32_t, Emacs_Color *); 309extern void haiku_query_color (uint32_t, Emacs_Color *);
309 310