changeset 20:e97f323c8aa2

[/trunk] Changeset 35 by mikael * Command line improvement (offset, etc.).
author mikael
date Thu, 24 Mar 2005 22:02:21 +0000
parents 0c2d2b79c4b5
children 7eeda3a06b21
files mcabber/screen.c
diffstat 1 files changed, 52 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/screen.c	Thu Mar 24 20:22:41 2005 +0000
+++ b/mcabber/screen.c	Thu Mar 24 22:02:21 2005 +0000
@@ -5,6 +5,7 @@
 #include <panel.h>
 #include <time.h>
 #include <ctype.h>
+#include <locale.h>
 
 #include "screen.h"
 #include "utils.h"
@@ -29,8 +30,9 @@
 static int chatmode;
 int update_roaster;
 
-static char inputLine[INPUTLINE_LENGTH];
+static char inputLine[INPUTLINE_LENGTH+1];
 static char *ptr_inputline;
+static short int inputline_offset;
 
 
 /* Funciones */
@@ -455,6 +457,8 @@
   inputLine[0] = 0;
   ptr_inputline = inputLine;
 
+  //setlocale(LC_CTYPE, "");
+
   return;
 }
 
@@ -517,7 +521,7 @@
   int n, i;
   char *buffer = (char *) malloc(5 + strlen(text));
 
-  sprintf(buffer, "<-- %s", text);
+  sprintf(buffer, "<== %s", text);
 
   submsgs =
       ut_SplitMessage(buffer, &n, maxX - scr_WindowHeight(rosterWnd) - 20);
@@ -683,18 +687,48 @@
   return 0;
 }
 
+//  check_offset(int direction)
+// Check inputline_offset value, and make sure the cursor is inside the
+// screen.
+inline void check_offset(int direction)
+{
+  // Left side
+  if (inputline_offset && direction <= 0) {
+    while (ptr_inputline <= (char*)&inputLine + inputline_offset) {
+      if (inputline_offset) {
+        inputline_offset -= 5;
+        if (inputline_offset < 0)
+          inputline_offset = 0;
+      }
+    }
+  }
+  // Right side
+  if (direction >= 0) {
+    while (ptr_inputline >= inputline_offset + (char*)&inputLine + maxX)
+      inputline_offset += 5;
+  }
+}
+
 int process_key(int key, int sock)
 {
   if (isprint(key)) {
-    char tmpLine[INPUTLINE_LENGTH];
+    char tmpLine[INPUTLINE_LENGTH+1];
+
+    // Check the line isn't too long
+    if (strlen(inputLine) >= INPUTLINE_LENGTH)
+      return 0;
+
+    // Insert char
     strcpy(tmpLine, ptr_inputline);
     *ptr_inputline++ = key;
     strcpy(ptr_inputline, tmpLine);
+    check_offset(1);
   } else {
     switch(key) {
       case KEY_BACKSPACE:
           if (ptr_inputline != (char*)&inputLine) {
             *--ptr_inputline = 0;
+            check_offset(-1);
           }
           break;
       case KEY_DC:
@@ -704,11 +738,13 @@
       case KEY_LEFT:
           if (ptr_inputline != (char*)&inputLine) {
             ptr_inputline--;
+            check_offset(-1);
           }
           break;
       case KEY_RIGHT:
           if (*ptr_inputline)
             ptr_inputline++;
+            check_offset(1);
           break;
       case 9:     // Tab
           scr_LogPrint("I'm unable to complete yet");
@@ -724,6 +760,7 @@
             return 255;
           ptr_inputline = inputLine;
           *ptr_inputline = 0;
+          inputline_offset = 0;
           break;
       case KEY_UP:
           bud_RosterUp();
@@ -744,19 +781,28 @@
       case KEY_HOME:
       case 1:
           ptr_inputline = inputLine;
+          inputline_offset = 0;
           break;
       case KEY_END:
       case 5:
           for (; *ptr_inputline; ptr_inputline++) ;
+          check_offset(1);
           break;
       case 21:  // Ctrl-u
           strcpy(inputLine, ptr_inputline);
           ptr_inputline = inputLine;
+          inputline_offset = 0;
           break;
       case KEY_EOL:
       case 11:  // Ctrl-k
           *ptr_inputline = 0;
           break;
+      case 16:  // Ctrl-p
+          scr_LogPrint("Ctrl-p not yet implemented");
+          break;
+      case 14:  // Ctrl-n
+          scr_LogPrint("Ctrl-n not yet implemented");
+          break;
       case 27:  // ESC
           currentWindow = NULL;
           chatmode = FALSE;
@@ -764,14 +810,14 @@
           top_panel(inputPanel);
           break;
       default:
-          scr_LogPrint("Unkown key=%o", key);
+          scr_LogPrint("Unkown key=%d", key);
     }
     //scr_LogPrint("[%02x]", key);
   }
-  mvwprintw(inputWnd, 0,0, "%s", inputLine);
+  mvwprintw(inputWnd, 0,0, "%s", inputLine + inputline_offset);
   wclrtoeol(inputWnd);
   if (*ptr_inputline) {
-    wmove(inputWnd, 0, ptr_inputline - (char*)&inputLine);
+    wmove(inputWnd, 0, ptr_inputline - (char*)&inputLine - inputline_offset);
   }
   update_panels();
   doupdate();