From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1NEMIt-000550-UK for mharc-grub-devel@gnu.org; Sat, 28 Nov 2009 07:21:32 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NEMIr-00054M-Qy for grub-devel@gnu.org; Sat, 28 Nov 2009 07:21:29 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NEMIn-00050d-8W for grub-devel@gnu.org; Sat, 28 Nov 2009 07:21:29 -0500 Received: from [199.232.76.173] (port=50086 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NEMIm-00050V-US for grub-devel@gnu.org; Sat, 28 Nov 2009 07:21:24 -0500 Received: from 197.red-80-32-81.staticip.rima-tde.net ([80.32.81.197]:46457 helo=mail.pina.cat) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NEMIl-0002oE-UG for grub-devel@gnu.org; Sat, 28 Nov 2009 07:21:24 -0500 Received: from pinux (82-45-164-87.cable.ubr06.hari.blueyonder.co.uk [82.45.164.87]) by mail.pina.cat (Postfix) with ESMTP id 31DF028904CA1 for ; Sat, 28 Nov 2009 13:21:22 +0100 (CET) Received: by pinux (Postfix, from userid 1000) id 167033EBD; Sat, 28 Nov 2009 12:21:28 +0000 (GMT) Date: Sat, 28 Nov 2009 12:21:28 +0000 From: Carles Pina i Estany To: grub-devel@gnu.org Message-ID: <20091128122128.GA18747@pina.cat> References: <20091128000948.GA2764@pina.cat> <20091128012417.GA8530@pina.cat> <20091128014705.GA9726@pina.cat> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="rwEMma7ioTxnRzrJ" Content-Disposition: inline In-Reply-To: <20091128014705.GA9726@pina.cat> User-Agent: Mutt/1.5.20 (2009-06-14) X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) Subject: Re: gettext: normal_menu.c X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Nov 2009 12:21:30 -0000 --rwEMma7ioTxnRzrJ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi, I've added some easy changes for normal/menu_entry.c So better review this patch. Thanks! -- Carles Pina i Estany http://pinux.info --rwEMma7ioTxnRzrJ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="ChangeLog.normal" 2009-11-28 Carles Pina i Estany * normal/menu_text.c (grub_color_menu_high): Gettexttize string. (print_spaces): New function. (grub_print_ucs4): New function. (print_message_indented): New function. (getstringwidth): New function. (print_message): Gettexttize strings using print_message_indented. (run_menu): Replaces grub_printf by dynamic terminal width print_spaces. (get_entry_number): Gettextize and uses dynamic terminal width. (notify_booting, notify_fallback, notify_execution_failure): Gettextize. * normal/menu_entry.c (store_completion): Cleanup the gettextized string (run): Likewise. (grub_menu_entry_run): Likewise. --rwEMma7ioTxnRzrJ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="normal_menu_gettext3.patch" === modified file 'normal/menu_entry.c' --- normal/menu_entry.c 2009-11-23 20:31:57 +0000 +++ normal/menu_entry.c 2009-11-28 12:14:22 +0000 @@ -836,7 +836,9 @@ store_completion (const char *item, grub } grub_gotoxy (0, GRUB_TERM_HEIGHT - 3); - grub_printf (" Possible %s are:\n ", what); + grub_printf (" "); + grub_printf (_("Possible %s are:"), what); + grub_printf ("\n "); } /* Make sure that the completion buffer has enough room. */ @@ -997,7 +999,9 @@ run (struct screen *screen) } grub_cls (); - grub_printf (_(" Booting a command list\n\n")); + grub_printf (" "); + grub_printf (_("Booting a command list")); + grub_printf ("\n\n"); /* Execute the script, line for line. */ @@ -1177,6 +1181,7 @@ grub_menu_entry_run (grub_menu_entry_t e grub_cls (); grub_print_error (); grub_errno = GRUB_ERR_NONE; - grub_printf (_("\nPress any key to continue...")); + grub_putchar ('\n'); + grub_printf (_("Press any key to continue...")); (void) grub_getkey (); } === modified file 'normal/menu_text.c' --- normal/menu_text.c 2009-11-23 20:59:24 +0000 +++ normal/menu_text.c 2009-11-28 01:18:23 +0000 @@ -39,7 +39,8 @@ static grub_uint8_t grub_color_menu_high void grub_wait_after_message (void) { - grub_printf ("\nPress any key to continue..."); + grub_putchar('\n'); + grub_printf (_("Press any key to continue...")); (void) grub_getkey (); grub_putchar ('\n'); } @@ -81,28 +82,128 @@ draw_border (void) } static void +print_spaces (int number_spaces) +{ + int i; + for (i = 0; i < number_spaces; i++) + grub_putchar(' '); +} + +static void +grub_print_ucs4 (const grub_uint32_t* str, const grub_uint32_t* last_position) +{ + while (str < last_position) + { + grub_putcode(*str); + str++; + } +} + +static grub_ssize_t +getstringwidth(grub_uint32_t* str, const grub_uint32_t* last_position) +{ + grub_ssize_t width = 0; + + while (str < last_position) + { + width += grub_getcharwidth(*str); + str++; + } + return width; +} + +static void +print_message_indented(const char* msg) +{ + const int line_len = GRUB_TERM_WIDTH - grub_getcharwidth('m') * 15; + + grub_uint32_t *unicode_msg; + + grub_ssize_t msg_len = grub_strlen(msg); + + unicode_msg = grub_malloc (msg_len * sizeof(*unicode_msg)); + + msg_len = grub_utf8_to_ucs4 (unicode_msg, msg_len, + (grub_uint8_t *) msg, -1, 0); + + if (! unicode_msg) + { + grub_printf("print_message_indented ERROR1: %s",msg); + return; + } + + if (msg_len < 0) + { + grub_printf("print_message_indented ERROR2: %s",msg); + grub_free (unicode_msg); + return; + } + + const grub_uint32_t* last_position = unicode_msg + msg_len; + + grub_uint32_t* current_position = unicode_msg; + + grub_uint32_t* next_new_line = unicode_msg; + + while (current_position < last_position) + { + next_new_line = (grub_uint32_t*)last_position; + + while (getstringwidth(current_position,next_new_line) > line_len + || (*next_new_line != ' ' && next_new_line > current_position && + next_new_line != last_position)) + { + next_new_line--; + } + + if (next_new_line == current_position) + { + next_new_line = (next_new_line + line_len > last_position) ? + (grub_uint32_t*)last_position : + next_new_line + line_len; + } + + print_spaces(6); + grub_print_ucs4(current_position,next_new_line); + grub_putchar('\n'); + + next_new_line++; + current_position = next_new_line; + } + grub_free(unicode_msg); +} + +static void print_message (int nested, int edit) { grub_setcolorstate (GRUB_TERM_COLOR_NORMAL); - + + grub_putchar ('\n'); if (edit) { - grub_printf ("\n\ - Minimum Emacs-like screen editing is supported. TAB lists\n\ - completions. Press Ctrl-x to boot, Ctrl-c for a command-line\n\ - or ESC to return menu."); + print_message_indented(_("Minimum Emacs-like screen editing is \ +supported. TAB lists completions. Press Ctrl-x to boot, Ctrl-c for a \ +command-line or ESC to return menu.")); } else { - grub_printf (_("\n\ - Use the %C and %C keys to select which entry is highlighted.\n"), - (grub_uint32_t) GRUB_TERM_DISP_UP, (grub_uint32_t) GRUB_TERM_DISP_DOWN); - grub_printf ("\ - Press enter to boot the selected OS, \'e\' to edit the\n\ - commands before booting or \'c\' for a command-line."); + const char *msg = _("Use the %C and %C keys to select which \ +entry is highlighted."); + char* msg_translated = grub_malloc(sizeof(char) * grub_strlen(msg) + 1); + + grub_sprintf(msg_translated, msg, (grub_uint32_t) GRUB_TERM_DISP_UP, (grub_uint32_t) GRUB_TERM_DISP_DOWN); + print_message_indented(msg_translated); + + grub_free (msg_translated); + + print_message_indented(_("Press enter to boot the selected OS, \ +\'e\' to edit the commands before booting or \'c\' for a command-line.")); + if (nested) - grub_printf ("\n\ - ESC to return previous menu."); + { + grub_printf ("\n "); + grub_printf(_("ESC to return previous menu.")); + } } } @@ -265,13 +366,16 @@ get_entry_number (const char *name) static void print_timeout (int timeout, int offset, int second_stage) { - /* NOTE: Do not remove the trailing space characters. - They are required to clear the line. */ - char *msg = " The highlighted entry will be booted automatically in %ds. "; + const char *msg = _("The highlighted entry will be booted automatically in %ds."); + const int msg_localized_len = grub_strlen (msg); + const int number_spaces = GRUB_TERM_WIDTH - msg_localized_len - 3; + char *msg_end = grub_strchr (msg, '%'); - grub_gotoxy (second_stage ? (msg_end - msg) : 0, GRUB_TERM_HEIGHT - 3); + grub_gotoxy (second_stage ? (msg_end - msg + 3) : 3, GRUB_TERM_HEIGHT - 3); grub_printf (second_stage ? msg_end : msg, timeout); + print_spaces (second_stage ? number_spaces : 0); + grub_gotoxy (GRUB_TERM_CURSOR_X, GRUB_TERM_FIRST_ENTRY_Y + offset); grub_refresh (); }; @@ -360,8 +464,7 @@ run_menu (grub_menu_t menu, int nested, if (timeout >= 0) { grub_gotoxy (0, GRUB_TERM_HEIGHT - 3); - grub_printf ("\ - "); + print_spaces (GRUB_TERM_WIDTH - 1); grub_env_unset ("timeout"); grub_env_unset ("fallback"); grub_gotoxy (GRUB_TERM_CURSOR_X, GRUB_TERM_FIRST_ENTRY_Y + offset); @@ -517,7 +620,9 @@ static void notify_booting (grub_menu_entry_t entry, void *userdata __attribute__((unused))) { - grub_printf (" Booting \'%s\'\n\n", entry->title); + grub_printf (" "); + grub_printf (_("Booting \'%s\'"), entry->title); + grub_printf ("\n\n"); } /* Callback invoked when a default menu entry executed because of a timeout @@ -527,7 +632,9 @@ static void notify_fallback (grub_menu_entry_t entry, void *userdata __attribute__((unused))) { - grub_printf ("\n Falling back to \'%s\'\n\n", entry->title); + grub_printf ("\n "); + grub_printf (_("Falling back to \'%s\'"), entry->title); + grub_printf ("\n\n"); grub_millisleep (DEFAULT_ENTRY_ERROR_DELAY_MS); } @@ -541,7 +648,9 @@ notify_execution_failure (void *userdata grub_print_error (); grub_errno = GRUB_ERR_NONE; } - grub_printf ("\n Failed to boot default entries.\n"); + grub_printf ("\n "); + grub_printf (_("Failed to boot default entries.")); + grub_putchar ('\n'); grub_wait_after_message (); } --rwEMma7ioTxnRzrJ--