Index: mc-4.6.2~git20080311/edit/editcmd.c =================================================================== --- mc-4.6.2~git20080311.orig/edit/editcmd.c 2008-06-09 18:00:24.000000000 +0200 +++ mc-4.6.2~git20080311/edit/editcmd.c 2008-06-09 18:00:33.000000000 +0200 @@ -3323,7 +3323,7 @@ edit_select_codepage_cmd (WEdit *edit) { #ifdef HAVE_CHARSET - do_select_codepage (); + do_select_codepage (_(" Choose codepage ")); edit->force = REDRAW_COMPLETELY; edit_refresh_cmd (edit); #endif Index: mc-4.6.2~git20080311/po/ru.po =================================================================== --- mc-4.6.2~git20080311.orig/po/ru.po 2008-02-19 18:25:27.000000000 +0100 +++ mc-4.6.2~git20080311/po/ru.po 2008-06-09 18:02:26.000000000 +0200 @@ -3624,5 +3624,30 @@ msgid "Changes to file lost" msgstr "Изменения для файла потеряны" -#~ msgid "%s bytes in %d files" -#~ msgstr "%s байт в %d файлах" +#: messages for recode patch +msgid "Panel &codepage" +msgstr "Кодировка панели" + +msgid " Choose codepage " +msgstr " Выберите кодировку" + +msgid " Choose panel codepage " +msgstr " Выберите кодировку панели " + +msgid " Choose default FTP codepage " +msgstr " Выберите кодировку FTP по умолчанию " + +msgid "FTP default codepage:" +msgstr "Кодировка FTP по умолчанию:" + +msgid "Recode file names:" +msgstr "Перекодировать имена:" + +msgid "Recoding works only with COPY/MOVE operation" +msgstr "Перекодировка работает только для операций копирования/перемещения" + +msgid " Choose \"FROM\" codepage for COPY/MOVE operaion " +msgstr" Выберите начальную кодировку для операции копирования/перемещения " + +msgid " Choose \"TO\" codepage for COPY/MOVE operaion " +msgstr" Выберите конечную кодировку для операции копирования/перемещения " Index: mc-4.6.2~git20080311/src/boxes.c =================================================================== --- mc-4.6.2~git20080311.orig/src/boxes.c 2008-06-09 18:00:24.000000000 +0200 +++ mc-4.6.2~git20080311/src/boxes.c 2008-06-09 18:00:33.000000000 +0200 @@ -53,6 +53,7 @@ #ifdef HAVE_CHARSET #include "charsets.h" #include "selcodepage.h" +#include "recode.h" #endif #ifdef USE_NETCODE @@ -455,8 +456,8 @@ } } -#define DISPY 11 -#define DISPX 46 +#define DISPY 13 +#define DISPX 35 #ifndef HAVE_CHARSET @@ -552,23 +553,58 @@ static int new_display_codepage; +static int new_ftp_codepage; -static WLabel *cplabel; static WCheck *inpcheck; +static WButton *cpbutton; +static WButton *cpbutton_ftp; + static int sel_charset_button (int action) { const char *cpname; char buf[64]; - new_display_codepage = select_charset (new_display_codepage, 1); + new_display_codepage = select_charset (new_display_codepage, 1, _(" Choose input codepage ")); cpname = (new_display_codepage < 0) ? _("Other 8 bit") : codepages[new_display_codepage].name; /* avoid strange bug with label repainting */ - g_snprintf (buf, sizeof (buf), "%-27s", cpname); - label_set_text (cplabel, buf); + sprintf( buf, "%s", cpname ); + button_set_text (cpbutton, buf); + + if(new_display_codepage<0) new_ftp_codepage=-1; + cpname = (new_ftp_codepage < 0) + ? _("Other 8 bit") + : codepages[ new_ftp_codepage ].name; + sprintf( buf, "%s", cpname ); + button_set_text (cpbutton_ftp, buf); + + return 0; +} + +static int sel_charset_button_ftp(int action) { + char *cpname, buf[64]; + if(new_display_codepage>0) { + new_ftp_codepage = select_charset(new_ftp_codepage, 0, _(" Choose default FTP codepage ")); + cpname = (new_display_codepage < 0) + ? _("Other 8 bit") + : codepages[ new_display_codepage ].name; + sprintf( buf, "%s", cpname ); + button_set_text( cpbutton, buf ); + cpname = (new_ftp_codepage < 0) + ? _("Other 8 bit") + : codepages[ new_ftp_codepage ].name; + sprintf( buf, "%s", cpname ); + button_set_text( cpbutton_ftp, buf ); + } + else { + message( 1, _(" Warning "), + _("To use this feature select your codepage in\n" + "Setup / Display Bits dialog!\n" + "Do not forget to save options." )); + } return 0; } @@ -590,9 +626,6 @@ cpname = (new_display_codepage < 0) ? _("Other 8 bit") : codepages[new_display_codepage].name; - cplabel = label_new (4, 4, cpname); - add_widget (dbits_dlg, cplabel); - add_widget (dbits_dlg, button_new (DISPY - 3, DISPX / 2 + 3, B_CANCEL, NORMAL_BUTTON, _("&Cancel"), 0)); @@ -601,13 +634,30 @@ 0)); inpcheck = - check_new (6, 4, !use_8th_bit_as_meta, _("F&ull 8 bits input")); + check_new (8, 4, !use_8th_bit_as_meta, _("F&ull 8 bits input")); add_widget (dbits_dlg, inpcheck); - cpname = _("&Select"); - add_widget (dbits_dlg, - button_new (4, DISPX - 8 - mbstrlen (cpname), B_USER, - NORMAL_BUTTON, cpname, sel_charset_button)); + + add_widget( dbits_dlg, label_new( 5, 4, _("FTP default codepage:"))); + if(n_codepages>0) { + cpname = (new_display_codepage < 0) + ? _("Other 8 bit") + : codepages[ new_display_codepage ].name; + } + else cpname= _("Other 8 bit"); + cpbutton=button_new(4, 5, B_USER, + NORMAL_BUTTON, cpname, sel_charset_button); + + if(n_codepages>0) { + cpname = (new_ftp_codepage < 0) + ? _("Other 8 bit") + : codepages[ new_ftp_codepage ].name; + } + else cpname= _("Other 8 bit"); + cpbutton_ftp=button_new(6, 5, B_USER, + NORMAL_BUTTON, cpname, sel_charset_button_ftp); + add_widget( dbits_dlg, cpbutton_ftp); + add_widget (dbits_dlg, cpbutton); return dbits_dlg; } @@ -617,6 +667,7 @@ { Dlg_head *dbits_dlg; new_display_codepage = display_codepage; + new_ftp_codepage = ftp_codepage; application_keypad_mode (); dbits_dlg = init_disp_bits_box (); @@ -637,6 +688,17 @@ && display_codepage != 1) ? 128 : 160; #endif use_8th_bit_as_meta = !(inpcheck->state & C_BOOL); + + ftp_codepage=new_ftp_codepage; + if(display_codepage<=0) { + panel_reset_codepage(left_panel); + paint_dir(left_panel); + display_mini_info(left_panel); + panel_reset_codepage(right_panel); + paint_dir(right_panel); + display_mini_info(right_panel); + } + } destroy_dlg (dbits_dlg); repaint_screen (); Index: mc-4.6.2~git20080311/src/charsets.c =================================================================== --- mc-4.6.2~git20080311.orig/src/charsets.c 2008-02-19 18:25:27.000000000 +0100 +++ mc-4.6.2~git20080311/src/charsets.c 2008-06-09 18:00:33.000000000 +0200 @@ -121,8 +121,6 @@ } } -#define OTHER_8BIT "Other_8_bit" - const char * get_codepage_id (int n) { @@ -141,7 +139,7 @@ return -1; } -static char +char translate_character (iconv_t cd, char c) { char outbuf[4], *obuf; Index: mc-4.6.2~git20080311/src/charsets.h =================================================================== --- mc-4.6.2~git20080311.orig/src/charsets.h 2008-02-19 18:25:27.000000000 +0100 +++ mc-4.6.2~git20080311/src/charsets.h 2008-06-09 18:00:33.000000000 +0200 @@ -6,6 +6,7 @@ #define UNKNCHAR '\001' #define CHARSETS_INDEX "mc.charsets" +#define OTHER_8BIT "Other_8_bit" extern int n_codepages; @@ -19,6 +20,10 @@ extern struct codepage_desc *codepages; +#include +extern char translate_character(iconv_t cd, char c); +extern char errbuf[255]; + const char *get_codepage_id (int n); int get_codepage_index (const char *id); int load_codepages_list (void); Index: mc-4.6.2~git20080311/src/cmd.c =================================================================== --- mc-4.6.2~git20080311.orig/src/cmd.c 2008-02-19 18:25:27.000000000 +0100 +++ mc-4.6.2~git20080311/src/cmd.c 2008-06-09 18:00:33.000000000 +0200 @@ -70,6 +70,10 @@ # include "../edit/edit.h" #endif +#ifdef HAVE_CHARSET +#include "recode.h" +#endif + /* If set and you don't have subshell support,then C-o will give you a shell */ int output_starts_shell = 0; @@ -347,6 +351,9 @@ mkdir_cmd (void) { char *dir, *absdir; +#ifdef HAVE_CHARSET + char *recoded_dir; +#endif dir = input_expand_dialog (_("Create a new Directory"), @@ -356,8 +363,16 @@ if (dir[0] == '/' || dir[0] == '~') absdir = g_strdup (dir); - else + else { +#ifdef HAVE_CHARSET + recoded_dir=g_strdup(dir); + my_translate_string(dir,strlen(dir), recoded_dir,current_panel->tr_table_input); + absdir = concat_dir_and_file (current_panel->cwd, recoded_dir); + g_free(recoded_dir); +#else absdir = concat_dir_and_file (current_panel->cwd, dir); +#endif + } save_cwds_stat (); if (my_mkdir (absdir, 0777) == 0) { Index: mc-4.6.2~git20080311/src/file.c =================================================================== --- mc-4.6.2~git20080311.orig/src/file.c 2008-06-09 18:00:24.000000000 +0200 +++ mc-4.6.2~git20080311/src/file.c 2008-06-09 18:00:33.000000000 +0200 @@ -75,6 +75,9 @@ #include "../vfs/vfs-impl.h" /* }}} */ +#ifdef HAVE_CHARSET +#include "recode.h" +#endif /* Hack: the vfs code should not rely on this */ #define WITH_FULL_PATHS 1 @@ -919,7 +922,11 @@ } /* Dive into subdir if exists */ if (toplevel && ctx->dive_into_subdirs) { +#ifdef HAVE_CHARSET + dest_dir = concat_dir_and_recoded_fname(d, x_basename (s), ctx); +#else dest_dir = concat_dir_and_file (d, x_basename (s)); +#endif } else { dest_dir = g_strdup (d); goto dont_mkdir; @@ -969,7 +976,11 @@ (*ctx->stat_func) (path, &buf); if (S_ISDIR (buf.st_mode)) { +#ifdef HAVE_CHARSET + mdpath = concat_dir_and_recoded_fname(dest_dir, next->d_name, ctx); +#else mdpath = concat_dir_and_file (dest_dir, next->d_name); +#endif /* * From here, we just intend to recursively copy subdirs, not * the double functionality of copying different when the target @@ -980,7 +991,11 @@ parent_dirs, progress_count, progress_bytes); g_free (mdpath); } else { +#ifdef HAVE_CHARSET + dest_file=concat_dir_and_recoded_fname(dest_dir, x_basename(path),ctx); +#else dest_file = concat_dir_and_file (dest_dir, x_basename (path)); +#endif return_status = copy_file_file (ctx, path, dest_file, 1, progress_count, progress_bytes, 0); g_free (dest_file); @@ -1170,7 +1185,12 @@ destdir = g_strdup (d); move_over = 1; } else +#ifdef HAVE_CHARSET + destdir = concat_dir_and_recoded_fname(d, x_basename (s), ctx); +#else destdir = concat_dir_and_file (d, x_basename (s)); +#endif + if (sbuf.st_dev == dbuf.st_dev && sbuf.st_ino == dbuf.st_ino) { int msize = COLS - 36; @@ -1875,7 +1895,12 @@ if (temp == NULL) { value = transform_error; } else { +#ifdef HAVE_CHARSET + char *temp2 = concat_dir_and_recoded_fname (dest, temp, ctx); +#else char *temp2 = concat_dir_and_file (dest, temp); +#endif + g_free (dest); dest = temp2; temp = NULL; @@ -1971,7 +1996,12 @@ if (temp == NULL) value = transform_error; else { +#ifdef HAVE_CHARSET + char *temp2 = concat_dir_and_recoded_fname(dest, temp, ctx); +#else char *temp2 = concat_dir_and_file (dest, temp); +#endif + source_with_path = unescape_string(source_with_path); temp2 = unescape_string(temp2); Index: mc-4.6.2~git20080311/src/filegui.c =================================================================== --- mc-4.6.2~git20080311.orig/src/filegui.c 2008-06-09 18:00:24.000000000 +0200 +++ mc-4.6.2~git20080311/src/filegui.c 2008-06-09 18:00:33.000000000 +0200 @@ -68,6 +68,10 @@ #include "util.h" /* strip_password() */ #include "tty.h" +#ifdef HAVE_CHARSET +#include "recode.h" +#endif + /* }}} */ /* Hack: the vfs code should not rely on this */ @@ -722,57 +726,79 @@ } } +#ifdef HAVE_CHARSET +#define FMDY 15 +#else #define FMDY 13 +#endif + #define FMD_XLEN 64 extern int fmd_xlen; static QuickWidget fmd_widgets[] = { -#define FMCB0 FMDC -#define FMCB12 0 -#define FMCB11 1 - /* follow symlinks and preserve Attributes must be the first */ - {quick_checkbox, 3, 64, 8, FMDY, N_("preserve &Attributes"), 9, 0, - 0 /* &op_preserve */ , 0, NULL}, - {quick_checkbox, 3, 64, 7, FMDY, N_("follow &Links"), 7, 0, - 0 /* &file_mask_op_follow_links */ , 0, NULL}, - {quick_label, 3, 64, 5, FMDY, N_("to:"), 0, 0, 0, 0, NULL}, - {quick_checkbox, 37, 64, 4, FMDY, N_("&Using shell patterns"), 0, 0, - 0 /* &source_easy_patterns */ , 0, NULL}, - {quick_input, 3, 64, 3, FMDY, "", 58, - 0, 0, 0, "input-def"}, -#define FMDI1 4 -#define FMDI2 5 -#define FMDC 3 - {quick_input, 3, 64, 6, FMDY, "", 58, 0, - 0, 0, "input2"}, -#define FMDI0 6 - {quick_label, 3, 64, 2, FMDY, "", 0, 0, 0, 0, NULL}, -#define FMBRGT 7 - {quick_button, 42, 64, 9, FMDY, N_("&Cancel"), 0, B_CANCEL, 0, 0, - NULL}, -#undef SKIP +#ifdef HAVE_CHARSET + #define Y_OK 12 +#else + #define Y_OK 9 +#endif + +#ifdef WITH_BACKGROUND + #define ADD 0 +#else + #define ADD -1 +#endif + + #define FM_STAB_SYM 0 + #define FM_DIVE_INTO_SUBDIR 1 + #define FM_PRES_ATTR 2 + #define FM_FOLLOW_LINKS 3 + #define FM_DST_INPUT 4 + #define FM_DST_TITLE 5 + #define FM_USING_SHELL_PATT 6 + #define FM_SRC_INPUT 7 + #define FM_SRC_TITLE 8 + #define FM_CANCEL 9 +#ifdef WITH_BACKGROUND + #define FM_BKGND 10 +#endif + #define FM_OK 11+ADD +#ifdef HAVE_CHARSET + #define FM_TO_CODEPAGE 12+ADD + #define FM_FROM_CODEPAGE 13+ADD + #define FM_RECODE_TITLE 14+ADD + #define FM_RECODE_ARROW 15+ADD +#endif // HAVE_CHARSET + + +#ifdef HAVE_CHARSET + #define SKIP 10 + #define B_FROM B_USER+1 + #define B_TO B_USER+2 +#else + #define SKIP 10 +#endif + + {quick_checkbox, 42,64, 8, FMDY, N_("&Stable Symlinks"),0,0,0,0,"stab-sym"}, + {quick_checkbox, 31,64, 7, FMDY, N_("&Dive into subdir if exists"),0,0,0,0,"dive"}, + {quick_checkbox, 3, 64, 8, FMDY, N_("preserve &Attributes"),9,0,0,0,"preserve"}, + {quick_checkbox, 3, 64, 7, FMDY, N_("follow &Links"),7,0,0,0,"follow"}, + {quick_input, 3, 64, 6, FMDY, "", 58, 0, 0, 0, "input2"}, + {quick_label, 3, 64, 5, FMDY, N_("to:"), 0, 0, 0, 0, "to"}, + {quick_checkbox, 37,64, 4, FMDY, N_("&Using shell patterns"),0,0, 0,0,"us-sh"}, + {quick_input, 3, 64, 3, FMDY, "", 58, 0, 0, 0, "input-def"}, + {quick_label, 3, 64, 2, FMDY, "", 0, 0, 0, 0, "ql"}, + {quick_button, 42,64, Y_OK, FMDY, N_("&Cancel"), 0, B_CANCEL, 0,0, "cancel"}, #ifdef WITH_BACKGROUND -# define SKIP 5 -# define FMCB21 11 -# define FMCB22 10 -# define FMBLFT 9 -# define FMBMID 8 - {quick_button, 25, 64, 9, FMDY, N_("&Background"), 0, B_USER, 0, 0, - NULL}, -#else /* WITH_BACKGROUND */ -# define SKIP 4 -# define FMCB21 10 -# define FMCB22 9 -# define FMBLFT 8 -# undef FMBMID -#endif - {quick_button, 14, 64, 9, FMDY, N_("&OK"), 0, B_ENTER, 0, 0, NULL}, - {quick_checkbox, 42, 64, 8, FMDY, N_("&Stable Symlinks"), 0, 0, - 0 /* &file_mask_stable_symlinks */ , 0, NULL}, - {quick_checkbox, 31, 64, 7, FMDY, N_("&Dive into subdir if exists"), 0, - 0, - 0 /* &dive_into_subdirs */ , 0, NULL}, - NULL_QuickWidget + {quick_button, 25,64, Y_OK, FMDY, N_("&Background"), 0, B_USER, 0,0, "back"}, +#endif + {quick_button, 14,64, Y_OK, FMDY, N_("&OK"), 0, B_ENTER, 0, 0, "ok"}, +#ifdef HAVE_CHARSET + {quick_button, 46,64, 10, FMDY,"to codepage", 0, B_TO, 0, 0, "ql"}, + {quick_button, 25,64, 10, FMDY, "from codepage", 0, B_FROM, 0, 0, "ql"}, + {quick_label, 3, 64, 10, FMDY, N_("Recode file names:"), 0, 0, 0, 0, "ql"}, + {quick_label, 42,64, 10, FMDY, "->", 0, 0, 0, 0, "ql"}, +#endif + {0} }; static int @@ -806,48 +832,48 @@ if (fmd_widgets[i].text[0] != '\0') fmd_widgets[i].text = _(fmd_widgets[i].text); - len = mbstrlen (fmd_widgets[FMCB11].text) - + mbstrlen (fmd_widgets[FMCB21].text) + 15; + len = mbstrlen (fmd_widgets[FM_FOLLOW_LINKS].text) + + mbstrlen (fmd_widgets[FM_DIVE_INTO_SUBDIR].text) + 15; fmd_xlen = max (fmd_xlen, len); - len = mbstrlen (fmd_widgets[FMCB12].text) - + mbstrlen (fmd_widgets[FMCB22].text) + 15; + len = mbstrlen (fmd_widgets[FM_PRES_ATTR].text) + + mbstrlen (fmd_widgets[FM_STAB_SYM].text) + 15; fmd_xlen = max (fmd_xlen, len); - len = mbstrlen (fmd_widgets[FMBRGT].text) - + mbstrlen (fmd_widgets[FMBLFT].text) + 11; + len = mbstrlen (fmd_widgets[FM_CANCEL].text) + + mbstrlen (fmd_widgets[FM_OK].text) + 11; -#ifdef FMBMID - len += mbstrlen (fmd_widgets[FMBMID].text) + 6; +#ifdef FM_BKGND + len += mbstrlen (fmd_widgets[FM_BKGND].text) + 6; #endif fmd_xlen = max (fmd_xlen, len + 4); len = (fmd_xlen - (len + 6)) / 2; - i = fmd_widgets[FMBLFT].relative_x = len + 3; - i += mbstrlen (fmd_widgets[FMBLFT].text) + 8; + i = fmd_widgets[FM_OK].relative_x = len + 3; + i += mbstrlen (fmd_widgets[FM_OK].text) + 8; -#ifdef FMBMID - fmd_widgets[FMBMID].relative_x = i; - i += mbstrlen (fmd_widgets[FMBMID].text) + 6; +#ifdef FM_BKGND + fmd_widgets[FM_BKGND].relative_x = i; + i += mbstrlen (fmd_widgets[FM_BKGND].text) + 6; #endif - fmd_widgets[FMBRGT].relative_x = i; + fmd_widgets[FM_CANCEL].relative_x = i; #define chkbox_xpos(i) \ fmd_widgets [i].relative_x = fmd_xlen - mbstrlen (fmd_widgets [i].text) - 6 - chkbox_xpos (FMCB0); - chkbox_xpos (FMCB21); - chkbox_xpos (FMCB22); + chkbox_xpos (FM_USING_SHELL_PATT); + chkbox_xpos (FM_DIVE_INTO_SUBDIR); + chkbox_xpos (FM_STAB_SYM); if (fmd_xlen != FMD_XLEN) { i = sizeof (fmd_widgets) / sizeof (fmd_widgets[0]) - 1; while (i--) fmd_widgets[i].x_divisions = fmd_xlen; - fmd_widgets[FMDI1].hotkey_pos = - fmd_widgets[FMDI2].hotkey_pos = fmd_xlen - 6; + fmd_widgets[FM_SRC_INPUT].hotkey_pos = + fmd_widgets[FM_DST_INPUT].hotkey_pos = fmd_xlen - 6; } #undef chkbox_xpos @@ -867,6 +893,9 @@ int val; QuickDialog Quick_input; char *def_text; +#ifdef HAVE_CHARSET + char *errmsg; +#endif g_return_val_if_fail (ctx != NULL, NULL); def_text = g_strdup(def_text_orig); @@ -884,10 +913,11 @@ /* Set up the result pointers */ - fmd_widgets[FMCB12].result = &ctx->op_preserve; - fmd_widgets[FMCB11].result = &ctx->follow_links; - fmd_widgets[FMCB22].result = &ctx->stable_symlinks; - fmd_widgets[FMCB21].result = &ctx->dive_into_subdirs; + fmd_widgets[FM_PRES_ATTR].result = &ctx->op_preserve; + fmd_widgets[FM_FOLLOW_LINKS].result = &ctx->follow_links; + fmd_widgets[FM_STAB_SYM].result = &ctx->stable_symlinks; + fmd_widgets[FM_DIVE_INTO_SUBDIR].result = &ctx->dive_into_subdirs; + /* filter out a possible password from def_text */ def_text_secure = strip_password (g_strdup (def_text), 1); @@ -895,8 +925,9 @@ /* Create the dialog */ ctx->stable_symlinks = 0; - fmd_widgets[FMDC].result = &source_easy_patterns; - fmd_widgets[FMDI1].text = easy_patterns ? "*" : "^\\(.*\\)$"; + fmd_widgets[FM_USING_SHELL_PATT].result = &source_easy_patterns; + fmd_widgets[FM_SRC_INPUT].text = easy_patterns ? "*" : "^\\(.*\\)$"; + Quick_input.xlen = fmd_xlen; Quick_input.xpos = -1; Quick_input.title = op_names[operation]; @@ -904,19 +935,37 @@ Quick_input.ylen = FMDY; Quick_input.i18n = 1; Quick_input.widgets = fmd_widgets; - fmd_widgets[FMDI0].text = text; - fmd_widgets[FMDI2].text = def_text_secure; - fmd_widgets[FMDI2].str_result = &dest_dir; - fmd_widgets[FMDI1].str_result = &source_mask; + fmd_widgets[FM_SRC_TITLE].text = text; + fmd_widgets[FM_DST_INPUT].text = def_text_secure; + fmd_widgets[FM_DST_INPUT].str_result = &dest_dir; + fmd_widgets[FM_SRC_INPUT].str_result = &source_mask; *do_background = 0; + +#ifdef HAVE_CHARSET + ctx->from_codepage=current_panel->src_codepage; + ctx->to_codepage=left_panel->src_codepage; + if (left_panel) { + ctx->to_codepage=left_panel->src_codepage; + if( (current_panel==left_panel) && right_panel ) ctx->to_codepage=right_panel->src_codepage; + } +#endif + ask_file_mask: +#ifdef HAVE_CHARSET + if(operation!=OP_COPY && operation!=OP_MOVE) { + ctx->from_codepage=-1; + ctx->to_codepage=-1; + } + fmd_widgets[FM_FROM_CODEPAGE].text=get_codepage_id(ctx->from_codepage); + fmd_widgets[FM_TO_CODEPAGE].text=get_codepage_id(ctx->to_codepage); +#endif + if ((val = quick_dialog_skip (&Quick_input, SKIP)) == B_CANCEL) { g_free (def_text_secure); return 0; } - g_free (def_text_secure); if (ctx->follow_links) ctx->stat_func = mc_stat; @@ -938,6 +987,7 @@ orig_mask = source_mask; if (!dest_dir || !*dest_dir) { g_free (source_mask); + g_free (def_text_secure); g_free(def_text); return dest_dir; } @@ -992,6 +1042,48 @@ } if (val == B_USER) *do_background = 1; +#ifdef HAVE_CHARSET + if(val == B_FROM) { + if(operation==OP_COPY || operation==OP_MOVE) { + if(display_codepage<=0) { + message( 1, _(" Warning "), + _("To use this feature select your codepage in\n" + "Setup / Display Bits dialog!\n" + "Do not forget to save options." )); + goto ask_file_mask; + } + ctx->from_codepage=select_charset(ctx->from_codepage,0, + _(" Choose \"FROM\" codepage for COPY/MOVE operaion ")); + } + else + message(1,"Warning",_("Recoding works only with COPY or MOVE operation")); + goto ask_file_mask; + } + if(val == B_TO) { + if(operation==OP_COPY || operation==OP_MOVE) { + if(display_codepage<=0) { + message( 1, _(" Warning "), + _("To use this feature select your codepage in\n" + "Setup / Display Bits dialog!\n" + "Do not forget to save options." )); + goto ask_file_mask; + } + ctx->to_codepage=select_charset(ctx->to_codepage,0, + _(" Choose \"TO\" codepage for COPY/MOVE operaion ")); + } + else + message(1,"Warning",_("Recoding works only with COPY or MOVE operation")); + goto ask_file_mask; + } + + errmsg=my_init_tt(ctx->to_codepage,ctx->from_codepage,ctx->tr_table); + if(errmsg) { + my_reset_tt(ctx->tr_table,256); + message( 1, MSG_ERROR, "%s", errmsg); + } +#endif + + g_free(def_text_secure); g_free(def_text); return dest_dir; } Index: mc-4.6.2~git20080311/src/fileopctx.c =================================================================== --- mc-4.6.2~git20080311.orig/src/fileopctx.c 2008-02-19 18:25:27.000000000 +0100 +++ mc-4.6.2~git20080311/src/fileopctx.c 2008-06-09 18:00:33.000000000 +0200 @@ -26,8 +26,12 @@ #include #include "global.h" -#include "fileopctx.h" +#ifdef HAVE_CHARSET +#include "recode.h" +#endif + +#include "fileopctx.h" /** * file_op_context_new: @@ -54,6 +58,12 @@ ctx->umask_kill = 0777777; ctx->erase_at_end = TRUE; +#ifdef HAVE_CHARSET + ctx->from_codepage=-1; + ctx->to_codepage=-1; + my_reset_tt(ctx->tr_table,256); +#endif + return ctx; } Index: mc-4.6.2~git20080311/src/fileopctx.h =================================================================== --- mc-4.6.2~git20080311.orig/src/fileopctx.h 2008-02-19 18:25:27.000000000 +0100 +++ mc-4.6.2~git20080311/src/fileopctx.h 2008-06-09 18:00:33.000000000 +0200 @@ -108,6 +108,14 @@ /* User interface data goes here */ void *ui; + +#ifdef HAVE_CHARSET + /* Recode data */ + int from_codepage, to_codepage; + unsigned char tr_table[256]; + unsigned char recode_buf[MC_MAXPATHLEN]; +#endif + } FileOpContext; Index: mc-4.6.2~git20080311/src/main.c =================================================================== --- mc-4.6.2~git20080311.orig/src/main.c 2008-06-09 18:00:24.000000000 +0200 +++ mc-4.6.2~git20080311/src/main.c 2008-06-09 18:00:33.000000000 +0200 @@ -82,6 +82,7 @@ #ifdef HAVE_CHARSET #include "charsets.h" +#include "recode.h" #endif /* HAVE_CHARSET */ #ifdef USE_VFS @@ -98,6 +99,7 @@ /* The structures for the panels */ WPanel *left_panel = NULL; WPanel *right_panel = NULL; +WPanel* ret_panel=NULL; /* The pointer to the tree */ WTree *the_tree = NULL; @@ -590,6 +592,7 @@ } directory = *new_dir ? new_dir : home_dir; + ret_panel=panel; if (strchr(directory,'\n') || mc_chdir (directory) == -1) { strcpy (panel->cwd, olddir); g_free (olddir); @@ -808,6 +811,10 @@ {' ', N_("&Quick view C-x q"), 'Q', quick_view_cmd}, {' ', N_("&Info C-x i"), 'I', info_cmd}, {' ', N_("&Tree"), 'T', tree_cmd}, +#ifdef HAVE_CHARSET + {' ', "", ' ', 0}, + {' ', N_("Panel &codepage"), 'C', fnc_l_cmd}, +#endif {' ', "", ' ', 0}, {' ', N_("&Sort order..."), 'S', sort_cmd}, {' ', "", ' ', 0}, @@ -832,6 +839,10 @@ {' ', N_("&Quick view C-x q"), 'Q', quick_view_cmd}, {' ', N_("&Info C-x i"), 'I', info_cmd}, {' ', N_("&Tree"), 'T', tree_cmd}, +#ifdef HAVE_CHARSET + {' ', "", ' ', 0}, + {' ', N_("Panel &codepage"), 'C', fnc_r_cmd}, +#endif {' ', "", ' ', 0}, {' ', N_("&Sort order..."), 'S', sort_cmd}, {' ', "", ' ', 0}, Index: mc-4.6.2~git20080311/src/Makefile.am =================================================================== --- mc-4.6.2~git20080311.orig/src/Makefile.am 2008-02-19 18:25:27.000000000 +0100 +++ mc-4.6.2~git20080311/src/Makefile.am 2008-06-09 18:00:33.000000000 +0200 @@ -41,7 +41,8 @@ mc_LDADD = $(EDITLIB) $(SLANGLIB) $(VFSLIB) \ $(INTLLIBS) $(GLIB_LIBS) $(MCLIBS) $(LIBICONV) -CHARSET_SRC = charsets.c charsets.h selcodepage.c selcodepage.h +CHARSET_SRC = charsets.c charsets.h selcodepage.c selcodepage.h \ + recode.c recode.h SRCS = achown.c achown.h background.c background.h boxes.c boxes.h \ chmod.c chmod.h chown.c chown.h cmd.c cmd.h color.c color.h \ @@ -58,8 +59,8 @@ main.c main.h \ menu.c menu.h mountlist.c mountlist.h mouse.c mouse.h myslang.h \ option.c option.h panel.h panelize.c panelize.h \ - profile.c profile.h regex.c rxvt.c screen.c setup.c setup.h \ - slint.c subshell.c subshell.h textconf.c textconf.h \ + profile.c profile.h regex.c rxvt.c screen.c screen.h setup.c \ + setup.h slint.c subshell.c subshell.h textconf.c textconf.h \ tree.c tree.h treestore.c treestore.h tty.c tty.h user.c user.h \ util.c util.h utilunix.c view.c view.h vfsdummy.h widget.c \ widget.h win.c win.h wtools.c wtools.h unixcompat.h \ Index: mc-4.6.2~git20080311/src/panel.h =================================================================== --- mc-4.6.2~git20080311.orig/src/panel.h 2008-02-19 18:25:27.000000000 +0100 +++ mc-4.6.2~git20080311/src/panel.h 2008-06-09 18:00:33.000000000 +0200 @@ -71,6 +71,19 @@ int searching; char search_buffer [256]; + +#ifdef HAVE_CHARSET + int src_codepage; + unsigned char tr_table[256], tr_table_input[256]; +#endif + +#ifdef USE_VFS + #ifdef HAVE_CHARSET + int ret_codepage; + #endif + int is_return; + char retdir[MC_MAXPATHLEN]; +#endif } WPanel; WPanel *panel_new (const char *panel_name); @@ -96,6 +109,7 @@ extern WPanel *left_panel; extern WPanel *right_panel; extern WPanel *current_panel; +extern WPanel* ret_panel; void try_to_select (WPanel *panel, const char *name); Index: mc-4.6.2~git20080311/src/recode.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ mc-4.6.2~git20080311/src/recode.c 2008-06-09 18:00:33.000000000 +0200 @@ -0,0 +1,153 @@ +#include "recode.h" +#ifdef HAVE_CHARSET + +char *lang; +char lang_codepage_name[256]; +int lang_codepage; + +int ftp_codepage=-1; + +// recode buffer for displaying file names +unsigned char recode_buf[MC_MAXPATHLEN]; + +WPanel* recode_panel; + +//--- get codepage from $LANG +void get_locale_codepage() { + char* a; + char* b; + int len; + + lang=getenv("LANG"); + if(!lang) { + strncpy(lang_codepage_name,OTHER_8BIT, sizeof(OTHER_8BIT)); + lang_codepage=-1; + return; + } + + a=strchr(lang,'.'); + if(!a) { + strncpy(lang_codepage_name,OTHER_8BIT, sizeof(OTHER_8BIT)); + lang_codepage=-1; + return; + } + ++a; + + b=strchr(lang,'@'); + if(!b) b=lang+strlen(lang); + + len=b-a; + if(len>=sizeof(lang_codepage_name)) len=sizeof(lang_codepage_name)-1; + + memcpy(lang_codepage_name,a, len); + lang_codepage_name[len]='\0'; + lang_codepage=get_codepage_index(lang_codepage_name); + if(lang_codepage<0) strncpy(lang_codepage_name,OTHER_8BIT, sizeof(OTHER_8BIT)); +} + +//--- reset translation table +void my_reset_tt(unsigned char *table,int n) { + int i; + for(i=0;isrc_codepage=-1; + my_reset_tt(p->tr_table,256); + my_reset_tt(p->tr_table_input,256); +} + +//--- Initialize translation table +// i need this function because init_translation_table from +// charsets.c fills only fixed translation tables conv_displ and conv_input +//--- +char* my_init_tt( int from, int to, unsigned char *table) { + int i; + iconv_t cd; + char *cpfrom, *cpto; + + if(from < 0 || to < 0 || from == to) { + my_reset_tt(table,256); + return NULL; + } + my_reset_tt(table,128); + cpfrom=codepages[from ].id; + cpto=codepages[to].id; + cd=iconv_open(cpfrom, cpto); + if(cd==(iconv_t)-1) { + snprintf(errbuf, 255, _("Cannot translate from %s to %s"), cpfrom, cpto); + return errbuf; + } + for(i=128; i<=255; ++i) table[i] = translate_character(cd, i); + iconv_close(cd); + return NULL; +} + +//--- Translate string from one codepage to another +void my_translate_string(unsigned char *s1,int l1, unsigned char *s2, unsigned char *table) { + int i=0; + if(!s1) return; + while(irecode_buf,ctx->tr_table); + if (dir [i-1] == PATH_SEP) + return g_strconcat (dir, ctx->recode_buf, NULL); + else + return g_strconcat (dir, PATH_SEP_STR, ctx->recode_buf, NULL); + return 0; +} + + +//--- Internal handler for "Panel codepage" +static void fnc_cmd(WPanel *p) { + char *errmsg; + if(display_codepage > 0) { + p->src_codepage=select_charset(p->src_codepage, 0, _(" Choose panel codepage ")); + errmsg=my_init_tt(display_codepage,p->src_codepage,p->tr_table); + if(errmsg) { + panel_reset_codepage(p); + message( 1, MSG_ERROR, "%s", errmsg); + } + errmsg=my_init_tt(p->src_codepage,display_codepage,p->tr_table_input); + if (errmsg) { + panel_reset_codepage(p); + message( 1, MSG_ERROR, "%s", errmsg ); + } + paint_dir(p); + show_dir(p); + display_mini_info(p); + } + else { + message( 1, _(" Warning "), + _("To use this feature select your codepage in\n" + "Setup / Display Bits dialog!\n" + "Do not forget to save options." )); + } +} + +//--- Menu handlers for "Panel codepage" for left and right panel menu + +void fnc_l_cmd() { + fnc_cmd(left_panel); +} + +void fnc_r_cmd() { + fnc_cmd(right_panel); +} + +//--- screen handler for "Panel codepage" +void fnc_c_cmd(WPanel *panel) { + fnc_cmd(current_panel); +} + +#endif //HAVE_CHARSET Index: mc-4.6.2~git20080311/src/recode.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ mc-4.6.2~git20080311/src/recode.h 2008-06-09 18:00:33.000000000 +0200 @@ -0,0 +1,48 @@ +#ifndef __RECODE_H__ +#define __RECODE_H__ +#include +#ifdef HAVE_CHARSET + +#include +#include +#include + +#include "global.h" +#include "wtools.h" +#include "panel.h" +#include "charsets.h" +#include "selcodepage.h" +#include "screen.h" +#include "main.h" +#include "fileopctx.h" + +extern char *lang; +extern char lang_codepage_name[256]; +extern int lang_codepage; + +extern int ftp_codepage; + +// recode buffer for displaying file names +extern unsigned char recode_buf[MC_MAXPATHLEN]; +extern WPanel* recode_panel; + +//--- get codepage from $LANG +extern void get_locale_codepage(); + +//--- reset translation table +extern void my_reset_tt(unsigned char *table,int n); +//--- reset panel codepage +extern void panel_reset_codepage(WPanel *p); +//--- Initialize translation table +extern char* my_init_tt( int from, int to, unsigned char *table); +//--- Translate string from one codepage to another +extern void my_translate_string(unsigned char *s1,int l1, unsigned char *s2, unsigned char *table); +//--- Recode filename and concat in to dir +extern char* concat_dir_and_recoded_fname(const char *dir, const char *fname, FileOpContext *ctx); +//--- handlers for "Panel codepage" +extern void fnc_l_cmd(); +extern void fnc_r_cmd(); +extern void fnc_c_cmd(WPanel *panel); + +#endif // HAVE_CHARSET +#endif //__RECODE_H__ Index: mc-4.6.2~git20080311/src/screen.c =================================================================== --- mc-4.6.2~git20080311.orig/src/screen.c 2008-06-09 18:00:24.000000000 +0200 +++ mc-4.6.2~git20080311/src/screen.c 2008-06-09 18:00:33.000000000 +0200 @@ -51,6 +51,10 @@ #include "main.h" /* the_menubar */ #include "unixcompat.h" +#ifdef HAVE_CHARSET +#include "recode.h" +#endif + #define ELEMENTS(arr) ( sizeof(arr) / sizeof((arr)[0]) ) #define J_LEFT 1 @@ -173,6 +177,7 @@ string_file_name (file_entry *fe, int len) { size_t i; + char* filename; #ifdef UTF8 static char buffer [BUF_SMALL * 4]; @@ -185,6 +190,13 @@ static char buffer [BUF_SMALL]; #endif +#ifdef HAVE_CHARSET + my_translate_string(fe->fname,fe->fnamelen, recode_buf, recode_panel->tr_table); + filename= recode_buf; +#else + filename=fe->fname; +#endif + #ifdef UTF8 if (SLsmg_Is_Unicode) for (i = 0; i < sizeof (buffer) - 1; i++) { @@ -215,7 +227,7 @@ for (i = 0; i < sizeof(buffer) - 1; i++) { char c; - c = fe->fname[i]; + c = filename[i]; if (!c) break; @@ -722,6 +734,10 @@ int second_column = 0; int width, offset; +#ifdef HAVE_CHARSET + recode_panel=panel; +#endif + offset = 0; if (!isstatus && panel->split){ @@ -761,7 +777,7 @@ } } -static void +void display_mini_info (WPanel *panel) { if (!show_mini_info) @@ -831,7 +847,7 @@ return; } -static void +void paint_dir (WPanel *panel) { int i; @@ -869,7 +885,7 @@ #endif /* !HAVE_SLANG */ } -static void +void show_dir (WPanel *panel) { char *tmp; @@ -901,8 +917,15 @@ tmp = g_malloc (panel->widget.cols + 1); tmp[panel->widget.cols] = '\0'; +#ifdef HAVE_CHARSET + my_translate_string(panel->cwd,strlen(panel->cwd),recode_buf, panel->tr_table); + trim (strip_home_and_password (recode_buf), tmp, + min (max (panel->widget.cols - 7, 0), panel->widget.cols) ); + #else trim (strip_home_and_password (panel->cwd), tmp, max (panel->widget.cols - 9, 0)); +#endif + addstr (tmp); g_free (tmp); @@ -1115,6 +1138,17 @@ mc_get_current_wd (panel->cwd, sizeof (panel->cwd) - 2); strcpy (panel->lwd, "."); +#ifdef HAVE_CHARSET + panel_reset_codepage(panel); +#endif + +#ifdef USE_VFS + panel->is_return=0; + #ifdef HAVE_CHARSET + panel->ret_codepage=-1; + #endif +#endif + panel->hist_name = g_strconcat ("Dir Hist ", panel_name, (char *) NULL); panel->dir_history = history_get (panel->hist_name); directory_history_add (panel, panel->cwd); @@ -2315,7 +2349,12 @@ { XCTRL('n'), move_down }, /* C-n like emacs */ { XCTRL('s'), start_search }, /* C-s like emacs */ { ALT('s'), start_search }, /* M-s not like emacs */ +#ifndef HAVE_CHARSET { XCTRL('t'), mark_file }, +#endif +#ifdef HAVE_CHARSET + { XCTRL('t'), mark_file }, /* was 'fnc_c_cmd' */ +#endif { ALT('o'), chdir_other_panel }, { ALT('i'), sync_other_panel }, { ALT('l'), chdir_to_readlink }, Index: mc-4.6.2~git20080311/src/screen.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ mc-4.6.2~git20080311/src/screen.h 2008-06-09 18:00:33.000000000 +0200 @@ -0,0 +1,11 @@ +#ifndef __SCREEN_H__ +#define __SCREEN_H__ +#include + +#include "global.h" + +extern void paint_dir (WPanel *panel); +extern void display_mini_info (WPanel *panel); +extern void show_dir(WPanel *panel); +#endif //__SCREEN_H__ + Index: mc-4.6.2~git20080311/src/selcodepage.c =================================================================== --- mc-4.6.2~git20080311.orig/src/selcodepage.c 2008-02-19 18:25:27.000000000 +0100 +++ mc-4.6.2~git20080311/src/selcodepage.c 2008-06-09 18:00:33.000000000 +0200 @@ -45,14 +45,16 @@ } int -select_charset (int current_charset, int seldisplay) +select_charset (int current_charset, int seldisplay, const char *title) { + int new_charset; + int i, menu_lines = n_codepages + 1; char buffer[255]; /* Create listbox */ Listbox *listbox = create_listbox_window (ENTRY_LEN + 2, menu_lines, - _(" Choose input codepage "), + title, "[Codepages Translation]"); if (!seldisplay) @@ -82,20 +84,26 @@ i = run_listbox (listbox); - return (seldisplay) ? ((i >= n_codepages) ? -1 : i) - : (i - 1); + if(i==-1) + i = (seldisplay) + ? ((current_charset < 0) ? n_codepages : current_charset) + : (current_charset + 1); + + new_charset =(seldisplay) ? ( (i >= n_codepages) ? -1 : i ) : ( i-1 ); + new_charset = (new_charset==-2) ? current_charset:new_charset; + return new_charset; } /* Helper functions for codepages support */ int -do_select_codepage (void) +do_select_codepage (const char *title) { const char *errmsg; if (display_codepage > 0) { - source_codepage = select_charset (source_codepage, 0); + source_codepage = select_charset (source_codepage, 0, title); errmsg = init_translation_table (source_codepage, display_codepage); if (errmsg) { Index: mc-4.6.2~git20080311/src/selcodepage.h =================================================================== --- mc-4.6.2~git20080311.orig/src/selcodepage.h 2008-02-19 18:25:27.000000000 +0100 +++ mc-4.6.2~git20080311/src/selcodepage.h 2008-06-09 18:00:33.000000000 +0200 @@ -2,8 +2,8 @@ #define MC_SELCODEPAGE_H #ifdef HAVE_CHARSET -int select_charset (int current_charset, int seldisplay); -int do_select_codepage (void); +int select_charset (int current_charset, int seldisplay, const char *title); +int do_select_codepage (const char *title); #endif /* HAVE_CHARSET */ #endif Index: mc-4.6.2~git20080311/src/setup.c =================================================================== --- mc-4.6.2~git20080311.orig/src/setup.c 2008-06-09 18:00:24.000000000 +0200 +++ mc-4.6.2~git20080311/src/setup.c 2008-06-09 18:00:33.000000000 +0200 @@ -49,6 +49,8 @@ #ifdef HAVE_CHARSET #include "charsets.h" +#include"recode.h" +#include "wtools.h" #endif #ifdef USE_NETCODE @@ -272,6 +274,11 @@ g_snprintf (buffer, sizeof (buffer), "%d", panel->user_mini_status); save_string (section, "user_mini_status", buffer, profile_name); + +#ifdef HAVE_CHARSET + // save panel codepage + save_string(section, "panel_display_codepage", get_codepage_id(panel->src_codepage), profile_name); +#endif } void @@ -374,6 +381,7 @@ #ifdef HAVE_CHARSET save_string( "Misc", "display_codepage", get_codepage_id( display_codepage ), profile_name ); + save_string( "Misc", "ftp_codepage", get_codepage_id(ftp_codepage), profile_name); #endif /* HAVE_CHARSET */ g_free (profile); @@ -423,6 +431,31 @@ panel->user_mini_status = load_int (section, "user_mini_status", 0); +#ifdef HAVE_CHARSET +//--- Loading panel codepage + panel_reset_codepage(panel); + if(load_codepages_list()>0) { + char cpname[128]; + char *errmsg; + + + if(display_codepage>=0) { + load_string(section, "panel_display_codepage", "", cpname, sizeof(cpname)); + if(cpname[0]!='\0') panel->src_codepage = get_codepage_index(cpname); + } + + errmsg=my_init_tt(display_codepage,panel->src_codepage,panel->tr_table); + if(errmsg) { + panel_reset_codepage(panel); + message( 1, MSG_ERROR, "%s", errmsg ); + } + errmsg=my_init_tt(panel->src_codepage,display_codepage,panel->tr_table_input); + if(errmsg) { + panel_reset_codepage(panel); + message( 1, MSG_ERROR, "%s", errmsg ); + } + } +#endif } static void @@ -572,10 +605,16 @@ #ifdef HAVE_CHARSET if ( load_codepages_list() > 0 ) { char cpname[128]; - load_string( "Misc", "display_codepage", "", - cpname, sizeof(cpname) ); - if ( cpname[0] != '\0' ) - display_codepage = get_codepage_index( cpname ); + get_locale_codepage(); + load_string("Misc", "display_codepage", "", cpname, sizeof(cpname)); + if(cpname[0] != '\0') display_codepage=get_codepage_index(cpname); + else display_codepage=lang_codepage; + + ftp_codepage=-1; + if(display_codepage >= 0) { + load_string( "Misc", "ftp_codepage", "", cpname, sizeof(cpname)); + if(cpname[0] != '\0') ftp_codepage=get_codepage_index(cpname); + } } init_translation_table( source_codepage, display_codepage ); Index: mc-4.6.2~git20080311/src/view.c =================================================================== --- mc-4.6.2~git20080311.orig/src/view.c 2008-06-09 18:00:24.000000000 +0200 +++ mc-4.6.2~git20080311/src/view.c 2008-06-09 18:00:33.000000000 +0200 @@ -3233,7 +3233,7 @@ #ifdef HAVE_CHARSET case XCTRL ('t'): - do_select_codepage (); + do_select_codepage (_(" Choose codepage ")); view->dirty++; view_update (view); return MSG_HANDLED; Index: mc-4.6.2~git20080311/vfs/vfs.c =================================================================== --- mc-4.6.2~git20080311.orig/vfs/vfs.c 2008-02-19 18:25:27.000000000 +0100 +++ mc-4.6.2~git20080311/vfs/vfs.c 2008-06-09 18:00:33.000000000 +0200 @@ -54,6 +54,11 @@ #include "smbfs.h" #include "local.h" +#include "../src/panel.h" +#ifdef HAVE_CHARSET +#include "../src/recode.h" +#endif + /* They keep track of the current directory */ static struct vfs_class *current_vfs; static char *current_dir; @@ -686,8 +691,66 @@ vfsid old_vfsid; int result; +#ifdef HAVE_CHARSET + char* errmsg; +#endif + WPanel* p=ret_panel; + new_dir = vfs_canon (path); new_vfs = vfs_get_class (new_dir); + old_vfsid = vfs_getid (current_vfs, current_dir); + old_vfs = current_vfs; + + if(p) { + + // Change from localfs to ftpfs + ret_panel=NULL; + if( (strcmp(old_vfs->name,"localfs")==0) && + (strcmp(new_vfs->name,"ftpfs")==0)){ + p->is_return=1; + strncpy(p->retdir,current_dir, MC_MAXPATHLEN); +#ifdef HAVE_CHARSET + p->ret_codepage=p->src_codepage; + p->src_codepage=ftp_codepage; + errmsg=my_init_tt(display_codepage,p->src_codepage,p->tr_table); + if(errmsg) { + panel_reset_codepage(p); + message( 1, MSG_ERROR, "%s", errmsg ); + } + errmsg=my_init_tt(p->src_codepage,display_codepage,p->tr_table_input); + if(errmsg) { + panel_reset_codepage(p); + message( 1, MSG_ERROR, "%s", errmsg ); + } +#endif + } + + // Change from ftpfs to localfs + if( (strcmp(old_vfs->name,"ftpfs")==0) && + (strcmp(new_vfs->name,"localfs")==0) && + p->is_return){ + p->is_return=0; + g_free(new_dir); + new_dir = vfs_canon (p->retdir); + new_vfs = vfs_get_class (new_dir); +#ifdef HAVE_CHARSET + p->src_codepage=p->ret_codepage; + errmsg=my_init_tt(display_codepage,p->src_codepage,p->tr_table); + if(errmsg) { + panel_reset_codepage(p); + message( 1, MSG_ERROR, "%s", errmsg ); + } + errmsg=my_init_tt(p->src_codepage,display_codepage,p->tr_table_input); + if(errmsg) { + panel_reset_codepage(p); + message( 1, MSG_ERROR, "%s", errmsg ); + } +#endif + } + } + + + if (!new_vfs->chdir) { g_free (new_dir); return -1; @@ -701,9 +764,6 @@ return -1; } - old_vfsid = vfs_getid (current_vfs, current_dir); - old_vfs = current_vfs; - /* Actually change directory */ g_free (current_dir); current_dir = new_dir;