1
0
mirror of https://github.com/irssi/irssi.git synced 2024-11-03 04:27:19 -05:00

/SET scroll ON - should the windows be scrolled by default when you're at

bottom. /WINDOW SCROLL ON|OFF|DEFAULT - Window specific scrolling behaviour,
also saved in windows layout.


git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1751 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
Timo Sirainen 2001-08-14 01:14:26 +00:00 committed by cras
parent 51b1d80fbe
commit 285b33e992
8 changed files with 88 additions and 16 deletions

View File

@ -46,7 +46,8 @@ static GUI_WINDOW_REC *gui_window_init(WINDOW_REC *window,
gui->view = textbuffer_view_create(textbuffer_create(), gui->view = textbuffer_view_create(textbuffer_create(),
window->width, window->height, window->width, window->height,
settings_get_int("indent"), settings_get_int("indent"),
settings_get_bool("indent_always")); settings_get_bool("indent_always"),
settings_get_bool("scroll"));
return gui; return gui;
} }
@ -313,10 +314,15 @@ static void read_settings(void)
for (tmp = windows; tmp != NULL; tmp = tmp->next) { for (tmp = windows; tmp != NULL; tmp = tmp->next) {
WINDOW_REC *rec = tmp->data; 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_int("indent"),
settings_get_bool("indent_always")); 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); 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_bool("lookandfeel", "indent_always", FALSE);
settings_add_str("lookandfeel", "prompt", "[$[.15]T] "); settings_add_str("lookandfeel", "prompt", "[$[.15]T] ");
settings_add_str("lookandfeel", "prompt_window", "[$winname] "); settings_add_str("lookandfeel", "prompt_window", "[$winname] ");
settings_add_bool("lookandfeel", "scroll", TRUE);
prompt = NULL; prompt_window = NULL; prompt = NULL; prompt_window = NULL;
window_create_override = -1; window_create_override = -1;

View File

@ -14,6 +14,9 @@ typedef struct {
MAIN_WINDOW_REC *parent; MAIN_WINDOW_REC *parent;
TEXT_BUFFER_VIEW_REC *view; TEXT_BUFFER_VIEW_REC *view;
unsigned int scroll:1;
unsigned int use_scroll:1;
unsigned int sticky:1; unsigned int sticky:1;
unsigned int use_insert_after:1; unsigned int use_insert_after:1;
LINE_REC *insert_after; LINE_REC *insert_after;

View File

@ -26,22 +26,31 @@
#include "mainwindows.h" #include "mainwindows.h"
#include "gui-windows.h" #include "gui-windows.h"
#include "textbuffer-view.h"
static void sig_layout_window_save(WINDOW_REC *window, CONFIG_NODE *node) static void sig_layout_window_save(WINDOW_REC *window, CONFIG_NODE *node)
{ {
WINDOW_REC *active; 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); iconfig_node_set_bool(node, "sticky", TRUE);
active = WINDOW_MAIN(window)->active; active = gui->parent->active;
if (window != active) if (window != active)
iconfig_node_set_int(node, "parent", active->refnum); 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) static void sig_layout_window_restore(WINDOW_REC *window, CONFIG_NODE *node)
{ {
WINDOW_REC *parent; WINDOW_REC *parent;
GUI_WINDOW_REC *gui;
gui = WINDOW_GUI(window);
parent = window_find_refnum(config_node_get_int(node, "parent", -1)); parent = window_find_refnum(config_node_get_int(node, "parent", -1));
if (parent != NULL) 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)) if (config_node_get_bool(node, "sticky", FALSE))
gui_window_set_sticky(window); 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) 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) void mainwindows_layout_init(void)
{ {
signal_add("layout window save", (SIGNAL_FUNC) sig_layout_window_save); signal_add("layout save window", (SIGNAL_FUNC) sig_layout_window_save);
signal_add("layout window restore", (SIGNAL_FUNC) sig_layout_window_restore); signal_add("layout restore window", (SIGNAL_FUNC) sig_layout_window_restore);
signal_add("layout save", (SIGNAL_FUNC) sig_layout_save); signal_add("layout save", (SIGNAL_FUNC) sig_layout_save);
signal_add_first("layout restore", (SIGNAL_FUNC) sig_layout_restore); signal_add_first("layout restore", (SIGNAL_FUNC) sig_layout_restore);
signal_add("layout reset", (SIGNAL_FUNC) sig_layout_reset); signal_add("layout reset", (SIGNAL_FUNC) sig_layout_reset);
@ -145,8 +159,8 @@ void mainwindows_layout_init(void)
void mainwindows_layout_deinit(void) void mainwindows_layout_deinit(void)
{ {
signal_remove("layout window save", (SIGNAL_FUNC) sig_layout_window_save); signal_remove("layout save window", (SIGNAL_FUNC) sig_layout_window_save);
signal_remove("layout window restore", (SIGNAL_FUNC) sig_layout_window_restore); signal_remove("layout restore window", (SIGNAL_FUNC) sig_layout_window_restore);
signal_remove("layout save", (SIGNAL_FUNC) sig_layout_save); signal_remove("layout save", (SIGNAL_FUNC) sig_layout_save);
signal_remove("layout restore", (SIGNAL_FUNC) sig_layout_restore); signal_remove("layout restore", (SIGNAL_FUNC) sig_layout_restore);
signal_remove("layout reset", (SIGNAL_FUNC) sig_layout_reset); signal_remove("layout reset", (SIGNAL_FUNC) sig_layout_reset);

View File

@ -38,6 +38,8 @@ FORMAT_REC gui_text_formats[] =
{ "window_set_sticky", "Window set sticky", 0 }, { "window_set_sticky", "Window set sticky", 0 },
{ "window_unset_sticky", "Window is not sticky anymore", 0 }, { "window_unset_sticky", "Window is not sticky anymore", 0 },
{ "window_info_sticky", "Sticky : $0", 1, { 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 } { NULL, NULL, 0 }
}; };

View File

@ -15,7 +15,9 @@ enum {
TXT_WINDOW_NOT_STICKY, TXT_WINDOW_NOT_STICKY,
TXT_WINDOW_SET_STICKY, TXT_WINDOW_SET_STICKY,
TXT_WINDOW_UNSET_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[]; extern FORMAT_REC gui_text_formats[];

View File

@ -19,10 +19,12 @@
*/ */
#include "module.h" #include "module.h"
#include "module-formats.h"
#include "signals.h" #include "signals.h"
#include "commands.h" #include "commands.h"
#include "misc.h" #include "misc.h"
#include "levels.h" #include "levels.h"
#include "settings.h"
#include "printtext.h" #include "printtext.h"
#include "gui-windows.h" #include "gui-windows.h"
@ -55,6 +57,32 @@ static void cmd_clear(const char *data)
cmd_params_free(free_arg); 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, static void cmd_scrollback(const char *data, SERVER_REC *server,
WI_ITEM_REC *item) WI_ITEM_REC *item)
{ {
@ -268,6 +296,7 @@ static void sig_away_changed(SERVER_REC *server)
void textbuffer_commands_init(void) void textbuffer_commands_init(void)
{ {
command_bind("clear", NULL, (SIGNAL_FUNC) cmd_clear); 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", NULL, (SIGNAL_FUNC) cmd_scrollback);
command_bind("scrollback clear", NULL, (SIGNAL_FUNC) cmd_scrollback_clear); command_bind("scrollback clear", NULL, (SIGNAL_FUNC) cmd_scrollback_clear);
command_bind("scrollback goto", NULL, (SIGNAL_FUNC) cmd_scrollback_goto); command_bind("scrollback goto", NULL, (SIGNAL_FUNC) cmd_scrollback_goto);
@ -284,6 +313,7 @@ void textbuffer_commands_init(void)
void textbuffer_commands_deinit(void) void textbuffer_commands_deinit(void)
{ {
command_unbind("clear", (SIGNAL_FUNC) cmd_clear); 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", (SIGNAL_FUNC) cmd_scrollback);
command_unbind("scrollback clear", (SIGNAL_FUNC) cmd_scrollback_clear); command_unbind("scrollback clear", (SIGNAL_FUNC) cmd_scrollback_clear);
command_unbind("scrollback goto", (SIGNAL_FUNC) cmd_scrollback_goto); command_unbind("scrollback goto", (SIGNAL_FUNC) cmd_scrollback_goto);

View File

@ -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, TEXT_BUFFER_VIEW_REC *textbuffer_view_create(TEXT_BUFFER_REC *buffer,
int width, int height, int width, int height,
int default_indent, int default_indent,
int longword_noindent) int longword_noindent,
int scroll)
{ {
TEXT_BUFFER_VIEW_REC *view; TEXT_BUFFER_VIEW_REC *view;
@ -387,7 +388,8 @@ TEXT_BUFFER_VIEW_REC *textbuffer_view_create(TEXT_BUFFER_REC *buffer,
view->width = width; view->width = width;
view->height = height; view->height = height;
view->default_indent = default_indent; 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); view->cache = textbuffer_cache_get(view->siblings, width);
textbuffer_view_init_bottom(view); 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; 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) static int view_get_linecount_all(TEXT_BUFFER_VIEW_REC *view, LINE_REC *line)
{ {
int linecount; int linecount;
@ -764,11 +771,13 @@ static void view_insert_line(TEXT_BUFFER_VIEW_REC *view, LINE_REC *line)
} }
if (view->bottom) { if (view->bottom) {
if (view->ypos >= view->height) { if (view->scroll && view->ypos >= view->height) {
linecount = view->ypos-view->height+1; linecount = view->ypos-view->height+1;
view_scroll(view, &view->startline, view_scroll(view, &view->startline,
&view->subline, linecount, FALSE); &view->subline, linecount, FALSE);
view->ypos -= linecount; view->ypos -= linecount;
} else {
view->bottom = view_is_bottom(view);
} }
if (view->window != NULL) { if (view->window != NULL) {
@ -779,8 +788,10 @@ static void view_insert_line(TEXT_BUFFER_VIEW_REC *view, LINE_REC *line)
subline = -ypos; subline = -ypos;
ypos = 0; ypos = 0;
} }
view_line_draw(view, line, subline, ypos, if (ypos < view->height) {
view->height - ypos); view_line_draw(view, line, subline, ypos,
view->height - ypos);
}
} }
} }

View File

@ -45,7 +45,8 @@ typedef struct {
int width, height; int width, height;
int default_indent; 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; TEXT_BUFFER_CACHE_REC *cache;
int ypos; /* cursor position - visible area is 0..height-1 */ 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, TEXT_BUFFER_VIEW_REC *textbuffer_view_create(TEXT_BUFFER_REC *buffer,
int width, int height, int width, int height,
int default_indent, int default_indent,
int longword_noindent); int longword_noindent,
int scroll);
/* Destroy the view. */ /* Destroy the view. */
void textbuffer_view_destroy(TEXT_BUFFER_VIEW_REC *view); void textbuffer_view_destroy(TEXT_BUFFER_VIEW_REC *view);
/* Change the default indent position */ /* Change the default indent position */
void textbuffer_view_set_default_indent(TEXT_BUFFER_VIEW_REC *view, void textbuffer_view_set_default_indent(TEXT_BUFFER_VIEW_REC *view,
int default_indent, int default_indent,
int longword_noindent); int longword_noindent);
void textbuffer_view_set_scroll(TEXT_BUFFER_VIEW_REC *view, int scroll);
/* Resize the view. */ /* Resize the view. */
void textbuffer_view_resize(TEXT_BUFFER_VIEW_REC *view, int width, int height); void textbuffer_view_resize(TEXT_BUFFER_VIEW_REC *view, int width, int height);