diff options
-rw-r--r-- | configure.ac | 25 | ||||
-rw-r--r-- | src/interface-curses/curses-info-popup.c | 24 | ||||
-rw-r--r-- | src/interface-curses/curses-utils.c | 22 | ||||
-rw-r--r-- | src/interface-curses/curses-utils.h | 9 | ||||
-rw-r--r-- | src/interface-curses/interface.c | 26 |
5 files changed, 79 insertions, 27 deletions
diff --git a/configure.ac b/configure.ac index 9d5e059..7168ae2 100644 --- a/configure.ac +++ b/configure.ac @@ -247,7 +247,7 @@ if [[ x$LEXILLA_PATH != xno ]]; then fi AC_ARG_WITH(interface, - AS_HELP_STRING([--with-interface=ncurses|netbsd-curses|xcurses|pdcurses|pdcurses-gui|gtk], + AS_HELP_STRING([--with-interface=ncurses|netbsd-curses|xcurses|pdcurses|pdcurses-gui|pdcurses-x11|gtk], [Specify user interface [default=ncurses]]), [INTERFACE=$withval], [INTERFACE=ncurses]) @@ -299,6 +299,29 @@ case $INTERFACE in ;; xcurses) + # libcurses written by Mortice Kern Systems Inc. for Solaris and is nowadays + # available in OmniOS/Illumos. + AC_DEFINE(MKS_CURSES, 1, [Building against libcurses (MKS I/XCU 4.3 Curses)]) + + CFLAGS="$CFLAGS $CURSES_CFLAGS" + CXXFLAGS="$CXXFLAGS $CURSES_CFLAGS" + LIBS="$LIBS $CURSES_LIBS" + + if [[ "x$CURSES_LIBS" = "x" ]]; then + AC_CHECK_LIB(curses, __m_curses_version, , [ + AC_MSG_ERROR([libcurses (MKS I/XCU 4.3 Curses) missing!]) + ]) + else + AC_MSG_CHECKING([checking for libcurses (CURSES_LIBS)]) + AC_MSG_RESULT([$CURSES_LIBS]) + LIBS="$LIBS $CURSES_LIBS" + fi + + AC_CHECK_FUNCS([tigetstr]) + ;; + + pdcurses-x11) + # The X11 port of PDCurses is also known as XCurses. AC_CHECK_PROG(XCURSES_CONFIG, xcurses-config, xcurses-config) if [[ "x$CURSES_CFLAGS" = "x" -a "x$XCURSES_CONFIG" != "x" ]]; then diff --git a/src/interface-curses/curses-info-popup.c b/src/interface-curses/curses-info-popup.c index 332d434..13d8d65 100644 --- a/src/interface-curses/curses-info-popup.c +++ b/src/interface-curses/curses-info-popup.c @@ -23,6 +23,9 @@ #include <curses.h> +#undef lines +#undef buttons + #include "list.h" #include "string-utils.h" #include "interface.h" @@ -71,7 +74,8 @@ teco_curses_info_popup_add(teco_curses_info_popup_t *ctx, teco_popup_entry_type_ static void teco_curses_info_popup_init_pad(teco_curses_info_popup_t *ctx, attr_t attr) { - int cols = getmaxx(stdscr); /**! screen width */ + G_GNUC_UNUSED gint cols, rows; /**! screen size */ + getmaxyx(stdscr, rows, cols); int pad_lines; /**! pad height */ gint pad_cols; /**! entry columns */ gint pad_colwidth; /**! width per entry column */ @@ -165,7 +169,8 @@ teco_curses_info_popup_show(teco_curses_info_popup_t *ctx, attr_t attr) if (!ctx->pad) teco_curses_info_popup_init_pad(ctx, attr); - gint pad_lines = getmaxy(ctx->pad); + G_GNUC_UNUSED gint pad_cols, pad_lines; + getmaxyx(ctx->pad, pad_lines, pad_cols); /* * Popup window can cover all but one screen row. @@ -227,7 +232,8 @@ teco_curses_info_popup_show(teco_curses_info_popup_t *ctx, attr_t attr) const teco_string_t * teco_curses_info_popup_getentry(teco_curses_info_popup_t *ctx, gint y, gint x) { - int cols = getmaxx(stdscr); /**! screen width */ + G_GNUC_UNUSED gint lines, cols; /**! screen dimensions */ + getmaxyx(stdscr, lines, cols); gint pad_cols; /**! entry columns */ gint pad_colwidth; /**! width per entry column */ @@ -265,8 +271,10 @@ teco_curses_info_popup_getentry(teco_curses_info_popup_t *ctx, gint y, gint x) void teco_curses_info_popup_scroll_page(teco_curses_info_popup_t *ctx) { - gint lines = getmaxy(stdscr); - gint pad_lines = getmaxy(ctx->pad); + G_GNUC_UNUSED gint lines, cols; + getmaxyx(stdscr, lines, cols); + G_GNUC_UNUSED gint pad_lines, pad_cols; + getmaxyx(ctx->pad, pad_lines, pad_cols); gint popup_lines = MIN(pad_lines + 1, lines - 1); /* progress scroll position */ @@ -281,8 +289,10 @@ teco_curses_info_popup_scroll_page(teco_curses_info_popup_t *ctx) void teco_curses_info_popup_scroll(teco_curses_info_popup_t *ctx, gint delta) { - gint lines = getmaxy(stdscr); - gint pad_lines = getmaxy(ctx->pad); + G_GNUC_UNUSED gint lines, cols; + getmaxyx(stdscr, lines, cols); + G_GNUC_UNUSED gint pad_lines, pad_cols; + getmaxyx(ctx->pad, pad_lines, pad_cols); gint popup_lines = MIN(pad_lines + 1, lines - 1); ctx->pad_first_line = MAX(ctx->pad_first_line+delta, 0); diff --git a/src/interface-curses/curses-utils.c b/src/interface-curses/curses-utils.c index f94b6dc..39d9b3f 100644 --- a/src/interface-curses/curses-utils.c +++ b/src/interface-curses/curses-utils.c @@ -59,11 +59,12 @@ teco_curses_format_str(WINDOW *win, const gchar *str, gsize len, gint max_width) short pair = 0; wattr_get(win, &attrs, &pair, NULL); - int old_x, old_y; + G_GNUC_UNUSED gint old_x, old_y, max_x, max_y; getyx(win, old_y, old_x); + getmaxyx(win, max_y, max_x); if (max_width < 0) - max_width = getmaxx(win) - old_x; + max_width = max_x - old_x; while (len > 0) { /* @@ -133,7 +134,9 @@ teco_curses_format_str(WINDOW *win, const gchar *str, gsize len, gint max_width) len -= clen; } - return getcurx(win) - old_x; + G_GNUC_UNUSED gint cur_x, cur_y; + getyx(win, cur_y, cur_x); + return cur_x - old_x; truncate: if (max_width >= truncate_len) { @@ -153,7 +156,8 @@ truncate: } } - return getcurx(win) - old_x; + getyx(win, cur_y, cur_x); + return cur_x - old_x; } /** @@ -174,13 +178,15 @@ guint teco_curses_format_filename(WINDOW *win, const gchar *filename, gint max_width) { gint truncate_len = teco_ed & TECO_ED_ICONS ? 1 : 3; - int old_x = getcurx(win); + G_GNUC_UNUSED gint old_x, old_y, max_x, max_y; + getyx(win, old_y, old_x); + getmaxyx(win, max_y, max_x); g_autofree gchar *filename_printable = teco_string_echo(filename, strlen(filename)); glong filename_len = g_utf8_strlen(filename_printable, -1); if (max_width < 0) - max_width = getmaxx(win) - old_x; + max_width = max_x - old_x; if (filename_len <= max_width) { /* @@ -217,5 +223,7 @@ teco_curses_format_filename(WINDOW *win, const gchar *filename, gint max_width) waddstr(win, keep_post); } - return getcurx(win) - old_x; + G_GNUC_UNUSED gint cur_x, cur_y; + getyx(win, cur_y, cur_x); + return cur_x - old_x; } diff --git a/src/interface-curses/curses-utils.h b/src/interface-curses/curses-utils.h index 18cdd3d..407380a 100644 --- a/src/interface-curses/curses-utils.h +++ b/src/interface-curses/curses-utils.h @@ -44,10 +44,11 @@ teco_curses_add_wc(WINDOW *win, gunichar chr) static inline void teco_curses_clrtobot(WINDOW *win) { - int max_x, max_y; + int cur_x, cur_y, max_x, max_y; + getyx(win, cur_y, cur_x); getmaxyx(win, max_y, max_x); - if (getcurx(win)+1 < max_x) - whline(win, ' ', max_x - getcurx(win)); - for (int y = getcury(win)+1; y <= max_y; y++) + if (cur_x+1 < max_x) + whline(win, ' ', max_x - cur_x); + for (int y = cur_y+1; y <= max_y; y++) mvwhline(win, y, 0, ' ', max_x); } diff --git a/src/interface-curses/interface.c b/src/interface-curses/interface.c index 62a6e64..dfada8c 100644 --- a/src/interface-curses/interface.c +++ b/src/interface-curses/interface.c @@ -99,7 +99,7 @@ #endif #endif -#if defined(NCURSES_UNIX) || defined(NETBSD_CURSES) +#if defined(NCURSES_UNIX) || defined(NETBSD_CURSES) || defined(MKS_CURSES) /** * Whether Curses works on a real or pseudo TTY * (i.e. classic use with terminal emulators on Unix) @@ -316,7 +316,7 @@ teco_view_noutrefresh(teco_view_t *ctx) scintilla_noutrefresh(ctx); } -static inline WINDOW * +static inline WINDOW * G_GNUC_UNUSED teco_view_get_window(teco_view_t *ctx) { return scintilla_get_window(ctx); @@ -398,8 +398,6 @@ static void teco_interface_restore_batch(void); static void teco_interface_init_clipboard(void); -static void teco_interface_resize_all_windows(void); - static void teco_interface_set_window_title(const gchar *title); static void teco_interface_draw_info(void); static void teco_interface_draw_cmdline(void); @@ -732,7 +730,7 @@ teco_interface_init_interactive(GError **error) * * NOTE: The delay is overwritten by initscr() on netbsd-curses. */ -#ifdef CURSES_TTY +#if defined(CURSES_TTY) && !defined(MKS_CURSES) if (!g_getenv("ESCDELAY")) set_escdelay(25); #endif @@ -867,6 +865,8 @@ teco_interface_restore_batch(void) } } +#ifdef KEY_RESIZE + static void teco_interface_resize_all_windows(void) { @@ -888,6 +888,8 @@ teco_interface_resize_all_windows(void) teco_interface_draw_cmdline(); } +#endif /* KEY_RESIZE */ + void teco_interface_msg_literal(teco_msg_t type, const gchar *str, gsize len) { @@ -994,6 +996,7 @@ teco_interface_show_view(teco_view_t *view) { teco_interface_current_view = view; +#ifdef KEY_RESIZE if (!teco_interface.cmdline_window) /* batch mode */ return; @@ -1008,6 +1011,7 @@ teco_interface_show_view(teco_view_t *view) wresize(current_view_win, lines - 3, cols); /* Set up window position: never changes */ mvwin(current_view_win, 1, 0); +#endif } #if PDCURSES @@ -1127,6 +1131,8 @@ teco_interface_draw_info(void) waddstr(teco_interface.info_window, PACKAGE_NAME " "); + G_GNUC_UNUSED gint cur_x, cur_y, max_x, max_y; + switch (teco_interface.info_type) { case TECO_INFO_TYPE_QREG: info_type_str = PACKAGE_NAME " - <QRegister> "; @@ -1145,10 +1151,11 @@ teco_interface_draw_info(void) teco_curses_add_wc(teco_interface.info_window, teco_ed & TECO_ED_ICONS ? teco_curses_icons_lookup_file(teco_interface.info_current.data) : '-'); waddstr(teco_interface.info_window, " <Buffer> "); + getyx(teco_interface.info_window, cur_y, cur_x); + getmaxyx(teco_interface.info_window, max_y, max_x); teco_curses_format_filename(teco_interface.info_window, teco_interface.info_current.data, - getmaxx(teco_interface.info_window) - - getcurx(teco_interface.info_window) - 1); + max_x - cur_x - 1); waddch(teco_interface.info_window, teco_interface.info_dirty ? '*' : ' '); break; @@ -1274,8 +1281,11 @@ teco_interface_cmdline_update(const teco_cmdline_t *cmdline) static void teco_interface_draw_cmdline(void) { + G_GNUC_UNUSED gint max_x, max_y; + getmaxyx(teco_interface.cmdline_window, max_y, max_x); + /* total width available for command line */ - guint total_width = getmaxx(teco_interface.cmdline_window) - 1; + guint total_width = max_x - 1; /* beginning of command line to show */ guint disp_offset = teco_interface.cmdline_len - |