diff options
Diffstat (limited to 'tk8.6/generic/ttk/ttkButton.c')
-rw-r--r-- | tk8.6/generic/ttk/ttkButton.c | 862 |
1 files changed, 0 insertions, 862 deletions
diff --git a/tk8.6/generic/ttk/ttkButton.c b/tk8.6/generic/ttk/ttkButton.c deleted file mode 100644 index c00754b..0000000 --- a/tk8.6/generic/ttk/ttkButton.c +++ /dev/null @@ -1,862 +0,0 @@ -/* - * Copyright (c) 2003, Joe English - * - * label, button, checkbutton, radiobutton, and menubutton widgets. - */ - -#include <string.h> -#include <tk.h> -#include "ttkTheme.h" -#include "ttkWidget.h" - -/* Bit fields for OptionSpec mask field: - */ -#define STATE_CHANGED (0x100) /* -state option changed */ -#define DEFAULTSTATE_CHANGED (0x200) /* -default option changed */ - -/*------------------------------------------------------------------------ - * +++ Base resources for labels, buttons, checkbuttons, etc: - */ -typedef struct -{ - /* - * Text element resources: - */ - Tcl_Obj *textObj; - Tcl_Obj *textVariableObj; - Tcl_Obj *underlineObj; - Tcl_Obj *widthObj; - - Ttk_TraceHandle *textVariableTrace; - Ttk_ImageSpec *imageSpec; - - /* - * Image element resources: - */ - Tcl_Obj *imageObj; - - /* - * Compound label/image resources: - */ - Tcl_Obj *compoundObj; - Tcl_Obj *paddingObj; - - /* - * Compatibility/legacy options: - */ - Tcl_Obj *stateObj; - -} BasePart; - -typedef struct -{ - WidgetCore core; - BasePart base; -} Base; - -static Tk_OptionSpec BaseOptionSpecs[] = -{ - {TK_OPTION_STRING, "-text", "text", "Text", "", - Tk_Offset(Base,base.textObj), -1, - 0,0,GEOMETRY_CHANGED }, - {TK_OPTION_STRING, "-textvariable", "textVariable", "Variable", "", - Tk_Offset(Base,base.textVariableObj), -1, - TK_OPTION_NULL_OK,0,GEOMETRY_CHANGED }, - {TK_OPTION_INT, "-underline", "underline", "Underline", - "-1", Tk_Offset(Base,base.underlineObj), -1, - 0,0,0 }, - /* SB: OPTION_INT, see <<NOTE-NULLOPTIONS>> */ - {TK_OPTION_STRING, "-width", "width", "Width", - NULL, Tk_Offset(Base,base.widthObj), -1, - TK_OPTION_NULL_OK,0,GEOMETRY_CHANGED }, - - /* - * Image options - */ - {TK_OPTION_STRING, "-image", "image", "Image", NULL/*default*/, - Tk_Offset(Base,base.imageObj), -1, - TK_OPTION_NULL_OK,0,GEOMETRY_CHANGED }, - - /* - * Compound base/image options - */ - {TK_OPTION_STRING_TABLE, "-compound", "compound", "Compound", - "none", Tk_Offset(Base,base.compoundObj), -1, - 0,(ClientData)ttkCompoundStrings,GEOMETRY_CHANGED }, - {TK_OPTION_STRING, "-padding", "padding", "Pad", - NULL, Tk_Offset(Base,base.paddingObj), -1, - TK_OPTION_NULL_OK,0,GEOMETRY_CHANGED}, - - /* - * Compatibility/legacy options - */ - {TK_OPTION_STRING, "-state", "state", "State", - "normal", Tk_Offset(Base,base.stateObj), -1, - 0,0,STATE_CHANGED }, - - WIDGET_INHERIT_OPTIONS(ttkCoreOptionSpecs) -}; - -/* - * Variable trace procedure for -textvariable option: - */ -static void TextVariableChanged(void *clientData, const char *value) -{ - Base *basePtr = clientData; - Tcl_Obj *newText; - - if (WidgetDestroyed(&basePtr->core)) { - return; - } - - newText = value ? Tcl_NewStringObj(value, -1) : Tcl_NewStringObj("", 0); - - Tcl_IncrRefCount(newText); - Tcl_DecrRefCount(basePtr->base.textObj); - basePtr->base.textObj = newText; - - TtkResizeWidget(&basePtr->core); -} - -static void -BaseInitialize(Tcl_Interp *interp, void *recordPtr) -{ - Base *basePtr = recordPtr; - basePtr->base.textVariableTrace = 0; - basePtr->base.imageSpec = NULL; -} - -static void -BaseCleanup(void *recordPtr) -{ - Base *basePtr = recordPtr; - if (basePtr->base.textVariableTrace) - Ttk_UntraceVariable(basePtr->base.textVariableTrace); - if (basePtr->base.imageSpec) - TtkFreeImageSpec(basePtr->base.imageSpec); -} - -static void -BaseImageChanged( - ClientData clientData, int x, int y, int width, int height, - int imageWidth, int imageHeight) -{ - Base *basePtr = (Base *)clientData; - TtkResizeWidget(&basePtr->core); -} - -static int BaseConfigure(Tcl_Interp *interp, void *recordPtr, int mask) -{ - Base *basePtr = recordPtr; - Tcl_Obj *textVarName = basePtr->base.textVariableObj; - Ttk_TraceHandle *vt = 0; - Ttk_ImageSpec *imageSpec = NULL; - - if (textVarName != NULL && *Tcl_GetString(textVarName) != '\0') { - vt = Ttk_TraceVariable(interp,textVarName,TextVariableChanged,basePtr); - if (!vt) return TCL_ERROR; - } - - if (basePtr->base.imageObj) { - imageSpec = TtkGetImageSpecEx( - interp, basePtr->core.tkwin, basePtr->base.imageObj, BaseImageChanged, basePtr); - if (!imageSpec) { - goto error; - } - } - - if (TtkCoreConfigure(interp, recordPtr, mask) != TCL_OK) { -error: - if (imageSpec) TtkFreeImageSpec(imageSpec); - if (vt) Ttk_UntraceVariable(vt); - return TCL_ERROR; - } - - if (basePtr->base.textVariableTrace) { - Ttk_UntraceVariable(basePtr->base.textVariableTrace); - } - basePtr->base.textVariableTrace = vt; - - if (basePtr->base.imageSpec) { - TtkFreeImageSpec(basePtr->base.imageSpec); - } - basePtr->base.imageSpec = imageSpec; - - if (mask & STATE_CHANGED) { - TtkCheckStateOption(&basePtr->core, basePtr->base.stateObj); - } - - return TCL_OK; -} - -static int -BasePostConfigure(Tcl_Interp *interp, void *recordPtr, int mask) -{ - Base *basePtr = recordPtr; - int status = TCL_OK; - - if (basePtr->base.textVariableTrace) { - status = Ttk_FireTrace(basePtr->base.textVariableTrace); - } - - return status; -} - -/*------------------------------------------------------------------------ - * +++ Label widget. - * Just a base widget that adds a few appearance-related options - */ - -typedef struct -{ - Tcl_Obj *backgroundObj; - Tcl_Obj *foregroundObj; - Tcl_Obj *fontObj; - Tcl_Obj *borderWidthObj; - Tcl_Obj *reliefObj; - Tcl_Obj *anchorObj; - Tcl_Obj *justifyObj; - Tcl_Obj *wrapLengthObj; -} LabelPart; - -typedef struct -{ - WidgetCore core; - BasePart base; - LabelPart label; -} Label; - -static Tk_OptionSpec LabelOptionSpecs[] = -{ - {TK_OPTION_BORDER, "-background", "frameColor", "FrameColor", - NULL, Tk_Offset(Label,label.backgroundObj), -1, - TK_OPTION_NULL_OK,0,0 }, - {TK_OPTION_COLOR, "-foreground", "textColor", "TextColor", - NULL, Tk_Offset(Label,label.foregroundObj), -1, - TK_OPTION_NULL_OK,0,0 }, - {TK_OPTION_FONT, "-font", "font", "Font", - NULL, Tk_Offset(Label,label.fontObj), -1, - TK_OPTION_NULL_OK,0,GEOMETRY_CHANGED }, - {TK_OPTION_PIXELS, "-borderwidth", "borderWidth", "BorderWidth", - NULL, Tk_Offset(Label,label.borderWidthObj), -1, - TK_OPTION_NULL_OK,0,GEOMETRY_CHANGED }, - {TK_OPTION_RELIEF, "-relief", "relief", "Relief", - NULL, Tk_Offset(Label,label.reliefObj), -1, - TK_OPTION_NULL_OK,0,GEOMETRY_CHANGED }, - {TK_OPTION_ANCHOR, "-anchor", "anchor", "Anchor", - NULL, Tk_Offset(Label,label.anchorObj), -1, - TK_OPTION_NULL_OK, 0, GEOMETRY_CHANGED}, - {TK_OPTION_JUSTIFY, "-justify", "justify", "Justify", - NULL, Tk_Offset(Label, label.justifyObj), -1, - TK_OPTION_NULL_OK,0,GEOMETRY_CHANGED }, - {TK_OPTION_PIXELS, "-wraplength", "wrapLength", "WrapLength", - NULL, Tk_Offset(Label, label.wrapLengthObj), -1, - TK_OPTION_NULL_OK,0,GEOMETRY_CHANGED /*SB: SIZE_CHANGED*/ }, - - WIDGET_TAKEFOCUS_FALSE, - WIDGET_INHERIT_OPTIONS(BaseOptionSpecs) -}; - -static const Ttk_Ensemble LabelCommands[] = { - { "configure", TtkWidgetConfigureCommand,0 }, - { "cget", TtkWidgetCgetCommand,0 }, - { "instate", TtkWidgetInstateCommand,0 }, - { "state", TtkWidgetStateCommand,0 }, - { "identify", TtkWidgetIdentifyCommand,0 }, - { 0,0,0 } -}; - -static WidgetSpec LabelWidgetSpec = -{ - "TLabel", /* className */ - sizeof(Label), /* recordSize */ - LabelOptionSpecs, /* optionSpecs */ - LabelCommands, /* subcommands */ - BaseInitialize, /* initializeProc */ - BaseCleanup, /* cleanupProc */ - BaseConfigure, /* configureProc */ - BasePostConfigure, /* postConfigureProc */ - TtkWidgetGetLayout, /* getLayoutProc */ - TtkWidgetSize, /* sizeProc */ - TtkWidgetDoLayout, /* layoutProc */ - TtkWidgetDisplay /* displayProc */ -}; - -TTK_BEGIN_LAYOUT(LabelLayout) - TTK_GROUP("Label.border", TTK_FILL_BOTH|TTK_BORDER, - TTK_GROUP("Label.padding", TTK_FILL_BOTH|TTK_BORDER, - TTK_NODE("Label.label", TTK_FILL_BOTH))) -TTK_END_LAYOUT - -/*------------------------------------------------------------------------ - * +++ Button widget. - * Adds a new subcommand "invoke", and options "-command" and "-default" - */ - -typedef struct -{ - Tcl_Obj *commandObj; - Tcl_Obj *defaultStateObj; -} ButtonPart; - -typedef struct -{ - WidgetCore core; - BasePart base; - ButtonPart button; -} Button; - -/* - * Option specifications: - */ -static Tk_OptionSpec ButtonOptionSpecs[] = -{ - {TK_OPTION_STRING, "-command", "command", "Command", - "", Tk_Offset(Button, button.commandObj), -1, 0,0,0}, - {TK_OPTION_STRING_TABLE, "-default", "default", "Default", - "normal", Tk_Offset(Button, button.defaultStateObj), -1, - 0, (ClientData) ttkDefaultStrings, DEFAULTSTATE_CHANGED}, - - WIDGET_TAKEFOCUS_TRUE, - WIDGET_INHERIT_OPTIONS(BaseOptionSpecs) -}; - -static int ButtonConfigure(Tcl_Interp *interp, void *recordPtr, int mask) -{ - Button *buttonPtr = recordPtr; - - if (BaseConfigure(interp, recordPtr, mask) != TCL_OK) { - return TCL_ERROR; - } - - /* Handle "-default" option: - */ - if (mask & DEFAULTSTATE_CHANGED) { - int defaultState = TTK_BUTTON_DEFAULT_DISABLED; - Ttk_GetButtonDefaultStateFromObj( - NULL, buttonPtr->button.defaultStateObj, &defaultState); - if (defaultState == TTK_BUTTON_DEFAULT_ACTIVE) { - TtkWidgetChangeState(&buttonPtr->core, TTK_STATE_ALTERNATE, 0); - } else { - TtkWidgetChangeState(&buttonPtr->core, 0, TTK_STATE_ALTERNATE); - } - } - return TCL_OK; -} - -/* $button invoke -- - * Evaluate the button's -command. - */ -static int -ButtonInvokeCommand( - void *recordPtr, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) -{ - Button *buttonPtr = recordPtr; - if (objc > 2) { - Tcl_WrongNumArgs(interp, 1, objv, "invoke"); - return TCL_ERROR; - } - if (buttonPtr->core.state & TTK_STATE_DISABLED) { - return TCL_OK; - } - return Tcl_EvalObjEx(interp, buttonPtr->button.commandObj, TCL_EVAL_GLOBAL); -} - -static const Ttk_Ensemble ButtonCommands[] = { - { "configure", TtkWidgetConfigureCommand,0 }, - { "cget", TtkWidgetCgetCommand,0 }, - { "invoke", ButtonInvokeCommand,0 }, - { "instate", TtkWidgetInstateCommand,0 }, - { "state", TtkWidgetStateCommand,0 }, - { "identify", TtkWidgetIdentifyCommand,0 }, - { 0,0,0 } -}; - -static WidgetSpec ButtonWidgetSpec = -{ - "TButton", /* className */ - sizeof(Button), /* recordSize */ - ButtonOptionSpecs, /* optionSpecs */ - ButtonCommands, /* subcommands */ - BaseInitialize, /* initializeProc */ - BaseCleanup, /* cleanupProc */ - ButtonConfigure, /* configureProc */ - BasePostConfigure, /* postConfigureProc */ - TtkWidgetGetLayout, /* getLayoutProc */ - TtkWidgetSize, /* sizeProc */ - TtkWidgetDoLayout, /* layoutProc */ - TtkWidgetDisplay /* displayProc */ -}; - -TTK_BEGIN_LAYOUT(ButtonLayout) - TTK_GROUP("Button.border", TTK_FILL_BOTH|TTK_BORDER, - TTK_GROUP("Button.focus", TTK_FILL_BOTH, - TTK_GROUP("Button.padding", TTK_FILL_BOTH, - TTK_NODE("Button.label", TTK_FILL_BOTH)))) -TTK_END_LAYOUT - -/*------------------------------------------------------------------------ - * +++ Checkbutton widget. - */ -typedef struct -{ - Tcl_Obj *variableObj; - Tcl_Obj *onValueObj; - Tcl_Obj *offValueObj; - Tcl_Obj *commandObj; - - Ttk_TraceHandle *variableTrace; - -} CheckbuttonPart; - -typedef struct -{ - WidgetCore core; - BasePart base; - CheckbuttonPart checkbutton; -} Checkbutton; - -/* - * Option specifications: - */ -static Tk_OptionSpec CheckbuttonOptionSpecs[] = -{ - {TK_OPTION_STRING, "-variable", "variable", "Variable", - NULL, Tk_Offset(Checkbutton, checkbutton.variableObj), -1, - TK_OPTION_NULL_OK,0,0}, - {TK_OPTION_STRING, "-onvalue", "onValue", "OnValue", - "1", Tk_Offset(Checkbutton, checkbutton.onValueObj), -1, - 0,0,0}, - {TK_OPTION_STRING, "-offvalue", "offValue", "OffValue", - "0", Tk_Offset(Checkbutton, checkbutton.offValueObj), -1, - 0,0,0}, - {TK_OPTION_STRING, "-command", "command", "Command", - "", Tk_Offset(Checkbutton, checkbutton.commandObj), -1, - 0,0,0}, - - WIDGET_TAKEFOCUS_TRUE, - WIDGET_INHERIT_OPTIONS(BaseOptionSpecs) -}; - -/* - * Variable trace procedure for checkbutton -variable option - */ -static void CheckbuttonVariableChanged(void *clientData, const char *value) -{ - Checkbutton *checkPtr = clientData; - - if (WidgetDestroyed(&checkPtr->core)) { - return; - } - - if (!value) { - TtkWidgetChangeState(&checkPtr->core, TTK_STATE_ALTERNATE, 0); - return; - } - /* else */ - TtkWidgetChangeState(&checkPtr->core, 0, TTK_STATE_ALTERNATE); - if (!strcmp(value, Tcl_GetString(checkPtr->checkbutton.onValueObj))) { - TtkWidgetChangeState(&checkPtr->core, TTK_STATE_SELECTED, 0); - } else { - TtkWidgetChangeState(&checkPtr->core, 0, TTK_STATE_SELECTED); - } -} - -static void -CheckbuttonInitialize(Tcl_Interp *interp, void *recordPtr) -{ - Checkbutton *checkPtr = recordPtr; - Tcl_Obj *variableObj; - - /* default -variable is the widget name: - */ - variableObj = Tcl_NewStringObj(Tk_PathName(checkPtr->core.tkwin), -1); - Tcl_IncrRefCount(variableObj); - checkPtr->checkbutton.variableObj = variableObj; - BaseInitialize(interp, recordPtr); -} - -static void -CheckbuttonCleanup(void *recordPtr) -{ - Checkbutton *checkPtr = recordPtr; - Ttk_UntraceVariable(checkPtr->checkbutton.variableTrace); - checkPtr->checkbutton.variableTrace = 0; - BaseCleanup(recordPtr); -} - -static int -CheckbuttonConfigure(Tcl_Interp *interp, void *recordPtr, int mask) -{ - Checkbutton *checkPtr = recordPtr; - Ttk_TraceHandle *vt = Ttk_TraceVariable( - interp, checkPtr->checkbutton.variableObj, - CheckbuttonVariableChanged, checkPtr); - - if (!vt) { - return TCL_ERROR; - } - - if (BaseConfigure(interp, recordPtr, mask) != TCL_OK){ - Ttk_UntraceVariable(vt); - return TCL_ERROR; - } - - Ttk_UntraceVariable(checkPtr->checkbutton.variableTrace); - checkPtr->checkbutton.variableTrace = vt; - - return TCL_OK; -} - -static int -CheckbuttonPostConfigure(Tcl_Interp *interp, void *recordPtr, int mask) -{ - Checkbutton *checkPtr = recordPtr; - int status = TCL_OK; - - if (checkPtr->checkbutton.variableTrace) - status = Ttk_FireTrace(checkPtr->checkbutton.variableTrace); - if (status == TCL_OK && !WidgetDestroyed(&checkPtr->core)) - status = BasePostConfigure(interp, recordPtr, mask); - return status; -} - -/* - * Checkbutton 'invoke' subcommand: - * Toggles the checkbutton state. - */ -static int -CheckbuttonInvokeCommand( - void *recordPtr, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) -{ - Checkbutton *checkPtr = recordPtr; - WidgetCore *corePtr = &checkPtr->core; - Tcl_Obj *newValue; - - if (objc > 2) { - Tcl_WrongNumArgs(interp, 1, objv, "invoke"); - return TCL_ERROR; - } - if (corePtr->state & TTK_STATE_DISABLED) - return TCL_OK; - - /* - * Toggle the selected state. - */ - if (corePtr->state & TTK_STATE_SELECTED) - newValue = checkPtr->checkbutton.offValueObj; - else - newValue = checkPtr->checkbutton.onValueObj; - - if (Tcl_ObjSetVar2(interp, - checkPtr->checkbutton.variableObj, NULL, newValue, - TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG) - == NULL) - return TCL_ERROR; - - if (WidgetDestroyed(corePtr)) - return TCL_ERROR; - - return Tcl_EvalObjEx(interp, - checkPtr->checkbutton.commandObj, TCL_EVAL_GLOBAL); -} - -static const Ttk_Ensemble CheckbuttonCommands[] = { - { "configure", TtkWidgetConfigureCommand,0 }, - { "cget", TtkWidgetCgetCommand,0 }, - { "invoke", CheckbuttonInvokeCommand,0 }, - { "instate", TtkWidgetInstateCommand,0 }, - { "state", TtkWidgetStateCommand,0 }, - { "identify", TtkWidgetIdentifyCommand,0 }, - /* MISSING: select, deselect, toggle */ - { 0,0,0 } -}; - -static WidgetSpec CheckbuttonWidgetSpec = -{ - "TCheckbutton", /* className */ - sizeof(Checkbutton), /* recordSize */ - CheckbuttonOptionSpecs, /* optionSpecs */ - CheckbuttonCommands, /* subcommands */ - CheckbuttonInitialize, /* initializeProc */ - CheckbuttonCleanup, /* cleanupProc */ - CheckbuttonConfigure, /* configureProc */ - CheckbuttonPostConfigure, /* postConfigureProc */ - TtkWidgetGetLayout, /* getLayoutProc */ - TtkWidgetSize, /* sizeProc */ - TtkWidgetDoLayout, /* layoutProc */ - TtkWidgetDisplay /* displayProc */ -}; - -TTK_BEGIN_LAYOUT(CheckbuttonLayout) - TTK_GROUP("Checkbutton.padding", TTK_FILL_BOTH, - TTK_NODE("Checkbutton.indicator", TTK_PACK_LEFT) - TTK_GROUP("Checkbutton.focus", TTK_PACK_LEFT | TTK_STICK_W, - TTK_NODE("Checkbutton.label", TTK_FILL_BOTH))) -TTK_END_LAYOUT - -/*------------------------------------------------------------------------ - * +++ Radiobutton widget. - */ - -typedef struct -{ - Tcl_Obj *variableObj; - Tcl_Obj *valueObj; - Tcl_Obj *commandObj; - - Ttk_TraceHandle *variableTrace; - -} RadiobuttonPart; - -typedef struct -{ - WidgetCore core; - BasePart base; - RadiobuttonPart radiobutton; -} Radiobutton; - -/* - * Option specifications: - */ -static Tk_OptionSpec RadiobuttonOptionSpecs[] = -{ - {TK_OPTION_STRING, "-variable", "variable", "Variable", - "::selectedButton", Tk_Offset(Radiobutton, radiobutton.variableObj),-1, - 0,0,0}, - {TK_OPTION_STRING, "-value", "Value", "Value", - "1", Tk_Offset(Radiobutton, radiobutton.valueObj), -1, - 0,0,0}, - {TK_OPTION_STRING, "-command", "command", "Command", - "", Tk_Offset(Radiobutton, radiobutton.commandObj), -1, - 0,0,0}, - - WIDGET_TAKEFOCUS_TRUE, - WIDGET_INHERIT_OPTIONS(BaseOptionSpecs) -}; - -/* - * Variable trace procedure for radiobuttons. - */ -static void -RadiobuttonVariableChanged(void *clientData, const char *value) -{ - Radiobutton *radioPtr = clientData; - - if (WidgetDestroyed(&radioPtr->core)) { - return; - } - - if (!value) { - TtkWidgetChangeState(&radioPtr->core, TTK_STATE_ALTERNATE, 0); - return; - } - /* else */ - TtkWidgetChangeState(&radioPtr->core, 0, TTK_STATE_ALTERNATE); - if (!strcmp(value, Tcl_GetString(radioPtr->radiobutton.valueObj))) { - TtkWidgetChangeState(&radioPtr->core, TTK_STATE_SELECTED, 0); - } else { - TtkWidgetChangeState(&radioPtr->core, 0, TTK_STATE_SELECTED); - } -} - -static void -RadiobuttonCleanup(void *recordPtr) -{ - Radiobutton *radioPtr = recordPtr; - Ttk_UntraceVariable(radioPtr->radiobutton.variableTrace); - radioPtr->radiobutton.variableTrace = 0; - BaseCleanup(recordPtr); -} - -static int -RadiobuttonConfigure(Tcl_Interp *interp, void *recordPtr, int mask) -{ - Radiobutton *radioPtr = recordPtr; - Ttk_TraceHandle *vt = Ttk_TraceVariable( - interp, radioPtr->radiobutton.variableObj, - RadiobuttonVariableChanged, radioPtr); - - if (!vt) { - return TCL_ERROR; - } - - if (BaseConfigure(interp, recordPtr, mask) != TCL_OK) { - Ttk_UntraceVariable(vt); - return TCL_ERROR; - } - - Ttk_UntraceVariable(radioPtr->radiobutton.variableTrace); - radioPtr->radiobutton.variableTrace = vt; - - return TCL_OK; -} - -static int -RadiobuttonPostConfigure(Tcl_Interp *interp, void *recordPtr, int mask) -{ - Radiobutton *radioPtr = recordPtr; - int status = TCL_OK; - - if (radioPtr->radiobutton.variableTrace) - status = Ttk_FireTrace(radioPtr->radiobutton.variableTrace); - if (status == TCL_OK && !WidgetDestroyed(&radioPtr->core)) - status = BasePostConfigure(interp, recordPtr, mask); - return status; -} - -/* - * Radiobutton 'invoke' subcommand: - * Sets the radiobutton -variable to the -value, evaluates the -command. - */ -static int -RadiobuttonInvokeCommand( - void *recordPtr, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) -{ - Radiobutton *radioPtr = recordPtr; - WidgetCore *corePtr = &radioPtr->core; - - if (objc > 2) { - Tcl_WrongNumArgs(interp, 1, objv, "invoke"); - return TCL_ERROR; - } - if (corePtr->state & TTK_STATE_DISABLED) - return TCL_OK; - - if (Tcl_ObjSetVar2(interp, - radioPtr->radiobutton.variableObj, NULL, - radioPtr->radiobutton.valueObj, - TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG) - == NULL) - return TCL_ERROR; - - if (WidgetDestroyed(corePtr)) - return TCL_ERROR; - - return Tcl_EvalObjEx(interp, - radioPtr->radiobutton.commandObj, TCL_EVAL_GLOBAL); -} - -static const Ttk_Ensemble RadiobuttonCommands[] = { - { "configure", TtkWidgetConfigureCommand,0 }, - { "cget", TtkWidgetCgetCommand,0 }, - { "invoke", RadiobuttonInvokeCommand,0 }, - { "instate", TtkWidgetInstateCommand,0 }, - { "state", TtkWidgetStateCommand,0 }, - { "identify", TtkWidgetIdentifyCommand,0 }, - /* MISSING: select, deselect */ - { 0,0,0 } -}; - -static WidgetSpec RadiobuttonWidgetSpec = -{ - "TRadiobutton", /* className */ - sizeof(Radiobutton), /* recordSize */ - RadiobuttonOptionSpecs, /* optionSpecs */ - RadiobuttonCommands, /* subcommands */ - BaseInitialize, /* initializeProc */ - RadiobuttonCleanup, /* cleanupProc */ - RadiobuttonConfigure, /* configureProc */ - RadiobuttonPostConfigure, /* postConfigureProc */ - TtkWidgetGetLayout, /* getLayoutProc */ - TtkWidgetSize, /* sizeProc */ - TtkWidgetDoLayout, /* layoutProc */ - TtkWidgetDisplay /* displayProc */ -}; - -TTK_BEGIN_LAYOUT(RadiobuttonLayout) - TTK_GROUP("Radiobutton.padding", TTK_FILL_BOTH, - TTK_NODE("Radiobutton.indicator", TTK_PACK_LEFT) - TTK_GROUP("Radiobutton.focus", TTK_PACK_LEFT, - TTK_NODE("Radiobutton.label", TTK_FILL_BOTH))) -TTK_END_LAYOUT - -/*------------------------------------------------------------------------ - * +++ Menubutton widget. - */ - -typedef struct -{ - Tcl_Obj *menuObj; - Tcl_Obj *directionObj; -} MenubuttonPart; - -typedef struct -{ - WidgetCore core; - BasePart base; - MenubuttonPart menubutton; -} Menubutton; - -/* - * Option specifications: - */ -static const char *const directionStrings[] = { - "above", "below", "left", "right", "flush", NULL -}; -static Tk_OptionSpec MenubuttonOptionSpecs[] = -{ - {TK_OPTION_STRING, "-menu", "menu", "Menu", - "", Tk_Offset(Menubutton, menubutton.menuObj), -1, 0,0,0}, - {TK_OPTION_STRING_TABLE, "-direction", "direction", "Direction", - "below", Tk_Offset(Menubutton, menubutton.directionObj), -1, - 0,(ClientData)directionStrings,GEOMETRY_CHANGED}, - - WIDGET_TAKEFOCUS_TRUE, - WIDGET_INHERIT_OPTIONS(BaseOptionSpecs) -}; - -static const Ttk_Ensemble MenubuttonCommands[] = { - { "configure", TtkWidgetConfigureCommand,0 }, - { "cget", TtkWidgetCgetCommand,0 }, - { "instate", TtkWidgetInstateCommand,0 }, - { "state", TtkWidgetStateCommand,0 }, - { "identify", TtkWidgetIdentifyCommand,0 }, - { 0,0,0 } -}; - -static WidgetSpec MenubuttonWidgetSpec = -{ - "TMenubutton", /* className */ - sizeof(Menubutton), /* recordSize */ - MenubuttonOptionSpecs, /* optionSpecs */ - MenubuttonCommands, /* subcommands */ - BaseInitialize, /* initializeProc */ - BaseCleanup, /* cleanupProc */ - BaseConfigure, /* configureProc */ - BasePostConfigure, /* postConfigureProc */ - TtkWidgetGetLayout, /* getLayoutProc */ - TtkWidgetSize, /* sizeProc */ - TtkWidgetDoLayout, /* layoutProc */ - TtkWidgetDisplay /* displayProc */ -}; - -TTK_BEGIN_LAYOUT(MenubuttonLayout) - TTK_GROUP("Menubutton.border", TTK_FILL_BOTH, - TTK_GROUP("Menubutton.focus", TTK_FILL_BOTH, - TTK_NODE("Menubutton.indicator", TTK_PACK_RIGHT) - TTK_GROUP("Menubutton.padding", TTK_PACK_LEFT|TTK_EXPAND|TTK_FILL_X, - TTK_NODE("Menubutton.label", TTK_PACK_LEFT)))) -TTK_END_LAYOUT - -/*------------------------------------------------------------------------ - * +++ Initialization. - */ - -MODULE_SCOPE -void TtkButton_Init(Tcl_Interp *interp) -{ - Ttk_Theme theme = Ttk_GetDefaultTheme(interp); - - Ttk_RegisterLayout(theme, "TLabel", LabelLayout); - Ttk_RegisterLayout(theme, "TButton", ButtonLayout); - Ttk_RegisterLayout(theme, "TCheckbutton", CheckbuttonLayout); - Ttk_RegisterLayout(theme, "TRadiobutton", RadiobuttonLayout); - Ttk_RegisterLayout(theme, "TMenubutton", MenubuttonLayout); - - RegisterWidget(interp, "ttk::label", &LabelWidgetSpec); - RegisterWidget(interp, "ttk::button", &ButtonWidgetSpec); - RegisterWidget(interp, "ttk::checkbutton", &CheckbuttonWidgetSpec); - RegisterWidget(interp, "ttk::radiobutton", &RadiobuttonWidgetSpec); - RegisterWidget(interp, "ttk::menubutton", &MenubuttonWidgetSpec); -} |