Added SILC Thread Queue API
[crypto.git] / apps / irssi / src / fe-text / term.c
index cc49103f16a8240a124f2faa72a57e9de794dee0..59c3fe4d49406f0025f91f8ee5192946d12ad436 100644 (file)
@@ -27,7 +27,6 @@
 #include "mainwindows.h"
 
 #ifdef HAVE_NL_LANGINFO
-#  include <locale.h>
 #  include <langinfo.h>
 #endif
 
@@ -47,12 +46,34 @@ int term_type;
 static int force_colors;
 static int resize_dirty;
 
-/* Resize the terminal if needed */
-void term_resize_dirty(void)
+int term_get_size(int *width, int *height)
 {
 #ifdef TIOCGWINSZ
        struct winsize ws;
+
+       /* Get new window size */
+       if (ioctl(0, TIOCGWINSZ, &ws) < 0)
+               return FALSE;
+
+       if (ws.ws_row == 0 && ws.ws_col == 0)
+               return FALSE;
+
+       *width = ws.ws_col;
+        *height = ws.ws_row;
+
+       if (*width < MIN_SCREEN_WIDTH)
+               *width = MIN_SCREEN_WIDTH;
+       if (*height < 1)
+                *height = 1;
+       return TRUE;
+#else
+        return FALSE;
 #endif
+}
+
+/* Resize the terminal if needed */
+void term_resize_dirty(void)
+{
         int width, height;
 
        if (!resize_dirty)
@@ -60,27 +81,14 @@ void term_resize_dirty(void)
 
         resize_dirty = FALSE;
 
-#ifdef TIOCGWINSZ
-       /* Get new window size */
-       if (ioctl(0, TIOCGWINSZ, &ws) < 0)
-               return;
+       if (!term_get_size(&width, &height))
+               width = height = -1;
 
-       if (ws.ws_row == term_height && ws.ws_col == term_width) {
-               /* Same size, abort. */
-               return;
+       if (height != term_height || width != term_width) {
+               term_resize(width, height);
+               mainwindows_resize(term_width, term_height);
+               term_resize_final(width, height);
        }
-
-       if (ws.ws_col < MIN_SCREEN_WIDTH)
-               ws.ws_col = MIN_SCREEN_WIDTH;
-
-       width = ws.ws_col;
-        height = ws.ws_row;
-#else
-        width = height = -1;
-#endif
-        term_resize(width, height);
-       mainwindows_resize(term_width, term_height);
-        term_resize_final(width, height);
 }
 
 #ifdef SIGWINCH
@@ -97,6 +105,11 @@ static void cmd_resize(void)
         term_resize_dirty();
 }
 
+static void cmd_redraw(void)
+{
+       irssi_redraw();
+}
+
 static void read_settings(void)
 {
         const char *str;
@@ -106,7 +119,7 @@ static void read_settings(void)
         term_auto_detach(settings_get_bool("term_auto_detach"));
 
         /* set terminal type */
-       str = settings_get_str("term_type");
+       str = settings_get_str("term_charset");
        if (g_strcasecmp(str, "utf-8") == 0)
                term_type = TERM_TYPE_UTF8;
        else if (g_strcasecmp(str, "big5") == 0)
@@ -138,14 +151,13 @@ void term_common_init(void)
        settings_add_bool("lookandfeel", "colors", TRUE);
        settings_add_bool("lookandfeel", "term_force_colors", FALSE);
         settings_add_bool("lookandfeel", "term_auto_detach", FALSE);
-        settings_add_str("lookandfeel", "term_type", "8bit");
+        settings_add_bool("lookandfeel", "mirc_blink_fix", FALSE);
 
        force_colors = FALSE;
        term_use_colors = term_has_colors() && settings_get_bool("colors");
         read_settings();
 
 #if defined (HAVE_NL_LANGINFO) && defined(CODESET)
-        setlocale(LC_CTYPE, "");
        if (strcmp(nl_langinfo(CODESET), "UTF-8") == 0) {
                term_type = TERM_TYPE_UTF8;
                term_set_input_type(TERM_TYPE_UTF8);
@@ -155,6 +167,7 @@ void term_common_init(void)
        signal_add("beep", (SIGNAL_FUNC) term_beep);
        signal_add("setup changed", (SIGNAL_FUNC) read_settings);
        command_bind("resize", NULL, (SIGNAL_FUNC) cmd_resize);
+       command_bind("redraw", NULL, (SIGNAL_FUNC) cmd_redraw);
 
 #ifdef SIGWINCH
        sigemptyset (&act.sa_mask);
@@ -167,6 +180,7 @@ void term_common_init(void)
 void term_common_deinit(void)
 {
        command_unbind("resize", (SIGNAL_FUNC) cmd_resize);
+       command_unbind("redraw", (SIGNAL_FUNC) cmd_redraw);
        signal_remove("beep", (SIGNAL_FUNC) term_beep);
        signal_remove("setup changed", (SIGNAL_FUNC) read_settings);
 }