diff options
-rw-r--r-- | src/fe-text/gui-windows.c | 11 | ||||
-rw-r--r-- | src/fe-text/gui-windows.h | 3 | ||||
-rw-r--r-- | src/fe-text/mainwindows-layout.c | 26 | ||||
-rw-r--r-- | src/fe-text/module-formats.c | 2 | ||||
-rw-r--r-- | src/fe-text/module-formats.h | 4 | ||||
-rw-r--r-- | src/fe-text/textbuffer-commands.c | 30 | ||||
-rw-r--r-- | src/fe-text/textbuffer-view.c | 21 | ||||
-rw-r--r-- | src/fe-text/textbuffer-view.h | 7 |
8 files changed, 88 insertions, 16 deletions
diff --git a/src/fe-text/gui-windows.c b/src/fe-text/gui-windows.c index e8f5dae3..48c1feb7 100644 --- a/src/fe-text/gui-windows.c +++ b/src/fe-text/gui-windows.c @@ -46,7 +46,8 @@ static GUI_WINDOW_REC *gui_window_init(WINDOW_REC *window, gui->view = textbuffer_view_create(textbuffer_create(), window->width, window->height, settings_get_int("indent"), - settings_get_bool("indent_always")); + settings_get_bool("indent_always"), + settings_get_bool("scroll")); return gui; } @@ -313,10 +314,15 @@ static void read_settings(void) for (tmp = windows; tmp != NULL; tmp = tmp->next) { WINDOW_REC *rec = tmp->data; + GUI_WINDOW_REC *gui = WINDOW_GUI(rec); - textbuffer_view_set_default_indent(WINDOW_GUI(rec)->view, + textbuffer_view_set_default_indent(gui->view, settings_get_int("indent"), settings_get_bool("indent_always")); + + textbuffer_view_set_scroll(gui->view, + gui->use_scroll ? gui->scroll : + settings_get_bool("scroll")); } special_vars_add_signals(prompt, 4, funcs); @@ -332,6 +338,7 @@ void gui_windows_init(void) settings_add_bool("lookandfeel", "indent_always", FALSE); settings_add_str("lookandfeel", "prompt", "[$[.15]T] "); settings_add_str("lookandfeel", "prompt_window", "[$winname] "); + settings_add_bool("lookandfeel", "scroll", TRUE); prompt = NULL; prompt_window = NULL; window_create_override = -1; diff --git a/src/fe-text/gui-windows.h b/src/fe-text/gui-windows.h index 4b9792ce..220b4661 100644 --- a/src/fe-text/gui-windows.h +++ b/src/fe-text/gui-windows.h @@ -14,6 +14,9 @@ typedef struct { MAIN_WINDOW_REC *parent; TEXT_BUFFER_VIEW_REC *view; + unsigned int scroll:1; + unsigned int use_scroll:1; + unsigned int sticky:1; unsigned int use_insert_after:1; LINE_REC *insert_after; diff --git a/src/fe-text/mainwindows-layout.c b/src/fe-text/mainwindows-layout.c index a97995e0..b92fe108 100644 --- a/src/fe-text/mainwindows-layout.c +++ b/src/fe-text/mainwindows-layout.c @@ -26,22 +26,31 @@ #include "mainwindows.h" #include "gui-windows.h" +#include "textbuffer-view.h" static void sig_layout_window_save(WINDOW_REC *window, CONFIG_NODE *node) { WINDOW_REC *active; + GUI_WINDOW_REC *gui; - if (WINDOW_GUI(window)->sticky) { + gui = WINDOW_GUI(window); + if (gui->sticky) { iconfig_node_set_bool(node, "sticky", TRUE); - active = WINDOW_MAIN(window)->active; + active = gui->parent->active; if (window != active) iconfig_node_set_int(node, "parent", active->refnum); } + + if (gui->use_scroll) + iconfig_node_set_bool(node, "scroll", gui->scroll); } static void sig_layout_window_restore(WINDOW_REC *window, CONFIG_NODE *node) { WINDOW_REC *parent; + GUI_WINDOW_REC *gui; + + gui = WINDOW_GUI(window); parent = window_find_refnum(config_node_get_int(node, "parent", -1)); if (parent != NULL) @@ -49,6 +58,11 @@ static void sig_layout_window_restore(WINDOW_REC *window, CONFIG_NODE *node) if (config_node_get_bool(node, "sticky", FALSE)) gui_window_set_sticky(window); + if (config_node_get_str(node, "scroll", NULL) != NULL) { + gui->use_scroll = TRUE; + gui->scroll = config_node_get_bool(node, "scroll", TRUE); + textbuffer_view_set_scroll(gui->view, gui->scroll); + } } static void main_window_save(MAIN_WINDOW_REC *window, CONFIG_NODE *node) @@ -136,8 +150,8 @@ static void sig_layout_reset(void) void mainwindows_layout_init(void) { - signal_add("layout window save", (SIGNAL_FUNC) sig_layout_window_save); - signal_add("layout window restore", (SIGNAL_FUNC) sig_layout_window_restore); + signal_add("layout save window", (SIGNAL_FUNC) sig_layout_window_save); + signal_add("layout restore window", (SIGNAL_FUNC) sig_layout_window_restore); signal_add("layout save", (SIGNAL_FUNC) sig_layout_save); signal_add_first("layout restore", (SIGNAL_FUNC) sig_layout_restore); signal_add("layout reset", (SIGNAL_FUNC) sig_layout_reset); @@ -145,8 +159,8 @@ void mainwindows_layout_init(void) void mainwindows_layout_deinit(void) { - signal_remove("layout window save", (SIGNAL_FUNC) sig_layout_window_save); - signal_remove("layout window restore", (SIGNAL_FUNC) sig_layout_window_restore); + signal_remove("layout save window", (SIGNAL_FUNC) sig_layout_window_save); + signal_remove("layout restore window", (SIGNAL_FUNC) sig_layout_window_restore); signal_remove("layout save", (SIGNAL_FUNC) sig_layout_save); signal_remove("layout restore", (SIGNAL_FUNC) sig_layout_restore); signal_remove("layout reset", (SIGNAL_FUNC) sig_layout_reset); diff --git a/src/fe-text/module-formats.c b/src/fe-text/module-formats.c index 248bd03e..928d569a 100644 --- a/src/fe-text/module-formats.c +++ b/src/fe-text/module-formats.c @@ -38,6 +38,8 @@ FORMAT_REC gui_text_formats[] = { "window_set_sticky", "Window set sticky", 0 }, { "window_unset_sticky", "Window is not sticky anymore", 0 }, { "window_info_sticky", "Sticky : $0", 1, { 0 } }, + { "window_scroll", "Window scroll mode is now $0", 1, { 0 } }, + { "window_scroll_unknown", "Unknown scroll mode $0, must be ON, OFF or DEFAULT", 1, { 0 } }, { NULL, NULL, 0 } }; diff --git a/src/fe-text/module-formats.h b/src/fe-text/module-formats.h index 055b2b04..e1f6e31f 100644 --- a/src/fe-text/module-formats.h +++ b/src/fe-text/module-formats.h @@ -15,7 +15,9 @@ enum { TXT_WINDOW_NOT_STICKY, TXT_WINDOW_SET_STICKY, TXT_WINDOW_UNSET_STICKY, - TXT_WINDOW_INFO_STICKY + TXT_WINDOW_INFO_STICKY, + TXT_WINDOW_SCROLL, + TXT_WINDOW_SCROLL_UNKNOWN }; extern FORMAT_REC gui_text_formats[]; diff --git a/src/fe-text/textbuffer-commands.c b/src/fe-text/textbuffer-commands.c index 2de83515..502b3881 100644 --- a/src/fe-text/textbuffer-commands.c +++ b/src/fe-text/textbuffer-commands.c @@ -19,10 +19,12 @@ */ #include "module.h" +#include "module-formats.h" #include "signals.h" #include "commands.h" #include "misc.h" #include "levels.h" +#include "settings.h" #include "printtext.h" #include "gui-windows.h" @@ -55,6 +57,32 @@ static void cmd_clear(const char *data) cmd_params_free(free_arg); } +static void cmd_window_scroll(const char *data) +{ + GUI_WINDOW_REC *gui; + + gui = WINDOW_GUI(active_win); + if (g_strcasecmp(data, "default") == 0) { + gui->use_scroll = FALSE; + } else if (g_strcasecmp(data, "on") == 0) { + gui->use_scroll = TRUE; + gui->scroll = TRUE; + } else if (g_strcasecmp(data, "off") == 0) { + gui->use_scroll = TRUE; + gui->scroll = FALSE; + } else if (*data != '\0') { + printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, + TXT_WINDOW_SCROLL_UNKNOWN, data); + return; + } + + printformat_window(active_win, MSGLEVEL_CLIENTNOTICE, + TXT_WINDOW_SCROLL, !gui->use_scroll ? "DEFAULT" : + gui->scroll ? "ON" : "OFF"); + textbuffer_view_set_scroll(gui->view, gui->use_scroll ? + gui->scroll : settings_get_bool("scroll")); +} + static void cmd_scrollback(const char *data, SERVER_REC *server, WI_ITEM_REC *item) { @@ -268,6 +296,7 @@ static void sig_away_changed(SERVER_REC *server) void textbuffer_commands_init(void) { command_bind("clear", NULL, (SIGNAL_FUNC) cmd_clear); + command_bind("window scroll", NULL, (SIGNAL_FUNC) cmd_window_scroll); command_bind("scrollback", NULL, (SIGNAL_FUNC) cmd_scrollback); command_bind("scrollback clear", NULL, (SIGNAL_FUNC) cmd_scrollback_clear); command_bind("scrollback goto", NULL, (SIGNAL_FUNC) cmd_scrollback_goto); @@ -284,6 +313,7 @@ void textbuffer_commands_init(void) void textbuffer_commands_deinit(void) { command_unbind("clear", (SIGNAL_FUNC) cmd_clear); + command_unbind("window scroll", (SIGNAL_FUNC) cmd_window_scroll); command_unbind("scrollback", (SIGNAL_FUNC) cmd_scrollback); command_unbind("scrollback clear", (SIGNAL_FUNC) cmd_scrollback_clear); command_unbind("scrollback goto", (SIGNAL_FUNC) cmd_scrollback_goto); diff --git a/src/fe-text/textbuffer-view.c b/src/fe-text/textbuffer-view.c index e27a7826..c7959774 100644 --- a/src/fe-text/textbuffer-view.c +++ b/src/fe-text/textbuffer-view.c @@ -373,7 +373,8 @@ static void textbuffer_view_init_ypos(TEXT_BUFFER_VIEW_REC *view) TEXT_BUFFER_VIEW_REC *textbuffer_view_create(TEXT_BUFFER_REC *buffer, int width, int height, int default_indent, - int longword_noindent) + int longword_noindent, + int scroll) { TEXT_BUFFER_VIEW_REC *view; @@ -387,7 +388,8 @@ TEXT_BUFFER_VIEW_REC *textbuffer_view_create(TEXT_BUFFER_REC *buffer, view->width = width; view->height = height; view->default_indent = default_indent; - view->longword_noindent = longword_noindent; + view->longword_noindent = longword_noindent; + view->scroll = scroll; view->cache = textbuffer_cache_get(view->siblings, width); textbuffer_view_init_bottom(view); @@ -443,6 +445,11 @@ void textbuffer_view_set_default_indent(TEXT_BUFFER_VIEW_REC *view, view->longword_noindent = longword_noindent; } +void textbuffer_view_set_scroll(TEXT_BUFFER_VIEW_REC *view, int scroll) +{ + view->scroll = scroll; +} + static int view_get_linecount_all(TEXT_BUFFER_VIEW_REC *view, LINE_REC *line) { int linecount; @@ -764,11 +771,13 @@ static void view_insert_line(TEXT_BUFFER_VIEW_REC *view, LINE_REC *line) } if (view->bottom) { - if (view->ypos >= view->height) { + if (view->scroll && view->ypos >= view->height) { linecount = view->ypos-view->height+1; view_scroll(view, &view->startline, &view->subline, linecount, FALSE); view->ypos -= linecount; + } else { + view->bottom = view_is_bottom(view); } if (view->window != NULL) { @@ -779,8 +788,10 @@ static void view_insert_line(TEXT_BUFFER_VIEW_REC *view, LINE_REC *line) subline = -ypos; ypos = 0; } - view_line_draw(view, line, subline, ypos, - view->height - ypos); + if (ypos < view->height) { + view_line_draw(view, line, subline, ypos, + view->height - ypos); + } } } diff --git a/src/fe-text/textbuffer-view.h b/src/fe-text/textbuffer-view.h index 51973acf..d49798df 100644 --- a/src/fe-text/textbuffer-view.h +++ b/src/fe-text/textbuffer-view.h @@ -45,7 +45,8 @@ typedef struct { int width, height; int default_indent; - int longword_noindent:1; + unsigned int longword_noindent:1; + unsigned int scroll:1; /* scroll down automatically when at bottom */ TEXT_BUFFER_CACHE_REC *cache; int ypos; /* cursor position - visible area is 0..height-1 */ @@ -72,13 +73,15 @@ typedef struct { TEXT_BUFFER_VIEW_REC *textbuffer_view_create(TEXT_BUFFER_REC *buffer, int width, int height, int default_indent, - int longword_noindent); + int longword_noindent, + int scroll); /* Destroy the view. */ void textbuffer_view_destroy(TEXT_BUFFER_VIEW_REC *view); /* Change the default indent position */ void textbuffer_view_set_default_indent(TEXT_BUFFER_VIEW_REC *view, int default_indent, int longword_noindent); +void textbuffer_view_set_scroll(TEXT_BUFFER_VIEW_REC *view, int scroll); /* Resize the view. */ void textbuffer_view_resize(TEXT_BUFFER_VIEW_REC *view, int width, int height); |