/* ClaimCursor -- * Claim ownership of the insert cursor and blink on. */ static void ClaimCursor(CursorManager *cm, WidgetCore *corePtr) { if (cm->owner == corePtr) return; if (cm->owner) LoseCursor(cm, cm->owner); corePtr->flags |= CURSOR_ON; TtkRedisplayWidget(corePtr); cm->owner = corePtr; cm->timer = Tcl_CreateTimerHandler(cm->onTime, CursorBlinkProc, cm); }
/* LoseCursor -- * Turn cursor off, disable blink timer. */ static void LoseCursor(CursorManager *cm, WidgetCore *corePtr) { if (corePtr->flags & CURSOR_ON) { corePtr->flags &= ~CURSOR_ON; TtkRedisplayWidget(corePtr); } if (cm->owner == corePtr) { cm->owner = NULL; } if (cm->timer) { Tcl_DeleteTimerHandler(cm->timer); cm->timer = 0; } }
/* PressElement -- * Presses the specified element. */ static void PressElement(ElementStateTracker *es, Ttk_LayoutNode *node) { if (es->pressedElement) { ReleaseElement(es); } if (node) { Ttk_ChangeElementState( node, TTK_STATE_PRESSED|TTK_STATE_ACTIVE, 0); } es->pressedElement = node; TtkRedisplayWidget(es->corePtr); }
/* ScaleVariableChanged -- * Variable trace procedure for scale -variable; * Updates the scale's value. * If the linked variable is not a valid double, * sets the 'invalid' state. */ static void ScaleVariableChanged(void *recordPtr, const char *value) { Scale *scale = recordPtr; double v; if (value == NULL || Tcl_GetDouble(0, value, &v) != TCL_OK) { TtkWidgetChangeState(&scale->core, TTK_STATE_INVALID, 0); } else { Tcl_Obj *valueObj = Tcl_NewDoubleObj(v); Tcl_IncrRefCount(valueObj); Tcl_DecrRefCount(scale->scale.valueObj); scale->scale.valueObj = valueObj; TtkWidgetChangeState(&scale->core, 0, TTK_STATE_INVALID); } TtkRedisplayWidget(&scale->core); }
/* CursorBlinkProc -- * Timer handler to blink the insert cursor on and off. */ static void CursorBlinkProc(ClientData clientData) { CursorManager *cm = (CursorManager*)clientData; int blinkTime; if (cm->owner->flags & CURSOR_ON) { cm->owner->flags &= ~CURSOR_ON; blinkTime = cm->offTime; } else { cm->owner->flags |= CURSOR_ON; blinkTime = cm->onTime; } cm->timer = Tcl_CreateTimerHandler(blinkTime, CursorBlinkProc, clientData); TtkRedisplayWidget(cm->owner); }
void TtkScrollTo(ScrollHandle h, int newFirst) { Scrollable *s = h->scrollPtr; if (newFirst >= s->total) newFirst = s->total - 1; if (newFirst > s->first && s->last >= s->total) /* don't scroll past end */ newFirst = s->first; if (newFirst < 0) newFirst = 0; if (newFirst != s->first) { s->first = newFirst; TtkRedisplayWidget(h->corePtr); } }
/* ReleaseElement -- * Releases the currently pressed element, if any. */ static void ReleaseElement(ElementStateTracker *es) { if (!es->pressedElement) return; Ttk_ChangeElementState( es->pressedElement, 0,TTK_STATE_PRESSED|TTK_STATE_ACTIVE); es->pressedElement = 0; /* Reactivate element under the mouse cursor: */ if (es->activeElement) Ttk_ChangeElementState(es->activeElement, TTK_STATE_ACTIVE,0); TtkRedisplayWidget(es->corePtr); }
/* $sb set $first $last -- * Set the position of the scrollbar. */ static int ScrollbarSetCommand( Tcl_Interp *interp, int objc, Tcl_Obj *const objv[], void *recordPtr) { Scrollbar *scrollbar = recordPtr; Tcl_Obj *firstObj, *lastObj; double first, last; if (objc != 4) { Tcl_WrongNumArgs(interp, 2, objv, "first last"); return TCL_ERROR; } firstObj = objv[2]; lastObj = objv[3]; if (Tcl_GetDoubleFromObj(interp, firstObj, &first) != TCL_OK || Tcl_GetDoubleFromObj(interp, lastObj, &last) != TCL_OK) return TCL_ERROR; /* Range-checks: */ if (first < 0.0) { first = 0.0; } else if (first > 1.0) { first = 1.0; } if (last < first) { last = first; } else if (last > 1.0) { last = 1.0; } /* ASSERT: 0.0 <= first <= last <= 1.0 */ scrollbar->scrollbar.first = first; scrollbar->scrollbar.last = last; if (first <= 0.0 && last >= 1.0) { scrollbar->core.state |= TTK_STATE_DISABLED; } else { scrollbar->core.state &= ~TTK_STATE_DISABLED; } TtkRedisplayWidget(&scrollbar->core); return TCL_OK; }
/* * ActivateElement(es, node) -- * Make 'node' the active element if non-NULL. * Deactivates the currently active element if different. * * The active element has TTK_STATE_ACTIVE set _unless_ * another element is 'pressed' */ static void ActivateElement(ElementStateTracker *es, Ttk_LayoutNode *node) { if (es->activeElement == node) { /* No change */ return; } if (!es->pressedElement) { if (es->activeElement) { /* Deactivate old element */ Ttk_ChangeElementState(es->activeElement, 0,TTK_STATE_ACTIVE); } if (node) { /* Activate new element */ Ttk_ChangeElementState(node, TTK_STATE_ACTIVE,0); } TtkRedisplayWidget(es->corePtr); } es->activeElement = node; }
/* $scale set $newValue */ static int ScaleSetCommand( void *recordPtr, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { Scale *scalePtr = recordPtr; double from = 0.0, to = 1.0, value; int result = TCL_OK; if (objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "set value"); return TCL_ERROR; } if (Tcl_GetDoubleFromObj(interp, objv[2], &value) != TCL_OK) { return TCL_ERROR; } if (scalePtr->core.state & TTK_STATE_DISABLED) { return TCL_OK; } /* ASSERT: fromObj and toObj are valid doubles. */ Tcl_GetDoubleFromObj(interp, scalePtr->scale.fromObj, &from); Tcl_GetDoubleFromObj(interp, scalePtr->scale.toObj, &to); /* Limit new value to between 'from' and 'to': */ if (from < to) { value = value < from ? from : value > to ? to : value; } else { value = value < to ? to : value > from ? from : value; } /* * Set value: */ Tcl_DecrRefCount(scalePtr->scale.valueObj); scalePtr->scale.valueObj = Tcl_NewDoubleObj(value); Tcl_IncrRefCount(scalePtr->scale.valueObj); TtkRedisplayWidget(&scalePtr->core); /* * Set attached variable, if any: */ if (scalePtr->scale.variableObj != NULL) { Tcl_ObjSetVar2(interp, scalePtr->scale.variableObj, NULL, scalePtr->scale.valueObj, TCL_GLOBAL_ONLY); } if (WidgetDestroyed(&scalePtr->core)) { return TCL_ERROR; } /* * Invoke -command, if any: */ if (scalePtr->scale.commandObj != NULL) { Tcl_Obj *cmdObj = Tcl_DuplicateObj(scalePtr->scale.commandObj); Tcl_IncrRefCount(cmdObj); Tcl_AppendToObj(cmdObj, " ", 1); Tcl_AppendObjToObj(cmdObj, scalePtr->scale.valueObj); result = Tcl_EvalObjEx(interp, cmdObj, TCL_EVAL_GLOBAL); Tcl_DecrRefCount(cmdObj); } return result; }