Пример #1
0
Файл: label.c Проект: zdia/gnocl
/**
\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, &para->onChanged,
		NULL, &para->textVariable,
		"changed", G_OBJECT ( para->label ),
		G_CALLBACK ( changedFunc ), para->interp, traceFunc, para );

	g_free ( para->textVariable );
	g_free ( para->name );
	g_free ( para );
}
Пример #2
0
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], &para->onChanged, 
         &options[variableIdx], &para->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;
}
Пример #3
0
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, &para->onValueChanged,
         options + variableIdx, &para->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;
}
Пример #4
0
Файл: combo.c Проект: zdia/gnocl
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], &para->onChanged,
		&options[variableIdx], &para->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;
}