/** \brief \author Peter G Baum, William J Giddings \date **/ static void destroyFunc ( GtkWidget *widget, gpointer data ) { #ifdef DEBUG_LABEL printf ( "label/staticFuncs/destroyFunc\n" ); #endif LabelParams *para = ( LabelParams * ) data; gnoclForgetWidgetFromName ( para->name ); Tcl_DeleteCommand ( para->interp, para->name ); gnoclAttacheOptCmdAndVar ( NULL, ¶->onChanged, NULL, ¶->textVariable, "changed", G_OBJECT ( para->label ), G_CALLBACK ( changedFunc ), para->interp, traceFunc, para ); g_free ( para->textVariable ); g_free ( para->name ); g_free ( para ); }
static int configure( Tcl_Interp *interp, ComboParams *para, GnoclOption options[] ) { int setToFirst = 0; GtkTreeModel *model = gtk_combo_box_get_model( para->comboBox ); gnoclAttacheOptCmdAndVar( &options[onChangedIdx], ¶->onChanged, &options[variableIdx], ¶->variable, "changed", getSigObj( para->comboBox ), G_CALLBACK( changedFunc ), interp, traceFunc, para ); if( options[itemsIdx].status == GNOCL_STATUS_CHANGED ) { int k, no; Tcl_Obj *items = options[itemsIdx].val.obj; if( options[itemValueIdx].status == GNOCL_STATUS_CHANGED ) { Tcl_SetResult( interp, "Either -items or -itemValueList may be given, but not both.", TCL_STATIC ); return TCL_ERROR; } if( Tcl_ListObjLength( interp, items, &no ) != TCL_OK ) { Tcl_SetResult( interp, "items must be proper list", TCL_STATIC ); return TCL_ERROR; } clearModel( para->comboBox, model ); for( k = 0; k < no; ++k ) { Tcl_Obj *tp; if( Tcl_ListObjIndex( interp, items, k, &tp ) != TCL_OK ) return TCL_ERROR; addItem( model, Tcl_GetString( tp ), Tcl_GetString( tp ) ); } setToFirst = 1; } if( options[itemValueIdx].status == GNOCL_STATUS_CHANGED ) { int k, no; Tcl_Obj *items = options[itemValueIdx].val.obj; if( Tcl_ListObjLength( interp, items, &no ) != TCL_OK ) { Tcl_SetResult( interp, "itemValueList must be proper list", TCL_STATIC ); return TCL_ERROR; } clearModel( para->comboBox, model ); for( k = 0; k < no; ++k ) { Tcl_Obj *tp, *txt, *val; if( Tcl_ListObjIndex( interp, items, k, &tp ) != TCL_OK ) return TCL_ERROR; if( Tcl_ListObjIndex( interp, tp, 0, &txt ) != TCL_OK || Tcl_ListObjIndex( interp, tp, 1, &val ) != TCL_OK ) { return TCL_ERROR; } addItem( model, Tcl_GetString( val ) , Tcl_GetString( txt ) ); } setToFirst = 1; } if( options[valueIdx].status == GNOCL_STATUS_CHANGED ) { const char *val = Tcl_GetString( options[valueIdx].val.obj ); int n = setState( para, val ); if( n < 0 ) { Tcl_AppendResult( interp, "Invalid value for option \"-value\" \"", Tcl_GetString( options[valueIdx].val.obj ), "\"", NULL ); return TCL_ERROR; } setVariable( para, val ); setToFirst = 0; } else if( options[variableIdx].status == GNOCL_STATUS_CHANGED && para->variable != NULL ) { const char *val = Tcl_GetVar2( para->interp, para->variable, NULL, TCL_GLOBAL_ONLY ); if( val != NULL ) { setState( para, val ); setToFirst = 0; } else setToFirst = 1; } if( setToFirst ) { GtkTreeIter iter; if( gtk_tree_model_get_iter_first( model, &iter ) ) { const char *val; gtk_tree_model_get( model, &iter, VALUE_COLUMN, &val, -1 ); setState( para, val ); setVariable( para, val ); } } return TCL_OK; }
static int configure( Tcl_Interp *interp, SpinButtonParams *para, GnoclOption options[] ) { int ret = TCL_ERROR; int blocked = 0; int setAdjust = 0; GtkAdjustment *oldAdjust = gtk_spin_button_get_adjustment( para->spinButton ); gfloat lower = oldAdjust->lower; gfloat upper = oldAdjust->upper; gfloat stepInc = oldAdjust->step_increment; gfloat pageInc = oldAdjust->page_increment; if( gnoclSetOptions( interp, options, G_OBJECT( para->spinButton ), -1 ) != TCL_OK ) goto cleanExit; gnoclAttacheOptCmdAndVar( options + onValueChangedIdx, ¶->onValueChanged, options + variableIdx, ¶->variable, "value-changed", G_OBJECT( para->spinButton ), G_CALLBACK( changedFunc ), interp, traceFunc, para ); if( para->onValueChanged != NULL ) { blocked = g_signal_handlers_block_matched( G_OBJECT( para->spinButton ), G_SIGNAL_MATCH_FUNC, 0, 0, NULL, (gpointer *)changedFunc, NULL ); } if( options[valueIdx].status == GNOCL_STATUS_CHANGED ) { assert( strcmp( options[valueIdx].optName, "-value" ) == 0 ); gtk_spin_button_set_value( para->spinButton, options[valueIdx].val.d ); if( para->variable ) { Tcl_Obj *obj = getObjValue( para->spinButton ); para->inSetVar++; obj = Tcl_SetVar2Ex( para->interp, para->variable, NULL, obj, TCL_GLOBAL_ONLY ); para->inSetVar--; if( obj == NULL ) goto cleanExit; } } /* if variable is set, synchronize variable and widget */ if( options[variableIdx].status == GNOCL_STATUS_CHANGED && para->variable != NULL && options[valueIdx].status != GNOCL_STATUS_CHANGED ) { Tcl_Obj *var = Tcl_GetVar2Ex( interp, para->variable, NULL, TCL_GLOBAL_ONLY ); assert( strcmp( options[variableIdx].optName, "-variable" ) == 0 ); if( var == NULL ) /* variable does not yet exist */ { Tcl_Obj *obj = getObjValue( para->spinButton ); para->inSetVar++; obj = Tcl_SetVar2Ex( para->interp, para->variable, NULL, obj, TCL_GLOBAL_ONLY ); para->inSetVar--; if( obj == NULL ) goto cleanExit; } else { double d; if( Tcl_GetDoubleFromObj( interp, var, &d ) != TCL_OK ) goto cleanExit; gtk_spin_button_set_value( para->spinButton, d ); } } if( options[lowerIdx].status == GNOCL_STATUS_CHANGED ) { assert( strcmp( options[lowerIdx].optName, "-lower" ) == 0 ); lower = options[lowerIdx].val.d; setAdjust = 1; } if( options[upperIdx].status == GNOCL_STATUS_CHANGED ) { assert( strcmp( options[upperIdx].optName, "-upper" ) == 0 ); upper = options[upperIdx].val.d; setAdjust = 1; } if( options[stepIncIdx].status == GNOCL_STATUS_CHANGED ) { assert( strcmp( options[stepIncIdx].optName, "-stepInc" ) == 0 ); stepInc = options[stepIncIdx].val.d; setAdjust = 1; } if( options[pageIncIdx].status == GNOCL_STATUS_CHANGED ) { assert( strcmp( options[pageIncIdx].optName, "-pageInc" ) == 0 ); pageInc = options[pageIncIdx].val.d; setAdjust = 1; } if( setAdjust ) { /* see also scale.c */ /* last parameter is pageSize, where it is used? */ gtk_spin_button_set_adjustment( para->spinButton, GTK_ADJUSTMENT( gtk_adjustment_new( oldAdjust->value, lower, upper, stepInc, pageInc, 0 ) ) ); /* gtk_spin_button_update( para->spinButton ); */ } /* spinButtonTraceFunc( para, interp, para->variable, NULL, 0 ); */ ret = TCL_OK; cleanExit: if( blocked ) { g_signal_handlers_unblock_matched( G_OBJECT( para->spinButton ), G_SIGNAL_MATCH_FUNC, 0, 0, NULL, (gpointer *)changedFunc, NULL ); } return ret; }
static int configure ( Tcl_Interp *interp, ComboParams *para, GnoclOption options[] ) { GtkEntry *entry = GTK_ENTRY ( para->combo->entry ); if ( options[itemsIdx].status == GNOCL_STATUS_CHANGED ) { Tcl_Obj *strings = options[itemsIdx].val.obj; int no; if ( Tcl_ListObjLength ( interp, strings, &no ) != TCL_OK ) return TCL_ERROR; if ( no == 0 ) { gtk_container_foreach ( GTK_CONTAINER ( para->combo->list ), removeAll, GTK_CONTAINER ( para->combo->list ) ); } else { int n; GList *items = NULL; for ( n = 0; n < no; ++n ) { Tcl_Obj *tp; int ret = Tcl_ListObjIndex ( interp, strings, n, &tp ); if ( ret != TCL_OK ) return ret; items = g_list_append ( items, ( char * ) gnoclGetStringFromObj ( tp, NULL ) ); } gtk_combo_set_popdown_strings ( para->combo, items ); } } gnoclAttacheOptCmdAndVar ( &options[onChangedIdx], ¶->onChanged, &options[variableIdx], ¶->variable, "changed", G_OBJECT ( entry ), G_CALLBACK ( changedFunc ), interp, traceFunc, para ); if ( options[variableIdx].status == GNOCL_STATUS_CHANGED && options[valueIdx].status == 0 /* value is handled below */ && para->variable != NULL ) { /* if variable does not exist -> set it, else set widget state */ const char *val = Tcl_GetVar ( interp, para->variable, TCL_GLOBAL_ONLY ); if ( val == NULL ) { val = gtk_entry_get_text ( entry ); setVariable ( para, val ); } else setVal ( entry, val ); } if ( options[valueIdx].status == GNOCL_STATUS_CHANGED ) { char *str = options[valueIdx].val.str; setVal ( entry, str ); setVariable ( para, str ); } /* gnoclOptTooltip does not work since the tooltip must be associated to the entry, not the combo. I think this is a BUG in GTK 2.0.6 */ if ( options[tooltipIdx].status == GNOCL_STATUS_CHANGED ) gnoclOptTooltip ( interp, &options[tooltipIdx], G_OBJECT ( entry ), NULL ); if ( options[editableIdx].status == GNOCL_STATUS_CHANGED ) g_object_set ( G_OBJECT ( entry ), "editable", options[editableIdx].val.b, NULL ); return TCL_OK; }