From bb89b92a98e88b4546018df5bbb7a20b9374203d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Br=C3=BCschweiler?= Date: Thu, 22 Oct 2009 11:05:27 +0200 Subject: [PATCH] curses: start support for mouse events --- extra/curses/curses.factor | 32 ++++++++++++++++++++++++++++++++ extra/curses/ffi/ffi.factor | 24 +++++++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/extra/curses/curses.factor b/extra/curses/curses.factor index 895fa52eb7..4d4a714eaa 100644 --- a/extra/curses/curses.factor +++ b/extra/curses/curses.factor @@ -136,6 +136,38 @@ CONSTANT: KEY_EVENT OCT: 633 /* We were interrupted by an event */ CONSTANT: KEY_F0 OCT: 410 /* Function keys. Space for 64 */ : KEY_F ( n -- code ) KEY_F0 + ; inline /* Value of function key n */ +: BUTTON1_RELEASED ( -- mask ) 1 ffi:NCURSES_BUTTON_RELEASED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON1_PRESSED ( -- mask ) 1 ffi:NCURSES_BUTTON_PRESSED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON1_CLICKED ( -- mask ) 1 ffi:NCURSES_BUTTON_CLICKED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON1_DOUBLE_CLICKED ( -- mask ) 1 ffi:NCURSES_DOUBLE_CLICKED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON1_TRIPLE_CLICKED ( -- mask ) 1 ffi:NCURSES_TRIPLE_CLICKED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON2_RELEASED ( -- mask ) 2 ffi:NCURSES_BUTTON_RELEASED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON2_PRESSED ( -- mask ) 2 ffi:NCURSES_BUTTON_PRESSED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON2_CLICKED ( -- mask ) 2 ffi:NCURSES_BUTTON_CLICKED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON2_DOUBLE_CLICKED ( -- mask ) 2 ffi:NCURSES_DOUBLE_CLICKED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON2_TRIPLE_CLICKED ( -- mask ) 2 ffi:NCURSES_TRIPLE_CLICKED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON3_RELEASED ( -- mask ) 3 ffi:NCURSES_BUTTON_RELEASED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON3_PRESSED ( -- mask ) 3 ffi:NCURSES_BUTTON_PRESSED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON3_CLICKED ( -- mask ) 3 ffi:NCURSES_BUTTON_CLICKED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON3_DOUBLE_CLICKED ( -- mask ) 3 ffi:NCURSES_DOUBLE_CLICKED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON3_TRIPLE_CLICKED ( -- mask ) 3 ffi:NCURSES_TRIPLE_CLICKED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON4_RELEASED ( -- mask ) 4 ffi:NCURSES_BUTTON_RELEASED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON4_PRESSED ( -- mask ) 4 ffi:NCURSES_BUTTON_PRESSED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON4_CLICKED ( -- mask ) 4 ffi:NCURSES_BUTTON_CLICKED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON4_DOUBLE_CLICKED ( -- mask ) 4 ffi:NCURSES_DOUBLE_CLICKED ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON4_TRIPLE_CLICKED ( -- mask ) 4 ffi:NCURSES_TRIPLE_CLICKED ffi:NCURSES_MOUSE_MASK ; inline + +: BUTTON1_RESERVED_EVENT ( -- mask ) 1 ffi:NCURSES_RESERVED_EVENT ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON2_RESERVED_EVENT ( -- mask ) 2 ffi:NCURSES_RESERVED_EVENT ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON3_RESERVED_EVENT ( -- mask ) 3 ffi:NCURSES_RESERVED_EVENT ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON4_RESERVED_EVENT ( -- mask ) 4 ffi:NCURSES_RESERVED_EVENT ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON_CTRL ( -- mask ) 5 OCT: 01 ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON_SHIFT ( -- mask ) 5 OCT: 02 ffi:NCURSES_MOUSE_MASK ; inline +: BUTTON_ALT ( -- mask ) 5 OCT: 04 ffi:NCURSES_MOUSE_MASK ; inline +: REPORT_MOUSE_POSITION ( -- mask ) 5 OCT: 10 ffi:NCURSES_MOUSE_MASK ; inline + +: ALL_MOUSE_EVENTS ( -- mask ) REPORT_MOUSE_POSITION 1 - ; inline + ERROR: curses-failed ; ERROR: unsupported-curses-terminal ; diff --git a/extra/curses/ffi/ffi.factor b/extra/curses/ffi/ffi.factor index 591c8c820a..2941f66765 100644 --- a/extra/curses/ffi/ffi.factor +++ b/extra/curses/ffi/ffi.factor @@ -18,6 +18,7 @@ TYPEDEF: uint chtype TYPEDEF: chtype attr_t TYPEDEF: short NCURSES_SIZE_T TYPEDEF: ushort wchar_t +TYPEDEF: ulong mmask_t CONSTANT: CCHARW_MAX 5 @@ -76,6 +77,11 @@ STRUCT: c-window { _bkgrnd cchar_t } ; +STRUCT: MEVENT + { id short } + { x int } { y int } { z int } + { bstate mmask_t } ; + LIBRARY: curses C-GLOBAL: void* stdscr @@ -180,7 +186,6 @@ FUNCTION: int vw_printw ( WINDOW* win, c-string fmt, va_list varglist ) ; FUNCTION: int move ( int y, int x ) ; FUNCTION: int wmove ( WINDOW* win, int y, int x ) ; - FUNCTION: int scroll ( WINDOW* win ) ; FUNCTION: int scrl ( int n ) ; FUNCTION: int wscrl ( WINDOW* win, int n ) ; @@ -252,3 +257,20 @@ C-GLOBAL: int COLOR_PAIRS FUNCTION: int wattron ( WINDOW* win, int attrs ) ; FUNCTION: int wattroff ( WINDOW* win, int attrs ) ; FUNCTION: int wattrset ( WINDOW* win, int attrs ) ; + +: NCURSES_MOUSE_MASK ( b m -- mask ) swap 1 - 5 * shift ; inline + +CONSTANT: NCURSES_BUTTON_RELEASED OCT: 01 +CONSTANT: NCURSES_BUTTON_PRESSED OCT: 02 +CONSTANT: NCURSES_BUTTON_CLICKED OCT: 04 +CONSTANT: NCURSES_DOUBLE_CLICKED OCT: 10 +CONSTANT: NCURSES_TRIPLE_CLICKED OCT: 20 +CONSTANT: NCURSES_RESERVED_EVENT OCT: 40 + +FUNCTION: int getmouse ( MEVENT* event ) ; +FUNCTION: int ungetmouse ( MEVENT* event ) ; +FUNCTION: mmask_t mousemask ( mmask_t newmask, mmask_t* oldmask ) ; +FUNCTION: bool wenclose ( WINDOW* win, int y, int x ) ; +FUNCTION: bool mouse_trafo ( int* pY, int* pX, bool to_screen ) ; +FUNCTION: bool wmouse_trafo ( WINDOW* win, int* pY, int* pX, bool to_screen ) ; +FUNCTION: int mouseinterval ( int erval ) ;