From 205fa24e7dd8813f0f4cdfdb04ed933982639422 Mon Sep 17 00:00:00 2001 From: Andrew Borodin Date: Sun, 14 Jun 2009 19:05:57 +0400 Subject: [PATCH 1/3] Fixed codepage selection (#402). Signed-off-by: Andrew Borodin --- edit/edit.c | 9 ++++++-- edit/editcmd.c | 11 +++++++--- edit/editkeys.c | 1 - src/boxes.c | 29 +++++++++++++++---------- src/screen.c | 20 ++++++++--------- src/selcodepage.c | 55 +++++++++++++++++++++++++++++++---------------- src/selcodepage.h | 22 ++++++++++++++++--- src/view.c | 21 +++++++++--------- 8 files changed, 109 insertions(+), 59 deletions(-) diff --git a/edit/edit.c b/edit/edit.c index 8cadea777..488650f80 100644 --- a/edit/edit.c +++ b/edit/edit.c @@ -281,13 +281,18 @@ edit_load_file_fast (WEdit *edit, const char *filename) { long buf, buf2; int file = -1; +#ifdef HAVE_CHARSET + char *cp_id; +#endif edit->curs2 = edit->last_byte; buf2 = edit->curs2 >> S_EDIT_BUF_SIZE; edit->utf8 = 0; #ifdef HAVE_CHARSET - if ( get_codepage_id( source_codepage ) ) - edit->utf8 = str_isutf8 (get_codepage_id( source_codepage )); + cp_id = get_codepage_id (source_codepage); + + if (cp_id != NULL) + edit->utf8 = str_isutf8 (cp_id); #endif if ((file = mc_open (filename, O_RDONLY | O_BINARY)) == -1) { GString *errmsg = g_string_new(NULL); diff --git a/edit/editcmd.c b/edit/editcmd.c index afb052543..8e8022249 100644 --- a/edit/editcmd.c +++ b/edit/editcmd.c @@ -2335,9 +2335,14 @@ void edit_select_codepage_cmd (WEdit *edit) { #ifdef HAVE_CHARSET - do_select_codepage (); - if ( get_codepage_id (source_codepage) ) - edit->utf8 = str_isutf8 (get_codepage_id (source_codepage)); + if (do_select_codepage ()) { + char *cp_id; + + cp_id = get_codepage_id (source_codepage); + if (cp_id != NULL) + edit->utf8 = str_isutf8 (cp_id); + } + edit->force = REDRAW_COMPLETELY; edit_refresh_cmd (edit); #endif diff --git a/edit/editkeys.c b/edit/editkeys.c index 03443a254..c18344744 100644 --- a/edit/editkeys.c +++ b/edit/editkeys.c @@ -48,7 +48,6 @@ #include "../src/key.h" /* KEY_M_SHIFT */ #include "../src/tty.h" /* keys */ #include "../src/charsets.h" /* convert_from_input_c() */ -#include "../src/selcodepage.h" /* do_select_codepage() */ #include "../src/main.h" /* display_codepage */ #include "../src/strutil.h" /* str_isutf8 () */ diff --git a/src/boxes.c b/src/boxes.c index 06d3184a5..a299d4510 100644 --- a/src/boxes.c +++ b/src/boxes.c @@ -567,19 +567,26 @@ static WCheck *inpcheck; static int sel_charset_button (int action) { - const char *cpname; - char buf[64]; + int new_dcp; + (void) action; - new_display_codepage = select_charset (0, 0, new_display_codepage, 1); - cpname = (new_display_codepage < 0) - ? _("Other 8 bit") - : codepages[new_display_codepage].name; - if ( cpname ) - utf8_display = str_isutf8 (cpname); - /* avoid strange bug with label repainting */ - g_snprintf (buf, sizeof (buf), "%-27s", cpname); - label_set_text (cplabel, buf); + new_dcp = select_charset (0, 0, new_display_codepage, TRUE); + + if (new_dcp != SELECT_CHARSET_CANCEL) { + const char *cpname; + char buf[BUF_TINY]; + + new_display_codepage = new_dcp; + cpname = (new_display_codepage == SELECT_CHARSET_OTHER_8BIT) ? + _("Other 8 bit") : codepages[new_display_codepage].name; + if (cpname != NULL) + utf8_display = str_isutf8 (cpname); + /* avoid strange bug with label repainting */ + g_snprintf (buf, sizeof (buf), "%-27s", cpname); + label_set_text (cplabel, buf); + } + return 0; } diff --git a/src/screen.c b/src/screen.c index fd7a043be..bc3a05d18 100644 --- a/src/screen.c +++ b/src/screen.c @@ -54,7 +54,7 @@ #include "main.h" /* the_menubar */ #include "unixcompat.h" #include "mountlist.h" /* my_statfs */ -#include "selcodepage.h" /* do_select_codepage () */ +#include "selcodepage.h" /* select_charset () */ #include "charsets.h" /* get_codepage_id () */ #include "strutil.h" @@ -2651,13 +2651,13 @@ set_panel_encoding (WPanel *panel) int r; int width = (panel->widget.x)? panel->widget.cols : panel->widget.cols * (-1); - r = select_charset (width, 0, source_codepage, 0); + r = select_charset (width, 0, source_codepage, FALSE); - if ( r == -2) - return; + if (r == SELECT_CHARSET_CANCEL) + return; /* Cancel */ - - if (r == -1){ + if (r == SELECT_CHARSET_NO_TRANSLATE) { + /* No translation */ errmsg = init_translation_table (display_codepage, display_codepage); cd_path = remove_encoding_from_path (panel->cwd); do_panel_cd (panel, cd_path, 0); @@ -2672,13 +2672,13 @@ set_panel_encoding (WPanel *panel) message (D_ERROR, MSG_ERROR, "%s", errmsg); return; } - encoding = g_strdup( get_codepage_id ( source_codepage ) ); + + encoding = get_codepage_id (source_codepage); #endif - if (encoding) { + if (encoding != NULL) { cd_path = add_encoding_to_path (panel->cwd, encoding); if (!do_panel_cd (panel, cd_path, 0)) - message (1, MSG_ERROR, _(" Cannot chdir to %s "), cd_path); + message (D_ERROR, MSG_ERROR, _(" Cannot chdir to %s "), cd_path); g_free (cd_path); - g_free (encoding); } } diff --git a/src/selcodepage.c b/src/selcodepage.c index 36d52f1bb..fb1759d86 100644 --- a/src/selcodepage.c +++ b/src/selcodepage.c @@ -48,16 +48,22 @@ get_hotkey (int n) return (n <= 9) ? '0' + n : 'a' + n - 10; } +/* Return value: + * -2 (SELECT_CHARSET_CANCEL) : Cancel + * -1 (SELECT_CHARSET_OTHER_8BIT) : "Other 8 bit" if seldisplay == TRUE + * -1 (SELECT_CHARSET_NO_TRANSLATE) : "No translation" if seldisplay == FALSE + * >= 0 : charset number + */ int -select_charset (int delta_x, int delta_y, int current_charset, int seldisplay) +select_charset (int delta_x, int delta_y, int current_charset, gboolean seldisplay) { - int i, menu_lines = n_codepages + 1; + int i; char buffer[255]; /* Create listbox */ Listbox *listbox = create_listbox_window_delta (delta_x, delta_y, - ENTRY_LEN + 2, menu_lines, - _(" Choose input codepage "), + ENTRY_LEN + 2, n_codepages + 1, + _("Choose codepage"), "[Codepages Translation]"); if (!seldisplay) @@ -87,29 +93,40 @@ select_charset (int delta_x, int delta_y, int current_charset, int seldisplay) i = run_listbox (listbox); - return (seldisplay) ? ((i >= n_codepages) ? -1 : i) - : (i - 1); + if (i < 0) { + /* Cancel dialog */ + return SELECT_CHARSET_CANCEL; + } else { + /* some charset has been selected */ + if (seldisplay) { + /* charset list is finished with "Other 8 bit" item */ + return (i >= n_codepages) ? SELECT_CHARSET_OTHER_8BIT : i; + } else { + /* charset list is began with "- < No translation >" item */ + return (i - 1); + } + } } -/* Helper functions for codepages support */ - - -int +gboolean do_select_codepage (void) { - const char *errmsg; + const char *errmsg = NULL; int r; - r = select_charset (0, 0, source_codepage, 0); - if ( r > 0 ) - source_codepage = r; + r = select_charset (0, 0, source_codepage, FALSE); + if (r == SELECT_CHARSET_CANCEL) + return FALSE; - errmsg = init_translation_table (source_codepage, display_codepage); - if (errmsg) { + source_codepage = r; + + errmsg = init_translation_table (r == SELECT_CHARSET_NO_TRANSLATE ? + display_codepage : source_codepage, + display_codepage); + if (errmsg != NULL) message (D_ERROR, MSG_ERROR, "%s", errmsg); - return -1; - } - return 0; + + return (errmsg == NULL); } #endif /* HAVE_CHARSET */ diff --git a/src/selcodepage.h b/src/selcodepage.h index b64a9d1e3..e16def969 100644 --- a/src/selcodepage.h +++ b/src/selcodepage.h @@ -7,8 +7,24 @@ #define MC_SELCODEPAGE_H #ifdef HAVE_CHARSET -int select_charset (int delta_x, int delta_y, int current_charset, int seldisplay); -int do_select_codepage (void); + +#include "global.h" + +int select_charset (int delta_x, int delta_y, int current_charset, gboolean seldisplay); +gboolean do_select_codepage (void); + +/* some results of select_charset() */ +#define SELECT_CHARSET_CANCEL -2 +/* select_charset() returns this value if dialog has been cenceled */ +#define SELECT_CHARSET_OTHER_8BIT -1 +/* select_charset() returns this value if seldisplay == TRUE + * and the last item has been selected. Last item is "Other 8 bits" */ +#define SELECT_CHARSET_NO_TRANSLATE -1 +/* select_charset() returns this value if seldisplay == FALSE + * and the 1st item has been selected. 1st item is "No translation" */ +/* In other cases select_charset() returns non-negative value + * which is number of codepage in codepage list */ + #endif /* HAVE_CHARSET */ -#endif +#endif /* MC_SELCODEPAGE_H */ diff --git a/src/view.c b/src/view.c index df1d32885..59b15c9bb 100644 --- a/src/view.c +++ b/src/view.c @@ -3466,15 +3466,17 @@ static void view_cmk_moveto_bottom (void *w, int n) { static void view_select_encoding (WView *view) { - char *enc = NULL; - GIConv conv; - struct cache_line *line; - #ifdef HAVE_CHARSET - do_select_codepage (); - enc = g_strdup( get_codepage_id ( source_codepage ) ); -#endif - if ( enc ) { + char *enc = NULL; + + if (!do_select_codepage ()) + return; + + enc = get_codepage_id (source_codepage); + if (enc != NULL) { + GIConv conv; + struct cache_line *line; + conv = str_crt_conv_from (enc); if (conv != INVALID_CONV) { if (view->converter != str_cnv_from_term) @@ -3484,9 +3486,8 @@ view_select_encoding (WView *view) line = view_offset_to_line (view, view->dpy_start); view_set_first_showed (view, line); } - g_free(enc); } - +#endif } From 6e86e9f3835a6bf4812181d507e2f26a84714e0a Mon Sep 17 00:00:00 2001 From: Andrew Borodin Date: Mon, 15 Jun 2009 23:35:20 +0400 Subject: [PATCH 2/3] Fixed type of variables that store result of get_codepage_id(). --- edit/edit.c | 2 +- edit/editcmd.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/edit/edit.c b/edit/edit.c index 488650f80..e46b4d5d9 100644 --- a/edit/edit.c +++ b/edit/edit.c @@ -282,7 +282,7 @@ edit_load_file_fast (WEdit *edit, const char *filename) long buf, buf2; int file = -1; #ifdef HAVE_CHARSET - char *cp_id; + const char *cp_id; #endif edit->curs2 = edit->last_byte; diff --git a/edit/editcmd.c b/edit/editcmd.c index 8e8022249..4054d1e25 100644 --- a/edit/editcmd.c +++ b/edit/editcmd.c @@ -2336,7 +2336,7 @@ edit_select_codepage_cmd (WEdit *edit) { #ifdef HAVE_CHARSET if (do_select_codepage ()) { - char *cp_id; + const char *cp_id; cp_id = get_codepage_id (source_codepage); if (cp_id != NULL) From efbbd3883f2f054466cc797ff44dc818eabe8a6b Mon Sep 17 00:00:00 2001 From: Andrew Borodin Date: Tue, 16 Jun 2009 11:32:59 +0400 Subject: [PATCH 3/3] Fixed source_codepage handling in editor (#402). Signed-off-by: Andrew Borodin --- edit/editcmd.c | 4 +++- edit/editdraw.c | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/edit/editcmd.c b/edit/editcmd.c index 4054d1e25..45892f7d6 100644 --- a/edit/editcmd.c +++ b/edit/editcmd.c @@ -2338,7 +2338,9 @@ edit_select_codepage_cmd (WEdit *edit) if (do_select_codepage ()) { const char *cp_id; - cp_id = get_codepage_id (source_codepage); + cp_id = get_codepage_id (source_codepage >= 0 ? + source_codepage : display_codepage); + if (cp_id != NULL) edit->utf8 = str_isutf8 (cp_id); } diff --git a/edit/editdraw.c b/edit/editdraw.c index 9c84d98de..e94f193d3 100644 --- a/edit/editdraw.c +++ b/edit/editdraw.c @@ -126,7 +126,7 @@ static void status_string (WEdit * edit, char *s, int w) byte_str, #ifdef HAVE_CHARSET - get_codepage_id ( source_codepage ) + source_codepage >= 0 ? get_codepage_id (source_codepage) : "" #else "" #endif @@ -150,7 +150,7 @@ static void status_string (WEdit * edit, char *s, int w) byte_str, #ifdef HAVE_CHARSET - get_codepage_id ( source_codepage ) + source_codepage >= 0 ? get_codepage_id (source_codepage) : "" #else "" #endif