File _service:download_src_package:mc-utf8-look-and-feel.patch of Package mc

Index: mc-4.6.2~git20080311/src/main.c
================================================================================
--- mc-4.6.2/src/main.c
+++ mc-4.6.2/src/main.c
@@ -276,6 +276,9 @@
 /* The user's shell */
 const char *shell = NULL;
 
+/* Is the LANG UTF-8 ? */
+gboolean is_utf8 = FALSE;
+
 /* mc_home: The home of MC */
 char *mc_home = NULL;
 
@@ -2126,6 +2129,16 @@
 int
 main (int argc, char *argv[])
 {
+    /* Check whether we have UTF-8 locale */
+    char *lang = getenv("LANG");
+    size_t len = 0;
+    
+    if ( lang )
+    	len = strlen(lang);
+    
+    if ( len >= 5 && !strcasecmp(&lang[len-5],"UTF-8") )
+	is_utf8 = TRUE;
+
     /* We had LC_CTYPE before, LC_ALL includs LC_TYPE as well */
     setlocale (LC_ALL, "");
     bindtextdomain ("mc", LOCALEDIR);
--- mc-4.6.2/src/main.h
+++ mc-4.6.2/src/main.h
@@ -69,6 +69,7 @@
 extern int only_leading_plus_minus;
 extern int output_starts_shell;
 extern int midnight_shutdown;
+extern gboolean is_utf8;
 extern char cmd_buf [512];
 extern const char *shell;
 
--- mc-4.6.2/src/screen.c
+++ mc-4.6.2/src/screen.c
@@ -892,6 +892,9 @@
     }
 #endif				/* HAVE_SLANG */
 
+    vscrollbar (panel->widget, panel->widget.lines, panel->widget.cols-1, 2, 2,
+		panel->selected, panel->count, TRUE);
+
     if (panel->active)
 	attrset (REVERSE_COLOR);
 
@@ -1493,7 +1496,7 @@
     panel->dirty = 1;
 
     /* Status needn't to be split */
-    usable_columns = ((panel->widget.cols-2)/((isstatus)
+    usable_columns = ((panel->widget.cols-3)/((isstatus)
 					      ? 1
 					      : (panel->split+1))) - (!isstatus && panel->split);
 
--- mc-4.6.2/src/widget.c
+++ mc-4.6.2/src/widget.c
@@ -1944,52 +1944,86 @@
     return in;
 }
 
-
-/* Listbox widget */
+/* Vertical scrollbar widget */
 
-/* Should draw the scrollbar, but currently draws only
- * indications that there is more information
- */
-static int listbox_cdiff (WLEntry *s, WLEntry *e);
-
-static void
-listbox_drawscroll (WListbox *l)
+void
+vscrollbar (Widget widget, int height, int width, int tpad, int bpad,
+            int selected, int count, gboolean color)
 {
     int line;
-    int i, top;
-    int max_line = l->height-1;
-    
+    int i;
+
     /* Are we at the top? */
-    widget_move (&l->widget, 0, l->width);
-    if (l->list == l->top)
-	one_vline ();
+    widget_move (&widget, tpad, width);
+#ifndef UTF8
+    if (!selected)
+        one_vline ();
     else
-	addch ('^');
+        addch ('^');
+#else
+    if (color) attrset (MARKED_COLOR);
+    if (is_utf8)
+	SLsmg_write_string("▴");
+    else
+        addch ('^');
+    if (color) attrset (NORMAL_COLOR);
+#endif
 
     /* Are we at the bottom? */
-    widget_move (&l->widget, max_line, l->width);
-    top = listbox_cdiff (l->list, l->top);
-    if ((top + l->height == l->count) || l->height >= l->count)
-	one_vline ();
+    widget_move (&widget, height-1-bpad, width);
+#ifndef UTF8
+    if (selected == count-1)
+        one_vline ();
+    else
+        addch ('v');
+#else
+    if (color) attrset (MARKED_COLOR);
+    if (is_utf8)
+	SLsmg_write_string("▾");
     else
-	addch ('v');
+	addch('v');
+    if (color) attrset (NORMAL_COLOR);
+#endif
 
     /* Now draw the nice relative pointer */
-    if (l->count)
-	line = 1+ ((l->pos * (l->height-2)) / l->count);
+    if (count > 1)
+        line = tpad + 1 + ((selected * (height-3-tpad-bpad)) / (count-1));
     else
-	line = 0;
-    
-    for (i = 1; i < max_line; i++){
-	widget_move (&l->widget, i, l->width);
-	if (i != line)
-	    one_vline ();
-	else
-	    addch ('*');
+        line = 0;
+
+    for (i = tpad + 1; i < height-1-bpad; i++){
+        widget_move (&widget, i, width);
+        if (i != line)
+#ifndef UTF8
+            one_vline ();
+        else
+            addch ('*');
+#else
+            if (is_utf8)
+		SLsmg_write_string("▒");
+	    else
+		one_vline();
+        else {
+            if (color) attrset (MARKED_COLOR);
+            if (is_utf8)
+		SLsmg_write_string("◈");
+	    else
+		addch('*');
+            if (color) attrset (NORMAL_COLOR);
+        }
+#endif
     }
 }
-    
-static void
+
+
+/* Listbox widget */
+
+/* Should draw the scrollbar, but currently draws only
+ * indications that there is more information
+ */
+static int listbox_cdiff (WLEntry *s, WLEntry *e);
+
+void
 listbox_draw (WListbox *l, int focused)
 {
     WLEntry *e;
@@ -2032,7 +2066,7 @@
     if (!l->scrollbar)
 	return;
     attrset (normalc);
-    listbox_drawscroll (l);
+    vscrollbar (l->widget, l->height, l->width, 0, 0, l->pos, l->count, FALSE);
 }
 
 /* Returns the number of items between s and e,
--- mc-4.6.2/src/widget.h
+++ mc-4.6.2/src/widget.h
@@ -187,6 +187,10 @@
 /* Listbox manager */
 WLEntry *listbox_get_data (WListbox *l, int pos);
 
+/* Vertical scrollbar */
+void vscrollbar (Widget widget, int height, int width, int tpad, int bpad,
+        	int selected, int count, gboolean color);
+
 /* search text int listbox entries */
 WLEntry *listbox_search_text (WListbox *l, const char *text);
 void listbox_select_entry (WListbox *l, WLEntry *dest);