diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2025-02-15 01:32:05 +0300 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2025-02-23 04:52:39 +0300 |
commit | 428dafa568923d5632101c716fb20a3de35d27be (patch) | |
tree | 475b270fc384d5040e4711e155e47d580c52b1a3 /src/parser.h | |
parent | 980dcdaa138a42830af4e2533b7e970d7f5fa3cf (diff) | |
download | sciteco-428dafa568923d5632101c716fb20a3de35d27be.tar.gz |
support mouse interaction with popup windows
* Curses allows scrolling with the scroll wheel at least
if mouse support is enabled via ED flags.
Gtk always supported that.
* Allow clicking on popup entries to fully autocomplete them.
Since this behavior - just like auto completions - is parser state-dependant,
I introduced a new state method (insert_completion_cb).
All the implementations are currently in cmdline.c since there is some overlap
with the process_edit_cmd_cb implementations.
* Fixed pressing undefined function keys while showing the popup.
The popup area is no longer redrawn/replaced with the Scintilla view.
Instead, continue to show the popup.
Diffstat (limited to 'src/parser.h')
-rw-r--r-- | src/parser.h | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/src/parser.h b/src/parser.h index f8bae90..fe8e764 100644 --- a/src/parser.h +++ b/src/parser.h @@ -110,6 +110,7 @@ typedef gboolean (*teco_state_refresh_cb_t)(teco_machine_t *ctx, GError **error) typedef gboolean (*teco_state_end_of_macro_cb_t)(teco_machine_t *ctx, GError **error); typedef gboolean (*teco_state_process_edit_cmd_cb_t)(teco_machine_t *ctx, teco_machine_t *parent_ctx, gunichar key, GError **error); +typedef gboolean (*teco_state_insert_completion_cb_t)(teco_machine_t *ctx, const teco_string_t *str, GError **error); typedef enum { TECO_KEYMACRO_MASK_START = (1 << 0), @@ -187,6 +188,19 @@ struct teco_state_t { teco_state_process_edit_cmd_cb_t process_edit_cmd_cb; /** + * Insert completion after clicking an entry in the popup + * window. + * + * All implementations of this method are currently + * defined in cmdline.c. + * + * It can be NULL if not required. + * + * @fixme Perhaps move all implementations to interface.c. + */ + teco_state_insert_completion_cb_t insert_completion_cb; + + /** * Whether this state is a start state (i.e. not within any * escape sequence etc.). * This is separate of TECO_KEYMACRO_MASK_START which is set @@ -241,11 +255,12 @@ gboolean teco_state_process_edit_cmd(teco_machine_t *ctx, teco_machine_t *parent #define TECO_DEFINE_STATE(NAME, ...) \ /** @ingroup states */ \ teco_state_t NAME = { \ - .initial_cb = NULL, /* do nothing */ \ + .initial_cb = NULL, /* do nothing */ \ .input_cb = (teco_state_input_cb_t)NAME##_input, /* always required */ \ - .refresh_cb = NULL, /* do nothing */ \ + .refresh_cb = NULL, /* do nothing */ \ .end_of_macro_cb = teco_state_end_of_macro, \ .process_edit_cmd_cb = teco_state_process_edit_cmd, \ + .insert_completion_cb = NULL, /* do nothing */ \ .is_start = FALSE, \ .keymacro_mask = TECO_KEYMACRO_MASK_DEFAULT, \ .style = SCE_SCITECO_DEFAULT, \ @@ -552,7 +567,10 @@ teco_state_t *teco_state_expectstring_input(teco_machine_main_t *ctx, gunichar c gboolean teco_state_expectstring_refresh(teco_machine_main_t *ctx, GError **error); /* in cmdline.c */ -gboolean teco_state_expectstring_process_edit_cmd(teco_machine_main_t *ctx, teco_machine_t *parent_ctx, gunichar key, GError **error); +gboolean teco_state_expectstring_process_edit_cmd(teco_machine_main_t *ctx, teco_machine_t *parent_ctx, + gunichar key, GError **error); +gboolean teco_state_expectstring_insert_completion(teco_machine_main_t *ctx, const teco_string_t *str, + GError **error); /** * @interface TECO_DEFINE_STATE_EXPECTSTRING @@ -577,6 +595,8 @@ gboolean teco_state_expectstring_process_edit_cmd(teco_machine_main_t *ctx, teco .refresh_cb = (teco_state_refresh_cb_t)teco_state_expectstring_refresh, \ .process_edit_cmd_cb = (teco_state_process_edit_cmd_cb_t) \ teco_state_expectstring_process_edit_cmd, \ + .insert_completion_cb = (teco_state_insert_completion_cb_t) \ + teco_state_expectstring_insert_completion, \ .keymacro_mask = TECO_KEYMACRO_MASK_STRING, \ .style = SCE_SCITECO_STRING, \ .expectstring.string_building = TRUE, \ @@ -591,6 +611,7 @@ gboolean teco_state_expectfile_process(teco_machine_main_t *ctx, const teco_stri /* in cmdline.c */ gboolean teco_state_expectfile_process_edit_cmd(teco_machine_main_t *ctx, teco_machine_t *parent_ctx, gunichar key, GError **error); +gboolean teco_state_expectfile_insert_completion(teco_machine_main_t *ctx, const teco_string_t *str, GError **error); /** * @interface TECO_DEFINE_STATE_EXPECTFILE @@ -601,12 +622,15 @@ gboolean teco_state_expectfile_process_edit_cmd(teco_machine_main_t *ctx, teco_m TECO_DEFINE_STATE_EXPECTSTRING(NAME, \ .process_edit_cmd_cb = (teco_state_process_edit_cmd_cb_t) \ teco_state_expectfile_process_edit_cmd, \ + .insert_completion_cb = (teco_state_insert_completion_cb_t) \ + teco_state_expectfile_insert_completion, \ .expectstring.process_cb = teco_state_expectfile_process, \ ##__VA_ARGS__ \ ) /* in cmdline.c */ gboolean teco_state_expectdir_process_edit_cmd(teco_machine_main_t *ctx, teco_machine_t *parent_ctx, gunichar key, GError **error); +gboolean teco_state_expectdir_insert_completion(teco_machine_main_t *ctx, const teco_string_t *str, GError **error); /** * @interface TECO_DEFINE_STATE_EXPECTDIR @@ -617,5 +641,7 @@ gboolean teco_state_expectdir_process_edit_cmd(teco_machine_main_t *ctx, teco_ma TECO_DEFINE_STATE_EXPECTFILE(NAME, \ .process_edit_cmd_cb = (teco_state_process_edit_cmd_cb_t) \ teco_state_expectdir_process_edit_cmd, \ + .insert_completion_cb = (teco_state_insert_completion_cb_t) \ + teco_state_expectdir_insert_completion, \ ##__VA_ARGS__ \ ) |