Added SILC Thread Queue API
[crypto.git] / apps / irssi / src / fe-text / textbuffer-commands.c
index 92ec70bdddfe80aeb2455d3a90d2df69426de1c7..3636510bb2ddd9fd7d92ede76324847f127a8472 100644 (file)
 */
 
 #include "module.h"
+#include "module-formats.h"
 #include "signals.h"
 #include "commands.h"
 #include "misc.h"
 #include "levels.h"
+#include "settings.h"
+#include "servers.h"
 
 #include "printtext.h"
 #include "gui-windows.h"
+#include "textbuffer-reformat.h"
+#ifdef HAVE_CUIX
+#include "cuix.h"
+#endif
 
-/* SYNTAX: CLEAR */
+/* SYNTAX: CLEAR [-all] [<refnum>] */
 static void cmd_clear(const char *data)
 {
+       WINDOW_REC *window;
        GHashTable *optlist;
+       char *refnum;
        void *free_arg;
-        GSList *tmp;
+       GSList *tmp;
 
        g_return_if_fail(data != NULL);
 
-       if (!cmd_get_params(data, &free_arg, PARAM_FLAG_OPTIONS,
-                           "clear", &optlist)) return;
+       if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS,
+                           "clear", &optlist, &refnum)) return;
 
-       if (g_hash_table_lookup(optlist, "all") == NULL) {
-                /* clear active window */
-               textbuffer_view_clear(WINDOW_GUI(active_win)->view);
-       } else {
-                /* clear all windows */
+       if (g_hash_table_lookup(optlist, "all") != NULL) {
+               /* clear all windows */
                for (tmp = windows; tmp != NULL; tmp = tmp->next) {
-                       WINDOW_REC *window = tmp->data;
-
+                       window = tmp->data;
                        textbuffer_view_clear(WINDOW_GUI(window)->view);
                }
+       } else if (*refnum != '\0') {
+               /* clear specified window */
+               window = window_find_refnum(atoi(refnum));
+               if (window != NULL)
+                       textbuffer_view_clear(WINDOW_GUI(window)->view);
+       } else {
+               /* clear active window */
+               textbuffer_view_clear(WINDOW_GUI(active_win)->view);
        }
 
        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)
 {
        command_runsub("scrollback", data, server, item);
 }
 
-/* SYNTAX: SCROLLBACK CLEAR */
-static void cmd_scrollback_clear(void)
+/* SYNTAX: SCROLLBACK CLEAR [-all] [<refnum>] */
+static void cmd_scrollback_clear(const char *data)
 {
-       textbuffer_view_remove_all_lines(WINDOW_GUI(active_win)->view);
+       WINDOW_REC *window;
+       GHashTable *optlist;
+       char *refnum;
+       void *free_arg;
+       GSList *tmp;
+
+       g_return_if_fail(data != NULL);
+
+       if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS,
+                           "scrollback clear", &optlist, &refnum)) return;
+
+       if (g_hash_table_lookup(optlist, "all") != NULL) {
+               /* clear all windows */
+               for (tmp = windows; tmp != NULL; tmp = tmp->next) {
+                       window = tmp->data;
+                       textbuffer_view_remove_all_lines(WINDOW_GUI(window)->view);
+               }
+       } else if (*refnum != '\0') {
+               /* clear specified window */
+               window = window_find_refnum(atoi(refnum));
+               if (window != NULL)
+                       textbuffer_view_remove_all_lines(WINDOW_GUI(window)->view);
+       } else {
+               /* clear active window */
+               textbuffer_view_remove_all_lines(WINDOW_GUI(active_win)->view);
+       }
+
+       cmd_params_free(free_arg);
 }
 
 static void scrollback_goto_line(int linenum)
@@ -74,13 +140,13 @@ static void scrollback_goto_line(int linenum)
        if (view->buffer->lines_count == 0)
                return;
 
-       textbuffer_view_scroll_line(view, view->buffer->lines->data);
+       textbuffer_view_scroll_line(view, view->buffer->first_line);
        gui_window_scroll(active_win, linenum);
 }
 
 static void scrollback_goto_time(const char *datearg, const char *timearg)
 {
-        GList *tmp;
+        LINE_REC *line;
        struct tm tm;
        time_t now, stamp;
        int day, month;
@@ -145,12 +211,10 @@ static void scrollback_goto_time(const char *datearg, const char *timearg)
        }
 
        /* scroll to first line after timestamp */
-        tmp = textbuffer_view_get_lines(WINDOW_GUI(active_win)->view);
-       for (; tmp != NULL; tmp = tmp->next) {
-               LINE_REC *rec = tmp->data;
-
-               if (rec->info.time >= stamp) {
-                       gui_window_scroll_line(active_win, rec);
+       line = textbuffer_view_get_lines(WINDOW_GUI(active_win)->view);
+       for (; line != NULL; line = line->next) {
+               if (line->info.time >= stamp) {
+                       gui_window_scroll_line(active_win, line);
                        break;
                }
        }
@@ -188,7 +252,7 @@ static void cmd_scrollback_home(const char *data)
 
        buffer = WINDOW_GUI(active_win)->view->buffer;
        if (buffer->lines_count > 0)
-               gui_window_scroll_line(active_win, buffer->lines->data);
+               gui_window_scroll_line(active_win, buffer->first_line);
 }
 
 /* SYNTAX: SCROLLBACK END */
@@ -197,31 +261,33 @@ static void cmd_scrollback_end(const char *data)
         TEXT_BUFFER_VIEW_REC *view;
 
        view = WINDOW_GUI(active_win)->view;
-       if (view->bottom_startline == NULL)
+       if (view->bottom_startline == NULL ||
+           (view->bottom_startline == view->startline &&
+            view->bottom_subline == view->subline))
                return;
 
-       textbuffer_view_scroll_line(view, view->bottom_startline->data);
+       textbuffer_view_scroll_line(view, view->bottom_startline);
        gui_window_scroll(active_win, view->bottom_subline);
 }
 
 /* SYNTAX: SCROLLBACK REDRAW */
 static void cmd_scrollback_redraw(void)
 {
-#if 0
        GUI_WINDOW_REC *gui;
-       GList *tmp, *next;
+       LINE_REC *line, *next;
 
        gui = WINDOW_GUI(active_win);
 
-       screen_refresh_freeze();
-       for (tmp = gui->lines; tmp != NULL; tmp = next) {
-               next = tmp->next;
-               gui_window_reformat_line(active_win, tmp->data);
+       term_refresh_freeze();
+       line = textbuffer_view_get_lines(gui->view);
+       while (line != NULL) {
+               next = line->next;
+               textbuffer_reformat_line(active_win, line);
+                line = next;
        }
 
        gui_window_redraw(active_win);
-       screen_refresh_thaw();
-#endif
+       term_refresh_thaw();
 }
 
 static void cmd_scrollback_status(void)
@@ -266,9 +332,27 @@ static void sig_away_changed(SERVER_REC *server)
        }
 }
 
+#ifdef HAVE_CUIX
+static void cmd_cuix(void)
+{
+    if (!cuix_active)
+    {
+        /* textbuffer_view_clear(WINDOW_GUI(active_win)->view); */
+        cuix_active = 1;
+        cuix_create();
+    } else {
+        /* should never been called */
+        /* cuix_destroy (); */
+        cuix_active = 0;
+        /* textbuffer_view_clear(WINDOW_GUI(active_win)->view); */
+    }
+}
+#endif
+
 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);
@@ -276,8 +360,12 @@ void textbuffer_commands_init(void)
        command_bind("scrollback end", NULL, (SIGNAL_FUNC) cmd_scrollback_end);
        command_bind("scrollback redraw", NULL, (SIGNAL_FUNC) cmd_scrollback_redraw);
        command_bind("scrollback status", NULL, (SIGNAL_FUNC) cmd_scrollback_status);
+#ifdef HAVE_CUIX
+       command_bind("cuix", NULL, (SIGNAL_FUNC) cmd_cuix);
+#endif
 
        command_set_options("clear", "all");
+       command_set_options("scrollback clear", "all");
 
        signal_add("away mode changed", (SIGNAL_FUNC) sig_away_changed);
 }
@@ -285,6 +373,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);
@@ -292,6 +381,9 @@ void textbuffer_commands_deinit(void)
        command_unbind("scrollback end", (SIGNAL_FUNC) cmd_scrollback_end);
        command_unbind("scrollback redraw", (SIGNAL_FUNC) cmd_scrollback_redraw);
        command_unbind("scrollback status", (SIGNAL_FUNC) cmd_scrollback_status);
+#ifdef HAVE_CUIX
+       command_unbind("cuix", (SIGNAL_FUNC) cmd_cuix);
+#endif
 
        signal_remove("away mode changed", (SIGNAL_FUNC) sig_away_changed);
 }