aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/interface-curses/interface.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interface-curses/interface.c')
-rw-r--r--src/interface-curses/interface.c74
1 files changed, 65 insertions, 9 deletions
diff --git a/src/interface-curses/interface.c b/src/interface-curses/interface.c
index 9480822..3be1001 100644
--- a/src/interface-curses/interface.c
+++ b/src/interface-curses/interface.c
@@ -356,6 +356,7 @@ static struct {
GQueue *input_queue;
teco_curses_info_popup_t popup;
+ gsize popup_prefix_len;
/**
* GError "thrown" by teco_interface_event_loop_iter().
@@ -1480,7 +1481,7 @@ teco_interface_popup_add(teco_popup_entry_type_t type, const gchar *name, gsize
}
void
-teco_interface_popup_show(void)
+teco_interface_popup_show(gsize prefix_len)
{
if (!teco_interface.cmdline_window)
/* batch mode */
@@ -1489,9 +1490,21 @@ teco_interface_popup_show(void)
short fg = teco_rgb2curses(teco_interface_ssm(SCI_STYLEGETFORE, STYLE_CALLTIP, 0));
short bg = teco_rgb2curses(teco_interface_ssm(SCI_STYLEGETBACK, STYLE_CALLTIP, 0));
+ teco_interface.popup_prefix_len = prefix_len;
teco_curses_info_popup_show(&teco_interface.popup, SCI_COLOR_ATTR(fg, bg));
}
+void
+teco_interface_popup_scroll(void)
+{
+ if (!teco_interface.cmdline_window)
+ /* batch mode */
+ return;
+
+ teco_curses_info_popup_scroll_page(&teco_interface.popup);
+ teco_interface_popup_show(teco_interface.popup_prefix_len);
+}
+
gboolean
teco_interface_popup_is_shown(void)
{
@@ -1583,6 +1596,11 @@ teco_interface_refresh(void)
teco_view_noutrefresh(teco_interface_current_view);
wnoutrefresh(teco_interface.msg_window);
wnoutrefresh(teco_interface.cmdline_window);
+ /*
+ * FIXME: Why do we have to redrawwin() the popup window
+ * to keep it on the screen?
+ * Perhaps something is causing a redraw of the entire Scinterm view.
+ */
teco_curses_info_popup_noutrefresh(&teco_interface.popup);
doupdate();
}
@@ -1596,20 +1614,59 @@ teco_interface_refresh(void)
(BUTTON1_##X | BUTTON2_##X | BUTTON3_##X | BUTTON4_##X | BUTTON5_##X)
static gboolean
-teco_interface_getmouse(void)
+teco_interface_getmouse(GError **error)
{
MEVENT event;
- WINDOW *current = teco_view_get_window(teco_interface_current_view);
+
+ if (getmouse(&event) != OK)
+ return TRUE;
+
+ if (teco_curses_info_popup_is_shown(&teco_interface.popup) &&
+ wmouse_trafo(teco_interface.popup.window, &event.y, &event.x, FALSE)) {
+ /*
+ * NOTE: Not all curses variants report the RELEASED event,
+ * but may also return REPORT_MOUSE_POSITION.
+ * So we might react to all button presses as well.
+ */
+ if (event.bstate & (BUTTON1_RELEASED | REPORT_MOUSE_POSITION)) {
+ teco_machine_t *machine = &teco_cmdline.machine.parent;
+ const teco_string_t *insert = teco_curses_info_popup_getentry(&teco_interface.popup, event.y, event.x);
+
+ if (insert && machine->current->insert_completion_cb) {
+ /* successfully clicked popup item */
+ const teco_string_t insert_suffix = {insert->data + teco_interface.popup_prefix_len,
+ insert->len - teco_interface.popup_prefix_len};
+ if (!machine->current->insert_completion_cb(machine, &insert_suffix, error))
+ return FALSE;
+
+ teco_interface_popup_clear();
+ teco_interface_msg_clear();
+ teco_interface_cmdline_update(&teco_cmdline);
+ }
+
+ return TRUE;
+ }
+ if (event.bstate & BUTTON_NUM(4))
+ teco_curses_info_popup_scroll(&teco_interface.popup, -1);
+ else if (event.bstate & BUTTON_NUM(5))
+ teco_curses_info_popup_scroll(&teco_interface.popup, +1);
+
+ short fg = teco_rgb2curses(teco_interface_ssm(SCI_STYLEGETFORE, STYLE_CALLTIP, 0));
+ short bg = teco_rgb2curses(teco_interface_ssm(SCI_STYLEGETBACK, STYLE_CALLTIP, 0));
+ teco_curses_info_popup_show(&teco_interface.popup, SCI_COLOR_ATTR(fg, bg));
+
+ return TRUE;
+ }
/*
* Return mouse coordinates relative to the view.
* They will be in characters, but that's what SCI_POSITIONFROMPOINT
* expects on Scinterm anyway.
*/
- if (getmouse(&event) != OK ||
- !wmouse_trafo(current, &event.y, &event.x, FALSE))
+ WINDOW *current = teco_view_get_window(teco_interface_current_view);
+ if (!wmouse_trafo(current, &event.y, &event.x, FALSE))
/* no event inside of current view */
- return FALSE;
+ return TRUE;
/*
* NOTE: There will only be one of the button bits
@@ -1654,7 +1711,7 @@ teco_interface_getmouse(void)
if (event.bstate & BUTTON_ALT)
teco_mouse.mods |= TECO_MOUSE_ALT;
- return TRUE;
+ return teco_cmdline_keymacro("MOUSE", -1, error);
}
#endif /* NCURSES_MOUSE_VERSION >= 2 */
@@ -1789,8 +1846,7 @@ teco_interface_event_loop_iter(void)
#if NCURSES_MOUSE_VERSION >= 2
case KEY_MOUSE:
/* ANY of the mouse events */
- if (teco_interface_getmouse() &&
- !teco_cmdline_keymacro("MOUSE", -1, error))
+ if (!teco_interface_getmouse(error))
return;
break;
#endif