Index: neercs/trunk/src/main.c
===================================================================
--- neercs/trunk/src/main.c	(revision 2456)
+++ neercs/trunk/src/main.c	(revision 2457)
@@ -75,4 +75,5 @@
     int eof = 0, refresh = 1, command = 0;
     long long unsigned int last_key_time = 0;
+    int lock_offset = 0;
 
     default_shell = getenv("SHELL");
@@ -125,4 +126,7 @@
     screen_list->screensaver_data = NULL;
     screen_list->in_screensaver = 0;
+    screen_list->locked = 0;
+    memset(screen_list->lockmsg, 0, 1024);
+    memset(screen_list->lockpass, 0, 1024);
 
     recurrent_list = (struct recurrent_list*) malloc(sizeof(struct recurrent_list));
@@ -215,5 +219,4 @@
         {
             unsigned int c = caca_get_event_key_ch(&ev);
-
             if(command)
             {
@@ -265,4 +268,11 @@
                     refresh = 1;
                     break;
+                case 'x':
+                case 0x18: //CACA_KEY_CTRL_X:
+                    memset(screen_list->lockpass, 0, 1024);
+                    screen_list->locked = 1;
+                    lock_offset = 0;
+                    refresh = 1;
+                    break;
                 case 'h':
                 case 0x08: //CACA_KEY_CTRL_H:
@@ -285,27 +295,64 @@
                     continue;
                 }
-
-
-                switch(c)
+                else if(screen_list->locked)
                 {
-                case 0x01: //CACA_KEY_CTRL_A:
-                    command = 1; break;
-                case CACA_KEY_UP:
-                    write(screen_list->screen[screen_list->pty]->fd, "\x1b[A", 3); break;
-                case CACA_KEY_DOWN:
-                    write(screen_list->screen[screen_list->pty]->fd, "\x1b[B", 3); break;
-                case CACA_KEY_RIGHT:
-                    write(screen_list->screen[screen_list->pty]->fd, "\x1b[C", 3); break;
-                case CACA_KEY_LEFT:
-                    write(screen_list->screen[screen_list->pty]->fd, "\x1b[D", 3); break;
-                case CACA_KEY_ESCAPE:
-                    if(screen_list->help)
+                    if(c==0x08)
                     {
-                        screen_list->help = 0;
-                        refresh = 1;
-                        break;
+                        if(lock_offset)
+                        {
+                            screen_list->lockpass[lock_offset-1] = 0;
+                            lock_offset--;
+                        }
                     }
-                default:
-                    write(screen_list->screen[screen_list->pty]->fd, &c, 1); break;
+                    else if(c==0x0d) // RETURN
+                    {
+                        memset(screen_list->lockmsg, 0, 1024);
+                        if(validate_lock(screen_list, getenv("USER"), screen_list->lockpass))
+                        {
+                            memset(screen_list->lockpass, 0, 1024);
+                            screen_list->locked = 0;
+                            lock_offset = 0;
+                            refresh = 1;
+                        }
+                        else
+                        {
+                            memset(screen_list->lockpass, 0, 1024);
+                            lock_offset = 0;
+                            refresh = 1;
+                        }
+                    }
+                    else
+                    {
+                        if(lock_offset < 1023)
+                        {
+                            screen_list->lockpass[lock_offset++] = c;
+                            screen_list->lockpass[lock_offset]   = 0;
+                        }
+                    }
+                }
+                else
+                {
+                    switch(c)
+                    {
+                    case 0x01: //CACA_KEY_CTRL_A:
+                        command = 1; break;
+                    case CACA_KEY_UP:
+                        write(screen_list->screen[screen_list->pty]->fd, "\x1b[A", 3); break;
+                    case CACA_KEY_DOWN:
+                        write(screen_list->screen[screen_list->pty]->fd, "\x1b[B", 3); break;
+                    case CACA_KEY_RIGHT:
+                        write(screen_list->screen[screen_list->pty]->fd, "\x1b[C", 3); break;
+                    case CACA_KEY_LEFT:
+                        write(screen_list->screen[screen_list->pty]->fd, "\x1b[D", 3); break;
+                    case CACA_KEY_ESCAPE:
+                        if(screen_list->help)
+                        {
+                            screen_list->help = 0;
+                            refresh = 1;
+                            break;
+                        }
+                    default:
+                        write(screen_list->screen[screen_list->pty]->fd, &c, 1); break;
+                    }
                 }
             }
@@ -344,23 +391,34 @@
 
         /* Resfresh screen */
-        if((refresh || screen_list->in_bell) &&
-           (get_ms() - last_key_time < screen_list->screensaver_timeout))
-        {
-            refresh = 0;
-            refresh_screens(cv, dp, screen_list);
-        }
-        if((get_ms() - last_key_time > screen_list->screensaver_timeout))
-        {
-            if(!screen_list->in_screensaver)
-                screensaver_init(cv, dp, screen_list);
-            screen_list->in_screensaver = 1;
-
-            caca_set_cursor(dp, 0);
-            draw_screensaver(cv, dp, screen_list);
+
+        if(screen_list->locked)
+        {
+            draw_lock(cv, screen_list);
             caca_refresh_display(dp);
         }
+        else
+        {
+
+            if((refresh || screen_list->in_bell) &&
+               (get_ms() - last_key_time < screen_list->screensaver_timeout))
+            {
+                refresh = 0;
+                refresh_screens(cv, dp, screen_list);
+            }
+
+            if((get_ms() - last_key_time > screen_list->screensaver_timeout))
+            {
+                if(!screen_list->in_screensaver)
+                    screensaver_init(cv, dp, screen_list);
+                screen_list->in_screensaver = 1;
+
+                caca_set_cursor(dp, 0);
+                draw_screensaver(cv, dp, screen_list);
+                caca_refresh_display(dp);
+            }
+        }
 
         eof = 1;
-        for(i = 0; i < screen_list->count; i++)
+        for(i=0; i < screen_list->count; i++)
             if(screen_list->screen[i]->fd >= 0)
                 eof = 0;
