From 77a27e1bd7b3aed8bd45672682a36afb82036123 Mon Sep 17 00:00:00 2001 From: Eddy De Greef Date: Fri, 16 Jan 2004 09:18:28 +0000 Subject: [PATCH] Applied the "OpenMotif sticky radio button" workaround to all radio buttons. --- source/highlightData.c | 42 +++++++++++++++++++++--------------------- source/preferences.c | 22 +++++++++++----------- source/search.c | 22 +++++++++++----------- source/userCmds.c | 32 ++++++++++++++++---------------- util/misc.c | 10 +++++++--- util/misc.h | 4 ++-- 6 files changed, 68 insertions(+), 64 deletions(-) diff --git a/source/highlightData.c b/source/highlightData.c index 09ec993..f1ceaae 100644 --- a/source/highlightData.c +++ b/source/highlightData.c @@ -1,4 +1,4 @@ -static const char CVSID[] = "$Id: highlightData.c,v 1.59 2003/12/28 17:25:55 yooden Exp $"; +static const char CVSID[] = "$Id: highlightData.c,v 1.60 2004/01/16 09:18:27 edg Exp $"; /******************************************************************************* * * * highlightData.c -- Maintain, and allow user to edit, highlight pattern list * @@ -2001,18 +2001,18 @@ static void hsSetDisplayedCB(void *item, void *cbArg) XmTextSetString(HSDialog.nameW, ""); XmTextSetString(HSDialog.colorW, ""); XmTextSetString(HSDialog.bgColorW, ""); - XmToggleButtonSetState(HSDialog.plainW, True, False); - XmToggleButtonSetState(HSDialog.boldW, False, False); - XmToggleButtonSetState(HSDialog.italicW, False, False); - XmToggleButtonSetState(HSDialog.boldItalicW, False, False); + RadioButtonChangeState(HSDialog.plainW, True, False); + RadioButtonChangeState(HSDialog.boldW, False, False); + RadioButtonChangeState(HSDialog.italicW, False, False); + RadioButtonChangeState(HSDialog.boldItalicW, False, False); } else { XmTextSetString(HSDialog.nameW, hs->name); XmTextSetString(HSDialog.colorW, hs->color); XmTextSetString(HSDialog.bgColorW, hs->bgColor ? hs->bgColor : ""); - XmToggleButtonSetState(HSDialog.plainW, hs->font==PLAIN_FONT, False); - XmToggleButtonSetState(HSDialog.boldW, hs->font==BOLD_FONT, False); - XmToggleButtonSetState(HSDialog.italicW, hs->font==ITALIC_FONT, False); - XmToggleButtonSetState(HSDialog.boldItalicW, hs->font==BOLD_ITALIC_FONT, + RadioButtonChangeState(HSDialog.plainW, hs->font==PLAIN_FONT, False); + RadioButtonChangeState(HSDialog.boldW, hs->font==BOLD_FONT, False); + RadioButtonChangeState(HSDialog.italicW, hs->font==ITALIC_FONT, False); + RadioButtonChangeState(HSDialog.boldItalicW, hs->font==BOLD_ITALIC_FONT, False); } } @@ -3126,12 +3126,12 @@ static void setDisplayedCB(void *item, void *cbArg) XmTextSetString(HighlightDialog.startW, ""); XmTextSetString(HighlightDialog.endW, ""); XmTextSetString(HighlightDialog.errorW, ""); - XmToggleButtonSetState(HighlightDialog.topLevelW, True, False); - XmToggleButtonSetState(HighlightDialog.deferredW, False, False); - XmToggleButtonSetState(HighlightDialog.subPatW, False, False); - XmToggleButtonSetState(HighlightDialog.colorPatW, False, False); - XmToggleButtonSetState(HighlightDialog.simpleW, True, False); - XmToggleButtonSetState(HighlightDialog.rangeW, False, False); + RadioButtonChangeState(HighlightDialog.topLevelW, True, False); + RadioButtonChangeState(HighlightDialog.deferredW, False, False); + RadioButtonChangeState(HighlightDialog.subPatW, False, False); + RadioButtonChangeState(HighlightDialog.colorPatW, False, False); + RadioButtonChangeState(HighlightDialog.simpleW, True, False); + RadioButtonChangeState(HighlightDialog.rangeW, False, False); setStyleMenu("Plain"); } else { isSubpat = pat->subPatternOf != NULL; @@ -3143,16 +3143,16 @@ static void setDisplayedCB(void *item, void *cbArg) XmTextSetString(HighlightDialog.startW, pat->startRE); XmTextSetString(HighlightDialog.endW, pat->endRE); XmTextSetString(HighlightDialog.errorW, pat->errorRE); - XmToggleButtonSetState(HighlightDialog.topLevelW, + RadioButtonChangeState(HighlightDialog.topLevelW, !isSubpat && !isDeferred, False); - XmToggleButtonSetState(HighlightDialog.deferredW, + RadioButtonChangeState(HighlightDialog.deferredW, !isSubpat && isDeferred, False); - XmToggleButtonSetState(HighlightDialog.subPatW, + RadioButtonChangeState(HighlightDialog.subPatW, isSubpat && !isColorOnly, False); - XmToggleButtonSetState(HighlightDialog.colorPatW, + RadioButtonChangeState(HighlightDialog.colorPatW, isSubpat && isColorOnly, False); - XmToggleButtonSetState(HighlightDialog.simpleW, !isRange, False); - XmToggleButtonSetState(HighlightDialog.rangeW, isRange, False); + RadioButtonChangeState(HighlightDialog.simpleW, !isRange, False); + RadioButtonChangeState(HighlightDialog.rangeW, isRange, False); setStyleMenu(pat->style); } updateLabels(); diff --git a/source/preferences.c b/source/preferences.c index 36f1a0f..346de25 100644 --- a/source/preferences.c +++ b/source/preferences.c @@ -1,4 +1,4 @@ -static const char CVSID[] = "$Id: preferences.c,v 1.106 2004/01/16 02:59:15 tksoh Exp $"; +static const char CVSID[] = "$Id: preferences.c,v 1.107 2004/01/16 09:18:28 edg Exp $"; /******************************************************************************* * * * preferences.c -- Nirvana Editor preferences processing * @@ -3248,8 +3248,8 @@ static void lmSetDisplayedCB(void *item, void *cbArg) XmTextSetString(LMDialog.delimitW, ""); XmTextSetString(LMDialog.tabW, ""); XmTextSetString(LMDialog.emTabW, ""); - XmToggleButtonSetState(LMDialog.defaultIndentW, True, True); - XmToggleButtonSetState(LMDialog.defaultWrapW, True, True); + RadioButtonChangeState(LMDialog.defaultIndentW, True, True); + RadioButtonChangeState(LMDialog.defaultWrapW, True, True); } else { XmTextSetString(LMDialog.nameW, strchr(lm->name, ':') == NULL ? lm->name : strchr(lm->name, ':')+1); @@ -3267,21 +3267,21 @@ static void lmSetDisplayedCB(void *item, void *cbArg) XmTextSetString(LMDialog.emTabW, ""); else SetIntText(LMDialog.emTabW, lm->emTabDist); - XmToggleButtonSetState(LMDialog.defaultIndentW, + RadioButtonChangeState(LMDialog.defaultIndentW, lm->indentStyle == DEFAULT_INDENT, False); - XmToggleButtonSetState(LMDialog.noIndentW, + RadioButtonChangeState(LMDialog.noIndentW, lm->indentStyle == NO_AUTO_INDENT, False); - XmToggleButtonSetState(LMDialog.autoIndentW, + RadioButtonChangeState(LMDialog.autoIndentW, lm->indentStyle == AUTO_INDENT, False); - XmToggleButtonSetState(LMDialog.smartIndentW, + RadioButtonChangeState(LMDialog.smartIndentW, lm->indentStyle == SMART_INDENT, False); - XmToggleButtonSetState(LMDialog.defaultWrapW, + RadioButtonChangeState(LMDialog.defaultWrapW, lm->wrapStyle == DEFAULT_WRAP, False); - XmToggleButtonSetState(LMDialog.noWrapW, + RadioButtonChangeState(LMDialog.noWrapW, lm->wrapStyle == NO_WRAP, False); - XmToggleButtonSetState(LMDialog.newlineWrapW, + RadioButtonChangeState(LMDialog.newlineWrapW, lm->wrapStyle == NEWLINE_WRAP, False); - XmToggleButtonSetState(LMDialog.contWrapW, + RadioButtonChangeState(LMDialog.contWrapW, lm->wrapStyle == CONTINUOUS_WRAP, False); } } diff --git a/source/search.c b/source/search.c index 8199be8..a49d248 100644 --- a/source/search.c +++ b/source/search.c @@ -1,4 +1,4 @@ -static const char CVSID[] = "$Id: search.c,v 1.63 2004/01/16 02:59:15 tksoh Exp $"; +static const char CVSID[] = "$Id: search.c,v 1.64 2004/01/16 09:18:28 edg Exp $"; /******************************************************************************* * * * search.c -- Nirvana Editor search and replace functions * @@ -448,7 +448,7 @@ void DoFindReplaceDlog(WindowInfo *window, int direction, int keepDialogs, Notify to make sure that callbacks are called. NOTE: due to an apparent bug in OpenMotif, the radio buttons may get stuck after resetting the scope to "In Window". Therefore we must - use RadioButtonChangeStateNotified(), which contains a workaround. */ + use RadioButtonChangeState(), which contains a workaround. */ if (window->wasSelected) { /* If a selection exists, the default scope depends on the preference of the user. */ @@ -456,33 +456,33 @@ void DoFindReplaceDlog(WindowInfo *window, int direction, int keepDialogs, case REPL_DEF_SCOPE_SELECTION: /* The user prefers selection scope, no matter what the size of the selection is. */ - RadioButtonChangeStateNotified(window->replaceScopeSelToggle, - True); + RadioButtonChangeState(window->replaceScopeSelToggle, + True, True); break; case REPL_DEF_SCOPE_SMART: if (selectionSpansMultipleLines(window)) { /* If the selection spans multiple lines, the user most likely wants to perform a replacement in the selection */ - RadioButtonChangeStateNotified(window->replaceScopeSelToggle, - True); + RadioButtonChangeState(window->replaceScopeSelToggle, + True, True); } else { /* It's unlikely that the user wants a replacement in a tiny selection only. */ - RadioButtonChangeStateNotified(window->replaceScopeWinToggle, - True); + RadioButtonChangeState(window->replaceScopeWinToggle, + True, True); } break; default: /* The user always wants window scope as default. */ - RadioButtonChangeStateNotified(window->replaceScopeWinToggle, - True); + RadioButtonChangeState(window->replaceScopeWinToggle, + True, True); break; } } else { /* No selection -> always choose "In Window" as default. */ - RadioButtonChangeStateNotified(window->replaceScopeWinToggle, True); + RadioButtonChangeState(window->replaceScopeWinToggle, True, True); } #endif diff --git a/source/userCmds.c b/source/userCmds.c index a2da67d..8fcae2f 100644 --- a/source/userCmds.c +++ b/source/userCmds.c @@ -1,4 +1,4 @@ -static const char CVSID[] = "$Id: userCmds.c,v 1.38 2004/01/16 02:59:15 tksoh Exp $"; +static const char CVSID[] = "$Id: userCmds.c,v 1.39 2004/01/16 09:18:28 edg Exp $"; /******************************************************************************* * * * userCmds.c -- Nirvana Editor shell and macro command dialogs * @@ -1719,12 +1719,12 @@ static void updateDialogFields(menuItemRec *f, userCmdDialog *ucd) XmTextSetString(ucd->accTextW, ""); XmTextSetString(ucd->mneTextW, ""); if (ucd->dialogType == SHELL_CMDS) { - XmToggleButtonSetState(ucd->selInpBtn, True, True); - XmToggleButtonSetState(ucd->sameOutBtn, True, True); - XmToggleButtonSetState(ucd->repInpBtn, False, False); + RadioButtonChangeState(ucd->selInpBtn, True, True); + RadioButtonChangeState(ucd->sameOutBtn, True, True); + RadioButtonChangeState(ucd->repInpBtn, False, False); XtSetSensitive(ucd->repInpBtn, True); - XmToggleButtonSetState(ucd->saveFirstBtn, False, False); - XmToggleButtonSetState(ucd->loadAfterBtn, False, False); + RadioButtonChangeState(ucd->saveFirstBtn, False, False); + RadioButtonChangeState(ucd->loadAfterBtn, False, False); } } else { mneString[0] = f->mnemonic; @@ -1734,24 +1734,24 @@ static void updateDialogFields(menuItemRec *f, userCmdDialog *ucd) XmTextSetString(ucd->cmdTextW, f->cmd); XmTextSetString(ucd->accTextW, accString); XmTextSetString(ucd->mneTextW, mneString); - XmToggleButtonSetState(ucd->selInpBtn, f->input==FROM_SELECTION, False); + RadioButtonChangeState(ucd->selInpBtn, f->input==FROM_SELECTION, False); if (ucd->dialogType == SHELL_CMDS) { - XmToggleButtonSetState(ucd->winInpBtn, f->input == FROM_WINDOW, + RadioButtonChangeState(ucd->winInpBtn, f->input == FROM_WINDOW, False); - XmToggleButtonSetState(ucd->eitherInpBtn, f->input == FROM_EITHER, + RadioButtonChangeState(ucd->eitherInpBtn, f->input == FROM_EITHER, False); - XmToggleButtonSetState(ucd->noInpBtn, f->input == FROM_NONE, + RadioButtonChangeState(ucd->noInpBtn, f->input == FROM_NONE, False); - XmToggleButtonSetState(ucd->sameOutBtn, f->output==TO_SAME_WINDOW, + RadioButtonChangeState(ucd->sameOutBtn, f->output==TO_SAME_WINDOW, False); - XmToggleButtonSetState(ucd->winOutBtn, f->output==TO_NEW_WINDOW, + RadioButtonChangeState(ucd->winOutBtn, f->output==TO_NEW_WINDOW, False); - XmToggleButtonSetState(ucd->dlogOutBtn, f->output==TO_DIALOG, + RadioButtonChangeState(ucd->dlogOutBtn, f->output==TO_DIALOG, False); - XmToggleButtonSetState(ucd->repInpBtn, f->repInput, False); + RadioButtonChangeState(ucd->repInpBtn, f->repInput, False); XtSetSensitive(ucd->repInpBtn, f->output==TO_SAME_WINDOW); - XmToggleButtonSetState(ucd->saveFirstBtn, f->saveFirst, False); - XmToggleButtonSetState(ucd->loadAfterBtn, f->loadAfter, False); + RadioButtonChangeState(ucd->saveFirstBtn, f->saveFirst, False); + RadioButtonChangeState(ucd->loadAfterBtn, f->loadAfter, False); } } } diff --git a/util/misc.c b/util/misc.c index da7bceb..a6001cf 100644 --- a/util/misc.c +++ b/util/misc.c @@ -1,4 +1,4 @@ -static const char CVSID[] = "$Id: misc.c,v 1.60 2003/11/22 13:03:40 edg Exp $"; +static const char CVSID[] = "$Id: misc.c,v 1.61 2004/01/16 09:18:28 edg Exp $"; /******************************************************************************* * * * misc.c -- Miscelaneous Motif convenience functions * @@ -2111,9 +2111,13 @@ static void scrollDownAP(Widget w, XEvent *event, String *args, Cardinal *nArgs) ** selected button without selection another radio button first. ** The workaround consist of faking a mouse click on the button that we ** toggled by calling the Arm, Select, and Disarm action procedures. +** +** A minor remaining issue is the fact that, if the workaround is used, +** it is not possible to change the state without notifying potential +** XmNvalueChangedCallbacks. In practice, this doesn't seem to be a problem. ** */ -void RadioButtonChangeStateNotified(Widget widget, Boolean state) +void RadioButtonChangeState(Widget widget, Boolean state, Boolean notify) { /* The bug only exists in OpenMotif 2.x. Since it's quite hard to detect @@ -2159,5 +2163,5 @@ void RadioButtonChangeStateNotified(Widget widget, Boolean state) #endif /* LESSTIF_VERSION */ /* This is sufficient on non-OM platforms */ - XmToggleButtonSetState(widget, state, True); + XmToggleButtonSetState(widget, state, notify); } diff --git a/util/misc.h b/util/misc.h index aa578f8..df29abf 100644 --- a/util/misc.h +++ b/util/misc.h @@ -1,4 +1,4 @@ -/* $Id: misc.h,v 1.20 2003/10/22 20:05:14 tringali Exp $ */ +/* $Id: misc.h,v 1.21 2004/01/16 09:18:28 edg Exp $ */ #ifndef NEDIT_MISC_H_INCLUDED #define NEDIT_MISC_H_INCLUDED @@ -93,6 +93,6 @@ Widget CreateWidget(Widget parent, const char *name, WidgetClass class, Modifiers GetNumLockModMask(Display *display); void InstallMouseWheelActions(XtAppContext context); void AddMouseWheelSupport(Widget w); -void RadioButtonChangeStateNotified(Widget widget, Boolean state); +void RadioButtonChangeState(Widget widget, Boolean state, Boolean notify); #endif /* NEDIT_MISC_H_INCLUDED */ -- 2.11.4.GIT