Added SILC Thread Queue API
[crypto.git] / apps / irssi / src / fe-text / term.c
index c32b24919403018dfae465ab00fa686d0d437bc1..59c3fe4d49406f0025f91f8ee5192946d12ad436 100644 (file)
 #include "term.h"
 #include "mainwindows.h"
 
+#ifdef HAVE_NL_LANGINFO
+#  include <langinfo.h>
+#endif
+
 #ifdef HAVE_SYS_IOCTL_H
 #  include <sys/ioctl.h>
 #endif
 
 #define MIN_SCREEN_WIDTH 20
 
+int term_width, term_height, term_detached;
+
 int term_use_colors;
+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)
@@ -52,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
@@ -89,12 +105,32 @@ static void cmd_resize(void)
         term_resize_dirty();
 }
 
+static void cmd_redraw(void)
+{
+       irssi_redraw();
+}
+
 static void read_settings(void)
 {
+        const char *str;
        int old_colors = term_use_colors;
+        int old_type = term_type;
 
         term_auto_detach(settings_get_bool("term_auto_detach"));
 
+        /* set terminal 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)
+               term_type = TERM_TYPE_BIG5;
+       else
+               term_type = TERM_TYPE_8BIT;
+
+       if (old_type != term_type)
+                term_set_input_type(term_type);
+
+        /* change color stuff */
        if (force_colors != settings_get_bool("term_force_colors")) {
                force_colors = settings_get_bool("term_force_colors");
                term_force_colors(force_colors);
@@ -115,15 +151,23 @@ 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_bool("lookandfeel", "term_utf8", FALSE);
+        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)
+       if (strcmp(nl_langinfo(CODESET), "UTF-8") == 0) {
+               term_type = TERM_TYPE_UTF8;
+               term_set_input_type(TERM_TYPE_UTF8);
+       }
+#endif
+
        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);
@@ -136,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);
 }