X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xaw%2Fxoptions.c;h=1353b8b753a4b8daec4ea6e086bec0a64d0f95ad;hb=eea9762ed01db254f9936bcd8708c73fc6a1678e;hp=4770f5378a6bb7064c483cd54c6eed6d87567e60;hpb=55fdfba16e54a8c9e770124f4a468956b478e90c;p=xboard.git diff --git a/xaw/xoptions.c b/xaw/xoptions.c index 4770f53..1353b8b 100644 --- a/xaw/xoptions.c +++ b/xaw/xoptions.c @@ -1,7 +1,7 @@ /* * xoptions.c -- Move list window, part of X front end for XBoard * - * Copyright 2000, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. + * Copyright 2000, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify @@ -373,6 +373,46 @@ CreateMenuItem (Widget menu, char *msg, XtCallbackProc CB, int n) return entry; } +char * +format_accel (char *input) +{ + char *output; + char *key,*test; + + output = strdup(""); + + if( strstr(input, "") ) + { + output = realloc(output, strlen(output) + strlen(_("Ctrl"))+2); + strncat(output, _("Ctrl"), strlen(_("Ctrl")) +1); + strncat(output, "+", 1); + }; + if( strstr(input, "") ) + { + output = realloc(output, strlen(output) + strlen(_("Alt"))+2); + strncat(output, _("Alt"), strlen(_("Alt")) +1); + strncat(output, "+", 1); + }; + if( strstr(input, "") ) + { + output = realloc(output, strlen(output) + strlen(_("Shift"))+2); + strncat(output, _("Shift"), strlen(_("Shift")) +1); + strncat(output, "+", 1); + }; + + test = strrchr(input, '>'); + if ( test==NULL ) + key = strdup(input); + else + key = strdup(++test); // remove ">" + + output = realloc(output, strlen(output) + strlen(_(key))+2); + strncat(output, _(key), strlen(key) +1); + + free(key); + return output; +} + static Widget CreateComboPopup (Widget parent, Option *opt, int n, int fromList, int def) { // fromList determines if the item texts are taken from a list of strings, or from a menu table @@ -381,20 +421,47 @@ CreateComboPopup (Widget parent, Option *opt, int n, int fromList, int def) Arg arg; MenuItem *mb = (MenuItem *) opt->choice; char **list = (char **) opt->choice; + int maxlength=0; + if(list[0] == NULL) return NULL; // avoid empty menus, as they cause crash menu = XtCreatePopupShell(opt->name, simpleMenuWidgetClass, parent, NULL, 0); - for (i=0; 1; i++) + if(!fromList) + for (i=0; mb[i].string; i++) + if (maxlength < strlen(_(mb[i].string)) ) + maxlength = strlen(_(mb[i].string) ); + + for (i=0; 1; i++) { char *msg = fromList ? list[i] : mb[i].string; + char *label=NULL; + if(!msg) break; - entry = CreateMenuItem(menu, opt->min & NO_GETTEXT ? msg : _(msg), (XtCallbackProc) ComboSelect, (n<<16)+i); + + if(!fromList && mb[i].accel) + { + char *menuname = opt->min & NO_GETTEXT ? msg : _(msg); + char *accel = format_accel(mb[i].accel); + size_t len; + int fill = maxlength - strlen(menuname) +2+strlen(accel); + + len = strlen(menuname)+fill+1; + label = malloc(len); + + snprintf(label,len,"%s%*s",menuname,fill,accel); + free(accel); + } + else + label = strdup(opt->min & NO_GETTEXT ? msg : _(msg)); + + entry = CreateMenuItem(menu, label, (XtCallbackProc) ComboSelect, (n<<16)+i); if(!fromList) mb[i].handle = (void*) entry; // save item ID, for enabling / checkmarking if(i==def) { XtSetArg(arg, XtNpopupOnEntry, entry); XtSetValues(menu, &arg, 1); } + free(label); } return menu; } @@ -457,7 +524,7 @@ RaiseWindow (DialogClass dlg) SubstructureRedirectMask | SubstructureNotifyMask, &xev); - XFlush(xDisplay); + XFlush(xDisplay); XSync(xDisplay, False); } @@ -638,7 +705,7 @@ GenericCallback (Widget w, XtPointer client_data, XtPointer call_data) currentOption = dialogOptions[dlg=data>>16]; data &= 0xFFFF; oldSh = shells[dlg]; shells[dlg] = sh; // bow to reality if (data == 30000) { // cancel - PopDown(dlg); + PopDown(dlg); } else if (data == 30001) { // save buttons imply OK if(GenericReadout(currentOption, -1)) PopDown(dlg); // calls OK-proc after full readout, but no popdown if it returns false @@ -873,7 +940,7 @@ GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent XtSetArg(args[j], XtNdisplayCaret, False); j++; XtSetArg(args[j], XtNresizable, True); j++; XtSetArg(args[j], XtNinsertPosition, 9999); j++; - XtSetArg(args[j], XtNstring, option[i].type==Spin || option[i].type==Fractional ? def : + XtSetArg(args[j], XtNstring, option[i].type==Spin || option[i].type==Fractional ? def : engineDlg ? option[i].textValue : *(char**)option[i].target); j++; edit = last; option[i].handle = (void*) @@ -1230,8 +1297,7 @@ HardSetFocus (Option *opt) } void -FileNamePopUpGTK(char *label, char *def, char *filter, FileProc proc, Boolean pathFlag, char *openMode, char **openName, FILE **openFP) +FileNamePopUpWrapper (char *label, char *def, char *filter, FileProc proc, Boolean pathFlag, char *openMode, char **openName, FILE **openFP) { Browse(BoardWindow, label, (def[0] ? def : NULL), filter, False, openMode, openName, openFP); } -