59587e5
--- mc-4.6.1a/src/main.c.laf	2005-11-24 16:55:06.000000000 +0100
59587e5
+++ mc-4.6.1a/src/main.c	2005-11-24 16:56:27.000000000 +0100
ebf06bc
@@ -270,6 +270,9 @@ int midnight_shutdown = 0;
ebf06bc
 /* The user's shell */
ebf06bc
 const char *shell = NULL;
ebf06bc
 
ebf06bc
+/* Is the LANG UTF-8 ? */
ebf06bc
+gboolean is_utf8 = FALSE;
ebf06bc
+
ebf06bc
 /* The xterm title */
ebf06bc
 char *xterm_title_str = NULL;
ebf06bc
 
59587e5
@@ -2167,6 +2170,16 @@ main (int argc, char *argv[])
ebf06bc
     /* if on, it displays the information that files have been moved to ~/.mc */
ebf06bc
     int show_change_notice = 0;
ebf06bc
 
ebf06bc
+    /* Check whether we have UTF-8 locale */
ebf06bc
+    char *lang = getenv("LANG");
59587e5
+    size_t len = 0;
59587e5
+    
59587e5
+    if ( lang )
59587e5
+    	len = strlen(lang);
ebf06bc
+    
ebf06bc
+    if ( len >= 5 && !strcasecmp(&lang[len-5],"UTF-8") )
ebf06bc
+	is_utf8 = TRUE;
ebf06bc
+
ebf06bc
     /* We had LC_CTYPE before, LC_ALL includs LC_TYPE as well */
ebf06bc
     setlocale (LC_ALL, "");
ebf06bc
     bindtextdomain ("mc", LOCALEDIR);
59587e5
--- mc-4.6.1a/src/main.h.laf	2005-11-24 16:55:06.000000000 +0100
59587e5
+++ mc-4.6.1a/src/main.h	2005-11-24 16:55:06.000000000 +0100
ebf06bc
@@ -67,6 +67,7 @@ extern int alternate_plus_minus;
ebf06bc
 extern int only_leading_plus_minus;
ebf06bc
 extern int output_starts_shell;
ebf06bc
 extern int midnight_shutdown;
ebf06bc
+extern gboolean is_utf8;
ebf06bc
 extern char *xterm_title_str;
ebf06bc
 extern char cmd_buf [512];
ebf06bc
 extern const char *shell;
59587e5
--- mc-4.6.1a/src/widget.c.laf	2005-11-24 16:55:06.000000000 +0100
59587e5
+++ mc-4.6.1a/src/widget.c	2005-11-24 16:55:06.000000000 +0100
ebf06bc
@@ -1948,52 +1948,86 @@ input_new (int y, int x, int color, int 
d42c8be
     return in;
d42c8be
 }
d42c8be
 
d42c8be
-
d42c8be
-/* Listbox widget */
d42c8be
-
d42c8be
-/* Should draw the scrollbar, but currently draws only
d42c8be
- * indications that there is more information
d42c8be
- */
d42c8be
-static int listbox_cdiff (WLEntry *s, WLEntry *e);
d42c8be
+/* Vertical scrollbar widget */
d42c8be
 
d42c8be
-static void
d42c8be
-listbox_drawscroll (WListbox *l)
d42c8be
+void
d42c8be
+vscrollbar (Widget widget, int height, int width, int tpad, int bpad,
d42c8be
+            int selected, int count, gboolean color)
d42c8be
 {
d42c8be
     int line;
d42c8be
-    int i, top;
d42c8be
-    int max_line = l->height-1;
d42c8be
-    
d42c8be
+    int i;
d42c8be
+
d42c8be
     /* Are we at the top? */
d42c8be
-    widget_move (&l->widget, 0, l->width);
d42c8be
-    if (l->list == l->top)
d42c8be
-	one_vline ();
d42c8be
+    widget_move (&widget, tpad, width);
d42c8be
+#ifndef UTF8
d42c8be
+    if (!selected)
d42c8be
+        one_vline ();
d42c8be
     else
d42c8be
-	addch ('^');
d42c8be
+        addch ('^');
d42c8be
+#else
d42c8be
+    if (color) attrset (MARKED_COLOR);
ebf06bc
+    if (is_utf8)
49c5cab
+	SLsmg_write_string("↑");
ebf06bc
+    else
ebf06bc
+        addch ('^');
d42c8be
+    if (color) attrset (NORMAL_COLOR);
d42c8be
+#endif
d42c8be
 
d42c8be
     /* Are we at the bottom? */
d42c8be
-    widget_move (&l->widget, max_line, l->width);
d42c8be
-    top = listbox_cdiff (l->list, l->top);
d42c8be
-    if ((top + l->height == l->count) || l->height >= l->count)
d42c8be
-	one_vline ();
d42c8be
+    widget_move (&widget, height-1-bpad, width);
d42c8be
+#ifndef UTF8
d42c8be
+    if (selected == count-1)
d42c8be
+        one_vline ();
ebf06bc
+    else
d42c8be
+        addch ('v');
d42c8be
+#else
d42c8be
+    if (color) attrset (MARKED_COLOR);
ebf06bc
+    if (is_utf8)
49c5cab
+	SLsmg_write_string("↓");
ebf06bc
     else
ebf06bc
-	addch ('v');
ebf06bc
+	addch('v');
d42c8be
+    if (color) attrset (NORMAL_COLOR);
d42c8be
+#endif
d42c8be
 
d42c8be
     /* Now draw the nice relative pointer */
d42c8be
-    if (l->count)
d42c8be
-	line = 1+ ((l->pos * (l->height-2)) / l->count);
d42c8be
+    if (count > 1)
d42c8be
+        line = tpad + 1 + ((selected * (height-3-tpad-bpad)) / (count-1));
d42c8be
     else
d42c8be
-	line = 0;
d42c8be
-    
d42c8be
-    for (i = 1; i < max_line; i++){
d42c8be
-	widget_move (&l->widget, i, l->width);
d42c8be
-	if (i != line)
d42c8be
-	    one_vline ();
d42c8be
-	else
d42c8be
-	    addch ('*');
d42c8be
+        line = 0;
d42c8be
+
d42c8be
+    for (i = tpad + 1; i < height-1-bpad; i++){
d42c8be
+        widget_move (&widget, i, width);
d42c8be
+        if (i != line)
d42c8be
+#ifndef UTF8
d42c8be
+            one_vline ();
d42c8be
+        else
d42c8be
+            addch ('*');
d42c8be
+#else
ebf06bc
+            if (is_utf8)
ebf06bc
+		SLsmg_write_string("▒");
ebf06bc
+	    else
ebf06bc
+		one_vline();
d42c8be
+        else {
d42c8be
+            if (color) attrset (MARKED_COLOR);
ebf06bc
+            if (is_utf8)
49c5cab
+		SLsmg_write_string("▮");
ebf06bc
+	    else
ebf06bc
+		addch('*');
d42c8be
+            if (color) attrset (NORMAL_COLOR);
d42c8be
+        }
d42c8be
+#endif
d42c8be
     }
d42c8be
 }
d42c8be
-    
d42c8be
-static void
d42c8be
+
d42c8be
+
d42c8be
+/* Listbox widget */
d42c8be
+
d42c8be
+/* Should draw the scrollbar, but currently draws only
d42c8be
+ * indications that there is more information
d42c8be
+ */
d42c8be
+static int listbox_cdiff (WLEntry *s, WLEntry *e);
d42c8be
+
d42c8be
+void
d42c8be
 listbox_draw (WListbox *l, int focused)
d42c8be
 {
d42c8be
     WLEntry *e;
ebf06bc
@@ -2034,7 +2068,7 @@ listbox_draw (WListbox *l, int focused)
d42c8be
     if (!l->scrollbar)
d42c8be
 	return;
d42c8be
     attrset (normalc);
d42c8be
-    listbox_drawscroll (l);
d42c8be
+    vscrollbar (l->widget, l->height, l->width, 0, 0, l->pos, l->count, FALSE);
d42c8be
 }
d42c8be
 
d42c8be
 /* Returns the number of items between s and e,
59587e5
--- mc-4.6.1a/src/screen.c.laf	2005-11-24 16:55:06.000000000 +0100
59587e5
+++ mc-4.6.1a/src/screen.c	2005-11-24 16:55:06.000000000 +0100
ebf06bc
@@ -888,6 +888,9 @@ show_dir (WPanel *panel)
d42c8be
     }
d42c8be
 #endif				/* HAVE_SLANG */
d42c8be
 
d42c8be
+    vscrollbar (panel->widget, panel->widget.lines, panel->widget.cols-1, 2, 2,
d42c8be
+		panel->selected, panel->count, TRUE);
d42c8be
+
d42c8be
     if (panel->active)
d42c8be
 	attrset (REVERSE_COLOR);
d42c8be
 
ebf06bc
@@ -1504,7 +1507,7 @@ use_display_format (WPanel *panel, const
d42c8be
     panel->dirty = 1;
d42c8be
 
d42c8be
     /* Status needn't to be split */
d42c8be
-    usable_columns = ((panel->widget.cols-2)/((isstatus)
d42c8be
+    usable_columns = ((panel->widget.cols-3)/((isstatus)
d42c8be
 					      ? 1
d42c8be
 					      : (panel->split+1))) - (!isstatus && panel->split);
d42c8be
 
59587e5
--- mc-4.6.1a/src/widget.h.laf	2005-11-24 16:55:06.000000000 +0100
59587e5
+++ mc-4.6.1a/src/widget.h	2005-11-24 16:55:06.000000000 +0100
d42c8be
@@ -170,6 +170,10 @@ void button_set_text (WButton *b, const 
d42c8be
 /* Listbox manager */
d42c8be
 WLEntry *listbox_get_data (WListbox *l, int pos);
d42c8be
 
d42c8be
+/* Vertical scrollbar */
d42c8be
+void vscrollbar (Widget widget, int height, int width, int tpad, int bpad,
d42c8be
+        	int selected, int count, gboolean color);
d42c8be
+
d42c8be
 /* search text int listbox entries */
d42c8be
 WLEntry *listbox_search_text (WListbox *l, const char *text);
d42c8be
 void listbox_select_entry (WListbox *l, WLEntry *dest);