LINUX.ORG.RU

ROX-Filer и не юникодная локаль. Патч


0

0

Здравствуйте. Вот помучившись с роксом (2.1.1) решил сам покапаться
в исходниках и поправить ситуацию. Вроде получилось (хотя местами
коряво, но я первый раз смотрел GTK-программу).
Вот патч:

diff -Nu src.old/display.c src/display.c
--- src.old/display.c	2003-08-02 17:01:07.000000000 +0400
+++ src/display.c	2004-02-26 15:27:34.811200504 +0300
@@ -741,20 +741,12 @@
 	}
 	else
 	{
-		PangoAttribute	*attr;
 		gchar *utf8;
 
 		utf8 = to_utf8(item->leafname);
 		view->layout = gtk_widget_create_pango_layout(
 				filer_window->window, utf8);
 		g_free(utf8);
-
-		attr = pango_attr_foreground_new(0xffff, 0, 0);
-		attr->start_index = 0;
-		attr->end_index = -1;
-		if (!list)
-			list = pango_attr_list_new();
-		pango_attr_list_insert(list, attr);
 	}
 
 	if (item->flags & ITEM_FLAG_RECENT)
diff -Nu src.old/filer.c src/filer.c
--- src.old/filer.c	2003-10-26 19:14:28.000000000 +0300
+++ src/filer.c	2004-02-26 15:27:46.764383344 +0300
@@ -2015,11 +2015,6 @@
 		if (info)
 			g_object_unref(info);
 	}
-
-	if (!g_utf8_validate(item->leafname, -1, NULL))
-		g_string_append(tip,
-			_("This filename is not valid UTF-8. "
-			  "You should rename it.\n"));
 }
 
 /* Return the selection as a text/uri-list.
diff -Nu src.old/infobox.c src/infobox.c
--- src.old/infobox.c	2004-01-24 22:00:22.000000000 +0300
+++ src/infobox.c	2004-02-26 15:21:18.581396128 +0300
@@ -122,21 +122,26 @@
 void infobox_new(const gchar *pathname)
 {
 	GtkWidget	*window, *details;
-	gchar		*path;
+	gchar		*path,*utf8_path;
 	GObject		*owindow;
 
 	g_return_if_fail(pathname != NULL);
 
+
 	path = g_strdup(pathname); /* Gets attached to window & freed later */
 
+    	utf8_path=g_strdup(pathname);
+	ensure_utf8(&utf8_path);
+
 	window = gtk_dialog_new_with_buttons(
-			g_utf8_validate(path, -1, NULL) ? path
-							: _("(bad utf-8)"),
+				utf8_path,
 				NULL, GTK_DIALOG_NO_SEPARATOR,
 				GTK_STOCK_CANCEL, GTK_RESPONSE_DELETE_EVENT,
 				GTK_STOCK_REFRESH, GTK_RESPONSE_APPLY,
 				NULL);
 
+	g_free(utf8_path);
+
 	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE);
 
 	owindow = G_OBJECT(window);
@@ -443,27 +448,28 @@
 
 static gboolean read_du_output(GIOChannel *source, GIOCondition cond, DU *du)
 {
-	GString *line;
 	GIOStatus stat;
 	GError *err = NULL;
 
-	line = g_string_new("");
-	stat = g_io_channel_read_line_string(source, line, NULL, &err);
+	gsize size=250;
+	gchar *line=g_new(gchar,size+1);
+	
+	stat = g_io_channel_read_chars(source, line, size, &size, &err);
 	switch (stat)
 	{
 		case G_IO_STATUS_NORMAL:
-			insert_size(du, line->str);
+			insert_size(du, line);
 			break;
 		case G_IO_STATUS_EOF:
 			break;
 		case G_IO_STATUS_AGAIN:
-			g_string_free(line, TRUE);
+			g_free(line);
 			return TRUE;
 		case G_IO_STATUS_ERROR:
 			set_cell(du->store, du->path, err->message);
 			break;
 	}
-	g_string_free(line, TRUE);
+	g_free(line);
 	
 	return FALSE;
 }
@@ -544,11 +550,13 @@
 	g_object_set_data(G_OBJECT(store), "rox_window", window);
 
 	/* For a symlink to an error, don't show the error */
+/*
 	if (item->base_type == TYPE_ERROR && item->lstat_errno)
 	{
 		add_row(store, _("Error:"), g_strerror(item->lstat_errno));
 		return view;
 	}
+*/
 
 	tmp = g_path_get_dirname(path);
 	tmp2 = pathdup(tmp);
@@ -581,6 +589,7 @@
 		du->path = g_strdup(add_row(store, _("Size:"), _("Scanning")));
 
 		args[2] = (gchar *) path;
+		
 		if (g_spawn_async_with_pipes(NULL, args, NULL,
 					    G_SPAWN_SEARCH_PATH,
 					    NULL, NULL, &du->child,
diff -Nu src.old/menu.c src/menu.c
--- src.old/menu.c	2004-01-21 23:03:15.000000000 +0300
+++ src/menu.c	2004-02-26 15:18:23.410026224 +0300
@@ -744,12 +744,16 @@
 							item->leafname);
 				shade_file_menu_items(FALSE);
 				file_item = filer_selected_item(filer_window);
+				
+				gchar *file_item_leafname=g_strdup(file_item->leafname);
+				ensure_utf8(&file_item_leafname);
+				
 				g_string_printf(buffer, _("%s '%s'"),
 					basetype_name(file_item),
-					g_utf8_validate(file_item->leafname,
-							-1, NULL)
-						? file_item->leafname
-						: _("(bad utf-8)"));
+					file_item_leafname );
+					
+				g_free( file_item_leafname );
+					
 				if (!can_set_run_action(file_item))
 					menu_set_items_shaded(filer_file_menu,
 							TRUE, 9, 1);
@@ -1084,7 +1088,7 @@
 static gboolean copy_cb(GObject *savebox,
 			const gchar *current, const gchar *new)
 {
-	return action_with_leaf(action_copy, current, new);
+	return action_with_leaf(action_copy, current, g_locale_from_utf8(new, -1, NULL, NULL, NULL));
 }
 
 static gboolean action_with_leaf(ActionFn action,
@@ -1137,7 +1141,7 @@
 static gboolean rename_cb(GObject *savebox,
 			  const gchar *current, const gchar *new)
 {
-	return action_with_leaf(action_move, current, new);
+	return action_with_leaf(action_move, current, g_locale_from_utf8(new, -1, NULL, NULL, NULL));
 }
 
 static gboolean link_cb(GObject *savebox,
@@ -1155,7 +1159,7 @@
 	else
 		link_path = g_strdup(initial);
 
-	if (mc_lstat(path, &info) == 0 && S_ISLNK(info.st_mode))
+	if (mc_lstat(g_locale_from_utf8(path, -1, NULL, NULL, NULL), &info) == 0 && S_ISLNK(info.st_mode))
 	{
 		GtkWidget *box, *button;
 		gint ans;
@@ -1188,7 +1192,7 @@
 		unlink(path);
 	}
 
-	err = symlink(link_path, path);
+	err = symlink(link_path, g_locale_from_utf8(path, -1, NULL, NULL, NULL));
 	g_free(link_path);
 			
 	if (err)
@@ -1276,7 +1280,7 @@
 static gboolean new_directory_cb(GObject *savebox,
 				 const gchar *initial, const gchar *path)
 {
-	if (mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO))
+	if (mkdir(g_locale_from_utf8(path, -1, NULL, NULL, NULL), S_IRWXU | S_IRWXG | S_IRWXO))
 	{
 		report_error("mkdir: %s", g_strerror(errno));
 		return FALSE;
@@ -1310,7 +1314,7 @@
 {
 	int fd;
 
-	fd = open(path, O_CREAT | O_EXCL, 0666);
+	fd = open(g_locale_from_utf8(path, -1, NULL, NULL, NULL), O_CREAT | O_EXCL, 0666);
 
 	if (fd == -1)
 	{
diff -Nu src.old/view_details.c src/view_details.c
--- src.old/view_details.c	2003-05-27 16:58:23.000000000 +0400
+++ src/view_details.c	2004-02-26 15:33:23.003267264 +0300
@@ -336,17 +336,8 @@
 			break;
 		case COL_COLOUR:
 			g_value_init(value, GDK_TYPE_COLOR);
-			if (view_item->utf8_name)
-			{
-				GdkColor red;
-				red.red = 0xffff;
-				red.green = 0;
-				red.blue = 0;
-				g_value_set_boxed(value, &red);
-			}
-			else
-				g_value_set_boxed(value,
-						  type_get_colour(item, NULL));
+			g_value_set_boxed(value,
+					  type_get_colour(item, NULL));
 			break;
 		case COL_OWNER:
 			g_value_init(value, G_TYPE_STRING);
★★★★★

ROX-Filer и не юникодная локаль. Патч

И еще один патч - для правильного вывода флагов в заголовок окна.

diff -Nu src.old/filer.c src/filer.c
--- src.old/filer.c	2004-02-26 15:41:58.618881776 +0300
+++ src/filer.c	2004-02-26 16:09:06.381424256 +0300
@@ -1726,7 +1726,7 @@
 
 	if (not_local)
 	        title = g_strconcat("//", our_host_name(),
-			    filer_window->sym_path, flags, NULL);
+			    filer_window->sym_path, NULL);
 	
 	if (!title && home_dir_len > 1 &&
 		strncmp(filer_window->sym_path, home_dir, home_dir_len) == 0)
@@ -1736,15 +1736,16 @@
 		if (sep == '\0' || sep == '/')
 			title = g_strconcat("~",
 					filer_window->sym_path + home_dir_len,
-					flags,
 					NULL);
 	}
 	
 	if (!title)
-		title = g_strconcat(filer_window->sym_path, flags, NULL);
+		title = g_strconcat(filer_window->sym_path, NULL);
 
 	ensure_utf8(&title);
 
+	title = g_strconcat(title, flags, NULL);
+
 	if (filer_window->directory->error)
 	{
 		gchar *old = title;

Puzan ★★★★★ ()
Ответ на: ROX-Filer и не юникодная локаль. Патч от Puzan

Re: ROX-Filer и не юникодная локаль. Патч

Что-то день какой-то неудачный. Сначала plugin для xmms от McMCC не пашет. Теперь rox не могу пропатчить. Говорит

patching file display.c
Hunk #1 FAILED at 741

и так со всеми файлами. Может вышлете патчи по майлу? none at hot.ee

none ()
Ответ на: Re: ROX-Filer и не юникодная локаль. Патч от svyatogor

Re: Re: ROX-Filer и не юникодная локаль. Патч

поставил patch. Сообщение об ошибке пропало, осталасть проблема с отображением тумб файлов в пути к которым используются русские буквы (cp1251). Это лечится?

j0 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.