Index: apps/recorder/keyboard.c
===================================================================
--- apps/recorder/keyboard.c	(revision 27411)
+++ apps/recorder/keyboard.c	(working copy)
@@ -74,11 +74,13 @@
 #define CHANGED_CURSOR 2
 #define CHANGED_TEXT   3
 
+unsigned short kbd_buf[KBD_BUF_SIZE];
+
 struct keyboard_parameters
 {
-    unsigned short kbd_buf[KBD_BUF_SIZE];
     unsigned short max_line_len;
     int default_lines;
+    int layout_lines;
     int last_k;
     int last_i;
     int font_w;
@@ -92,11 +94,9 @@
     int max_chars;
     int max_chars_text;
     int lines;
-    int pages;
     int keyboard_margin;
     int curpos;
     int leftpos;
-    int page;
     int x;
     int y;
     bool line_edit;
@@ -156,7 +156,7 @@
     if (fd < 0)
         return 1;
 
-    pbuf = kbd_param[0].kbd_buf;
+    pbuf = kbd_buf;
     line_len = 0;
     max_line_len = 1;
     i = 1;
@@ -215,12 +215,8 @@
     FOR_NB_SCREENS(l)
     {
         struct keyboard_parameters *pm = &kbd_param[l];
-#if NB_SCREENS > 1
-        if (l > 0)
-            memcpy(pm->kbd_buf, kbd_param[0].kbd_buf, i*sizeof(unsigned short));
-#endif
         /* initialize parameters */
-        pm->x = pm->y = pm->page = 0;
+        pm->x = pm->y = 0;
         pm->default_lines = 0;
         pm->max_line_len = max_line_len;
     }
@@ -283,23 +279,24 @@
 /* Lookup k value based on state of param (pm) */
 static unsigned short get_kbd_ch(struct keyboard_parameters *pm, int x, int y)
 {
-    int i = 0, k = pm->page*pm->lines + y, n;
+    int i = 0, k = y, n;
     unsigned short *pbuf;
+    
     if (k >= pm->last_k)
     {
         i = pm->last_i;
         k -= pm->last_k;
     }
-    for (pbuf = &pm->kbd_buf[i]; (i = *pbuf) != 0xFEFF; pbuf += i + 1)
+    for (pbuf = &kbd_buf[i]; (i = *pbuf) != 0xFEFF; pbuf += i + 1)
     {
-        n = i ? (i + pm->max_chars - 1) / pm->max_chars : 1;
+        n = i ? (i + pm->max_line_len - 1) / pm->max_line_len : 1;
         if (k < n) break;
         k -= n;
     }
     if (y == 0 && i != 0xFEFF)
     {
-        pm->last_k = pm->page*pm->lines - k;
-        pm->last_i = pbuf - pm->kbd_buf;
+        pm->last_k = - k;
+        pm->last_i = pbuf - kbd_buf;
     }
     k = k * pm->max_chars + x;
     return (*pbuf != 0xFEFF && k < *pbuf)? pbuf[k+1]: ' ';
@@ -365,81 +362,72 @@
     state.hangul = false;
     state.changed = 0;
 
-    if (!kbd_loaded)
+    if (!kbd_loaded)    
     {
-        /* Copy default keyboard to buffer */
-        FOR_NB_SCREENS(l)
-        {
-            struct keyboard_parameters *pm = &param[l];
-            unsigned short *pbuf;
-            const unsigned char *p;
-            int len = 0;
+        unsigned short *pbuf;
+        const unsigned char *p;
+        int len = 0;
 
 #if LCD_WIDTH >= 160 && LCD_HEIGHT >= 96
-            struct screen *sc = &screens[l];
+        p = "ABCDEFG abcdefg !?\" @#$%+'\n"
+            "HIJKLMN hijklmn 789 &_()-`\n"
+            "OPQRSTU opqrstu 456 §|{}/<\n"
+            "VWXYZ., vwxyz.,0123 ~=[]*>\n"
+            "ÀÁÂÃÄÅÆ ÌÍÎÏ ÈÉÊË ¢£¤¥¦§©®\n"
+            "àáâãäåæ ìíîï èéêë «»°ºª¹²³\n"
+            "ÓÒÔÕÖØ ÇÐÞÝß ÙÚÛÜ ¯±×÷¡¿µ·\n"
+            "òóôõöø çðþýÿ ùúûü ¼½¾¬¶¨:;";
 
-            if (sc->getwidth() >= 160 && sc->getheight() >= 96)
-            {
-                p = "ABCDEFG abcdefg !?\" @#$%+'\n"
-                    "HIJKLMN hijklmn 789 &_()-`\n"
-                    "OPQRSTU opqrstu 456 §|{}/<\n"
-                    "VWXYZ., vwxyz.,0123 ~=[]*>\n"
-                    "ÀÁÂÃÄÅÆ ÌÍÎÏ ÈÉÊË ¢£¤¥¦§©®\n"
-                    "àáâãäåæ ìíîï èéêë «»°ºª¹²³\n"
-                    "ÓÒÔÕÖØ ÇÐÞÝß ÙÚÛÜ ¯±×÷¡¿µ·\n"
-                    "òóôõöø çðþýÿ ùúûü ¼½¾¬¶¨:;";
+        param[0].default_lines = 8;
+        param[0].max_line_len = 26;
+        
+#else /* LCD_WIDTH >= 160 && LCD_HEIGHT >= 96 */
+        p = "ABCDEFG !?\" @#$%+'\n"
+            "HIJKLMN 789 &_()-`\n"
+            "OPQRSTU 456 §|{}/<\n"
+            "VWXYZ.,0123 ~=[]*>\n"
 
-                pm->default_lines = 8;
-                pm->max_line_len = 26;
-            }
-            else
-#endif /* LCD_WIDTH >= 160 && LCD_HEIGHT >= 96 */
-            {
-                p = "ABCDEFG !?\" @#$%+'\n"
-                    "HIJKLMN 789 &_()-`\n"
-                    "OPQRSTU 456 §|{}/<\n"
-                    "VWXYZ.,0123 ~=[]*>\n"
+            "abcdefg ¢£¤¥¦§©®¬\n"
+            "hijklmn «»°ºª¹²³¶\n"
+            "opqrstu ¯±×÷¡¿µ·¨\n"
+            "vwxyz., :;¼½¾    \n"
 
-                    "abcdefg ¢£¤¥¦§©®¬\n"
-                    "hijklmn «»°ºª¹²³¶\n"
-                    "opqrstu ¯±×÷¡¿µ·¨\n"
-                    "vwxyz., :;¼½¾    \n"
+            "ÀÁÂÃÄÅÆ ÌÍÎÏ ÈÉÊË\n"
+            "àáâãäåæ ìíîï èéêë\n"
+            "ÓÒÔÕÖØ ÇÐÞÝß ÙÚÛÜ\n"
+            "òóôõöø çðþýÿ ùúûü";
 
-                    "ÀÁÂÃÄÅÆ ÌÍÎÏ ÈÉÊË\n"
-                    "àáâãäåæ ìíîï èéêë\n"
-                    "ÓÒÔÕÖØ ÇÐÞÝß ÙÚÛÜ\n"
-                    "òóôõöø çðþýÿ ùúûü";
-
-                pm->default_lines = 4;
-                pm->max_line_len = 18;
-            }
-
-            pbuf = pm->kbd_buf;
-            while (*p)
+        param[0].default_lines = 4;
+        param[0].max_line_len = 18;
+#endif
+        pbuf = kbd_buf;
+        while (*p)
+        {
+            p = utf8decode(p, &pbuf[len+1]);
+            if (pbuf[len+1] == '\n')
             {
-                p = utf8decode(p, &pbuf[len+1]);
-                if (pbuf[len+1] == '\n')
-                {
-                    *pbuf = len;
-                    pbuf += len+1;
-                    len = 0;
-                }
-                else
-                    len++;
+                *pbuf = len;
+                pbuf += len+1;
+                len = 0;
             }
-            *pbuf = len;
-            pbuf[len+1] = 0xFEFF;   /* mark end of characters */
-
-            /* initialize parameters */
-            pm->x = pm->y = pm->page = 0;
+            else
+                len++;
         }
-        kbd_loaded = true;
+        *pbuf = len;
+        pbuf[len+1] = 0xFEFF;   /* mark end of characters */
+
     }
+    kbd_loaded = true;
+    
 
     FOR_NB_SCREENS(l)
     {
         struct keyboard_parameters *pm = &param[l];
         struct screen *sc = &screens[l];
+        pm->x = pm->y = 0;
+        pm->line_edit = false;
+        pm->default_lines = param[0].default_lines;
+        pm->max_line_len  = param[0].max_line_len;
         kbd_calc_params(pm, sc, &state);
     }
 
@@ -496,8 +484,10 @@
 #if NB_SCREENS > 1
         button_screen = (get_action_statuscode(NULL) & ACTION_REMOTE) ? 1 : 0;
 #endif
-        pm = &param[button_screen];
-        sc = &screens[button_screen];
+//        pm = &param[button_screen];
+//        sc = &screens[button_screen];        
+        pm = &param[0];
+        sc = &screens[0];
 #ifdef HAVE_TOUCHSCREEN
         if (button == ACTION_TOUCHSCREEN)
             button = keyboard_touchscreen(pm, sc, &state);
@@ -530,17 +520,6 @@
                 done = true;
                 break;
 
-            case ACTION_KBD_PAGE_FLIP:
-#ifdef HAVE_MORSE_INPUT
-                if (state.morse_mode)
-                    break;
-#endif
-                if (++pm->page >= pm->pages)
-                    pm->page = 0;
-
-                state.changed = CHANGED_PICKER;
-                break;
-
             case ACTION_KBD_RIGHT:
                 kbd_move_picker_horizontal(pm, &state, 1);
                 break;
@@ -652,7 +631,12 @@
                 break;
 
         } /* end switch */
-
+        FOR_NB_SCREENS(l)
+        {
+            param[l].x = param[0].x;
+            param[l].y = param[0].y;
+            param[l].line_edit = param[0].line_edit;
+        }
         if (button != ACTION_NONE)
         {
             state.cur_blink = true;
@@ -719,7 +703,6 @@
     int i, total_lines;
 #ifdef HAVE_TOUCHSCREEN
     int button_h = 0;
-    bool flippage_button = false;
     pm->show_buttons = (sc->screen_type == SCREEN_MAIN &&
                                 (touchscreen_get_mode() == TOUCHSCREEN_POINT));
 #endif
@@ -743,7 +726,7 @@
      * since we're going to be adding spaces,
      * max width is at least their width */
     pm->font_w = font_get_width(font, ' ');
-    for (pbuf = pm->kbd_buf; *pbuf != 0xFEFF; pbuf += i)
+    for (pbuf = kbd_buf; *pbuf != 0xFEFF; pbuf += i)
     {
         for (i = 0; ++i <= *pbuf; )
         {
@@ -773,11 +756,13 @@
     if (pm->font_w < sc_w / pm->max_line_len)
         pm->font_w = sc_w / pm->max_line_len;
     pm->max_chars = sc_w / pm->font_w;
+    if ( pm->max_chars > pm->max_line_len )
+        pm->max_chars = pm->max_line_len;
     pm->max_chars_text = (sc_w - icon_w * 2 - 2) / pm->text_w;
     if (pm->max_chars_text < 3 && icon_w > pm->text_w)
         pm->max_chars_text = sc_w / pm->text_w - 2;
 
-    /* calculate pm->pages and pm->lines */
+    /* calculate and pm->lines */
     sc_h = sc->getheight();
 #ifdef HAVE_TOUCHSCREEN
     /* add space for buttons */
@@ -807,30 +792,20 @@
         pm->keyboard_margin = DEFAULT_MARGIN;
 
     total_lines = 0;
-    for (pbuf = pm->kbd_buf; (i = *pbuf) != 0xFEFF; pbuf += i + 1)
-        total_lines += (i ? (i + pm->max_chars - 1) / pm->max_chars : 1);
+    for (pbuf = kbd_buf; (i = *pbuf) != 0xFEFF; pbuf += i + 1)
+        total_lines += (i ? (i + pm->max_line_len - 1) / pm->max_line_len : 1);
+    pm->layout_lines = total_lines;
 
-    pm->pages = (total_lines + pm->lines - 1) / pm->lines;
-    pm->lines = (total_lines + pm->pages - 1) / pm->pages;
 #ifdef HAVE_TOUCHSCREEN
-    if (pm->pages > 1 && pm->show_buttons && !flippage_button)
-    {
-        /* add space for flip page button */
-        sc_h -= button_h;
-        flippage_button = true;
-        goto recalc_param;
-    }
+    pm->lines = ( (sc_h -BUTTONBAR_HEIGHT -button_h -pm->font_h -2*pm->keyboard_margin) / 
+                  pm->font_h );
+#else
+    pm->lines = ( (sc_h -BUTTONBAR_HEIGHT -pm->font_h -2*pm->keyboard_margin) / 
+                  pm->font_h );
 #endif
-    if (pm->page >= pm->pages)
-        pm->x = pm->y = pm->page = 0;
 
     pm->main_y = pm->font_h*pm->lines + pm->keyboard_margin;
     pm->keyboard_margin -= pm->keyboard_margin/2;
-#ifdef HAVE_TOUCHSCREEN
-    /* flip page button is put between piker and edit line */
-    if (flippage_button)
-        pm->main_y += button_h;
-#endif
 
 #ifdef HAVE_MORSE_INPUT
     pm->old_main_y = sc_h - pm->font_h - BUTTONBAR_HEIGHT;
@@ -903,14 +878,33 @@
         int w, h;
         unsigned short ch;
         unsigned char *utf8;
+        int x_offset = 0, y_offset = 0;
 
         sc->setfont(pm->curfont);
 
+       if( pm->max_chars < pm->max_line_len )
+        {
+            x_offset = pm->x - pm->max_chars/2;
+            if( x_offset > pm->max_line_len - pm->max_chars )
+                x_offset = pm->max_line_len - pm->max_chars;
+        }
+        if( x_offset < 0 )
+            x_offset = 0;
+        
+        if( pm->lines < pm->layout_lines )
+        {
+            y_offset = pm->y - pm->lines/2;
+            if (y_offset > pm->layout_lines - pm->lines )
+                y_offset = pm->layout_lines - pm->lines;
+        }
+        if ( y_offset < 0 )
+            y_offset = 0;
+
         for (j = 0; j < pm->lines; j++)
         {
             for (i = 0; i < pm->max_chars; i++)
             {
-                ch = get_kbd_ch(pm, i, j);
+                ch = get_kbd_ch(pm, i+x_offset, j+y_offset);
                 utf8 = utf8encode(ch, outline);
                 *utf8 = 0;
 
@@ -924,7 +918,8 @@
         {
             /* highlight the key that has focus */
             sc->set_drawmode(DRMODE_COMPLEMENT);
-            sc->fillrect(pm->font_w*pm->x, pm->font_h*pm->y,
+            sc->fillrect(pm->font_w*(pm->x-x_offset), 
+                         pm->font_h*(pm->y-y_offset),
                          pm->font_w, pm->font_h);
             sc->set_drawmode(DRMODE_SOLID);
         }
@@ -1032,13 +1027,6 @@
     vp.width = sc_w;
     vp.height = button_h;
     /* draw buttons */
-    if (pm->pages > 1)
-    {
-        /* button to flip page. */
-        vp.y = pm->lines*pm->font_h;
-        sc->hline(0, sc_w - 1, 0);
-        sc->putsxy(0, text_y, ">");
-    }
     /* OK/Del/Cancel buttons */
     button_h = MAX(MIN_GRID_SIZE*2, button_h);
     text_y = (button_h - text_h) / 2 + 1;
@@ -1088,12 +1076,6 @@
                 return ACTION_KBD_SELECT;
         }
     }
-    else if (y < pm->main_y - pm->keyboard_margin)
-    {
-        /* button to flip page */
-        if (button == BUTTON_REL)
-            return ACTION_KBD_PAGE_FLIP;
-    }
     else if (y < sc_h - button_h)
     {
         /* edit line */
@@ -1247,14 +1229,10 @@
     pm->x += dir;
     if (pm->x < 0)
     {
-        if (--pm->page < 0)
-            pm->page = pm->pages - 1;
-        pm->x = pm->max_chars - 1;
+        pm->x = pm->max_line_len - 1;
     }
-    else if (pm->x >= pm->max_chars)
+    else if (pm->x >= pm->max_line_len)
     {
-        if (++pm->page >= pm->pages)
-            pm->page = 0;
         pm->x = 0;
     }
 }
@@ -1275,10 +1253,10 @@
     pm->y += dir;
     if (pm->line_edit)
     {
-        pm->y = (dir > 0 ? 0 : pm->lines - 1);
+        pm->y = (dir > 0 ? 0 : pm->layout_lines - 1);
         pm->line_edit = false;
     }
-    else if (pm->y < 0 || pm->y >= pm->lines)
+    else if (pm->y < 0 || pm->y >= pm->layout_lines)
     {
         pm->line_edit = true;
     }
