diff options
Diffstat (limited to 'app/wlib/gtklib/single.c')
| -rw-r--r-- | app/wlib/gtklib/single.c | 356 | 
1 files changed, 205 insertions, 151 deletions
diff --git a/app/wlib/gtklib/single.c b/app/wlib/gtklib/single.c index 600f1dd..6204ed5 100644 --- a/app/wlib/gtklib/single.c +++ b/app/wlib/gtklib/single.c @@ -17,7 +17,7 @@   *   *  You should have received a copy of the GNU General Public License   *  along with this program; if not, write to the Free Software - *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA   */  #define GTK_DISABLE_SINGLE_INCLUDES @@ -35,7 +35,6 @@  #include "gtkint.h" -#define TIMEOUT_INACTIVITY (500)  	/**< timeout for entry fields in millisecs */  /*   ***************************************************************************** @@ -54,7 +53,6 @@ struct wString_t {  	wBool_t enter_pressed;	/**< flag if enter was pressed */  	wBool_t hasSignal;		/** needs signal to be suppressed */  	int count;				/** number of 100ms since last entry **/ -	guint	timer;			/**< timer source for inactivity timer */  };  /** @@ -62,24 +60,27 @@ struct wString_t {   *   * \param b 	IN widget to be updated   * \param arg 	IN new string value - * \return  + * \return   */  void wStringSetValue( -    wString_p b, -    const char *arg)  +        wString_p b, +        const char *arg)  { -	if (b->widget == NULL) +	if (b->widget == NULL) {  		abort(); -	 +	} +  	// the contents should not be changed programatically while  	// the user is editing it -	if( !(gtk_widget_has_focus(b->widget))) { -		if (b->hasSignal)  -	    	gtk_signal_handler_block_by_data(GTK_OBJECT(b->widget), b); +	if( (b->option&BO_IGNFOCUS) || !(gtk_widget_has_focus(b->widget))) { +		if (b->hasSignal) { +			gtk_signal_handler_block_by_data(GTK_OBJECT(b->widget), b); +		}  		gtk_entry_set_text(GTK_ENTRY(b->widget), arg); -		if (b->hasSignal) +		if (b->hasSignal) {  			gtk_signal_handler_unblock_by_data(GTK_OBJECT(b->widget), b); +		}  	}  } @@ -88,12 +89,12 @@ void wStringSetValue(   *   * \param b 	IN widget to be updated   * \param w 	IN new width - * \return  + * \return   */  void wStringSetWidth( -    wString_p b, -    wPos_t w)  +        wString_p b, +        wWinPix_t w)  {  	gtk_widget_set_size_request(b->widget, w, -1);  	b->w = w; @@ -107,113 +108,71 @@ void wStringSetWidth(   */  const char *wStringGetValue( -    wString_p b)  +        wString_p b)  { -	if ( !b->widget )  +	if ( !b->widget ) {  		abort(); -	 +	} +  	return gtk_entry_get_text(GTK_ENTRY(b->widget));  } -/** - * Kill an active timer - * - * \param b IN entry field - * \return   the entered text - */ - -static gboolean killTimer( -    GtkEntry *widget, -	GdkEvent *event, -    wString_p b)  -{ - -	// remove all timers related to this widget	 -	while( g_source_remove_by_user_data( b )) -		; -	b->timer = 0; -	 -	if (b->action) { -		const char *s; -		 -		s = gtk_entry_get_text(GTK_ENTRY(b->widget)); -		b->action(s, b->data); -	} -	gtk_editable_select_region( GTK_EDITABLE( widget ), 0, 0 ); -	return( FALSE ); -}	  /** - *	Timer handler for string activity. This timer checks the input if the user - * 	doesn't change an entry value for the preset time (0.5s). + * Do the current active string's action when a button was pushed + * Used to validate input   */ - -static gboolean -timeoutString( wString_p bs )  +static wString_p stringControl = NULL; +void wlibStringUpdate()  { -	const char *new_value; -	if ( !bs ) -		return( FALSE ); -	if (bs->widget == 0)  -		abort(); -	 -	bs->count--; - -	if (bs->count==0) { -		// get the currently entered value -	    new_value = wStringGetValue(bs); -		if (bs->valueP != NULL) -			strcpy(bs->valueP, new_value); - -		if (bs->action) { -			bs->enter_pressed = FALSE;     //Normal input -			if ( new_value ) -				bs->action(new_value,bs->data); -		} -	} -	if (bs->count<=0) { -		bs->timer = 0; -		return( FALSE );   //Stop timer -	} else { -		return TRUE;       //Wait 100ms +	if ( stringControl && stringControl->action ) { +		stringControl->action( wStringGetValue(stringControl), stringControl->data ); +		stringControl = NULL;  	}  } +  /**   * Signal handler for 'activate' signal: enter pressed - callback with the current value and then   * select the whole default value   *   * \param widget 	IN the edit field   * \param b 		IN the widget data structure - * \return  + * \return   */  static gboolean stringActivated( -    GtkEntry *widget, -    wString_p b)  +        GtkEntry *widget, +        wString_p b)  { +	if ( debugWindow >= 1 ) { +		printf( "stringActivated: %s\n", b->labelStr ); +	}  	const char *s;  	const char * output = "\n"; -	if ( !b ) +	if ( !b ) {  		return( FALSE ); -	 +	} +  	s = wStringGetValue(b); -	if (b->valueP) +	if (b->valueP) {  		strcpy(b->valueP, s); +	}  	if (b->action) {  		b->enter_pressed = TRUE;  		b->action( output, b->data);  	} -	 +  	// select the complete default value to make editing it easier  	gtk_editable_select_region( GTK_EDITABLE( widget ), 0, -1 );  	return( TRUE );  } -static gboolean stringExposed(GtkWidget* widget, GdkEventExpose * event, gpointer g ) +static gboolean stringExposed(GtkWidget* widget, GdkEventExpose * event, +                              gpointer g )  {  	wControl_p b = (wControl_p)g;  	return wControlExpose(widget,event,b); @@ -225,40 +184,113 @@ static gboolean stringExposed(GtkWidget* widget, GdkEventExpose * event, gpointe   *   * \param widget 		IN   * \param entry field 	IN - * \return  + * \return   */ -static void stringChanged( -    GtkEntry *widget, -    wString_p b)  +static int stringChanged( +        GtkEntry *widget, +        wString_p b)  { -	const char *new_value; - -	if ( !b  ) -		return; - -	b->count = 5;              /* set ~500 ms from now */ - -	// get the entered value -	//new_value = wStringGetValue(b); -	//if (b->valueP != NULL) -	//	strcpy(b->valueP, new_value); -	// -	//  -	if (b->action){ -		// if one exists, remove the inactivity timer -		if( !b->timer ) { -			//g_source_remove( b->timer ); -		 -		// create a new timer -			b->timer = g_timeout_add( TIMEOUT_INACTIVITY/5, -								  (GSourceFunc)timeoutString,  -								  	  b ); -		} -	}	 -	return; +	if ( debugWindow >= 1 ) { +		printf( "stringChanged: %s\n", b->labelStr); +	} +	stringControl = b; +	return FALSE;  } +static int stringPreeditChanged( +        GtkEntry *widget, +        wString_p b) +{ +	if ( debugWindow >= 1 ) { +		printf( "stringPreeditChanged: %s\n", b->labelStr ); +	} +	return FALSE; +} +static int stringFocusOutEvent( +        GtkEntry *widget, +        GdkEvent * event, +        wString_p b) +{ +	if ( debugWindow >= 1 ) { +		printf( "stringFocusOut: %s\n", b->labelStr ); +	} +	if (b->action) { +		const char *s; +		s = gtk_entry_get_text(GTK_ENTRY(b->widget)); +		b->action(s, b->data); +	} +	gtk_editable_select_region( GTK_EDITABLE( widget ), 0, 0 ); +	return FALSE; +} +static int stringFocusInEvent( +        GtkEntry *widget, +        GdkEvent * event, +        wString_p b) +{ +	if ( debugWindow >= 1 ) { +		printf( "stringFocusIn: %s\n", b->labelStr ); +	} +	stringControl = b; +	return FALSE; +} +static int stringLeaveNotifyEvent( +        GtkEntry *widget, +        GdkEvent * event, +        wString_p b) +{ +	if ( debugWindow >= 3 ) { +		printf( "stringLeaveNotfyEvent: %s\n", b->labelStr ); +	} +	return FALSE; +} +static int stringEventAfter( +        GtkEntry *widget, +        wString_p b) +{ +	if ( debugWindow >= 3 ) { +		printf( "stringEventAfter: %s\n", b->labelStr ); +	} +	return FALSE; +} +static int stringEvent( +        GtkEntry *widget, +        wString_p b) +{ +	if ( debugWindow >= 3 ) { +		printf( "stringEvent: %s\n", b->labelStr ); +	} +	return FALSE; +} +static int stringKeyPressEvent( +        GtkEntry *widget, +        GdkEvent * event, +        wString_p b) +{ +	if ( debugWindow >= 1 ) { +		printf( "stringKeyPressEvent: %s\n", b->labelStr ); +	} +	return FALSE; +} +static int stringStateChanged( +        GtkEntry *widget, +        int state, +        wString_p b) +{ +	if ( debugWindow >= 1 ) { +		printf( "stringStateChanged: %s\n", b->labelStr ); +	} +	return FALSE; +} +static int stringActivate( +        GtkEntry *widget, +        wString_p b) +{ +	if ( debugWindow >= 1 ) { +		printf( "stringActivate: %s\n", b->labelStr ); +	} +	return stringChanged( widget, b ); +}  /**   * Create a single line entry field for a string value   * @@ -268,86 +300,109 @@ static void stringChanged(   * \param 	helpStr	IN	help anchor   * \param 	labelStr IN label   * \param	option	IN	option (supported BO_READONLY ) - * \param	width	IN	width of entry field	 + * \param	width	IN	width of entry field   * \param	valueP	IN	default value - * \param	valueL	IN 	maximum length of entry  + * \param	valueL	IN 	maximum length of entry   * \param	action	IN	application callback function   * \param 	data	IN	application data   * \return  the created widget   */  wString_p wStringCreate( -    wWin_p	parent, -    wPos_t	x, -    wPos_t	y, -    const char 	 *helpStr, -    const char	 *labelStr, -    long	option, -    wPos_t	width, -    char	*valueP, -    wIndex_t valueL, -    wStringCallBack_p action, -    void 	*data)  +        wWin_p	parent, +        wWinPix_t	x, +        wWinPix_t	y, +        const char 	 *helpStr, +        const char	 *labelStr, +        long	option, +        wWinPix_t	width, +        char	*valueP, +        wIndex_t valueL, +        wStringCallBack_p action, +        void 	*data)  {  	wString_p b; -	// create and initialize the widget	 +	// create and initialize the widget  	b = (wString_p)wlibAlloc(parent, B_TEXT, x, y, labelStr, sizeof *b, data);  	b->valueP = valueP;  	b->action = action;  	b->option = option;  	b->valueL = valueL; -	b->timer = 0;  	b->hasSignal = 0;  	wlibComputePos((wControl_p)b); -	// create the gtk entry field and set maximum length if desired	 +	// create the gtk entry field and set maximum length if desired  	b->widget = (GtkWidget *)gtk_entry_new(); -	if (b->widget == NULL) abort(); +	if (b->widget == NULL) { abort(); } -	if( valueL ) +	if( valueL ) {  		gtk_entry_set_max_length( GTK_ENTRY( b->widget ), valueL ); -	 +	} +  	// it is assumed that the parent is a fixed layout widget and the entry can  	// be placed at a specific position  	gtk_fixed_put(GTK_FIXED(parent->widget), b->widget, b->realX, b->realY); -	 -	// set minimum size for widget	 -	if (width) + +	// set minimum size for widget +	if (width) {  		gtk_widget_set_size_request(b->widget, width, -1); -	 +	} +  	// get the resulting size  	wlibControlGetSize((wControl_p)b);  	// if desired, place a label in front of the created widget -	if (labelStr) +	if (labelStr) {  		b->labelW = wlibAddLabel((wControl_p)b, labelStr); -	 -	if (option & BO_READONLY) +	} + +	if (option & BO_READONLY) {  		gtk_editable_set_editable(GTK_EDITABLE(b->widget), FALSE); -	 +	} +  	// set the default text	and select it to make replacing it easier  	if (b->valueP) {  		wStringSetValue(b, b->valueP);  		// select the text only if text is editable  	} -	 +  	// show  	gtk_widget_show(b->widget); -	 +  	// add the new widget to the list of created widgets  	wlibAddButton((wControl_p)b); -	 -	// link into help  + +	// link into help  	wlibAddHelpString(b->widget, helpStr); -	 -	//g_signal_connect(GTK_OBJECT(b->widget), "changed", G_CALLBACK(stringChanged), b); + +	g_signal_connect(GTK_OBJECT(b->widget), "changed", G_CALLBACK(stringChanged), +	                 b); +	g_signal_connect(GTK_OBJECT(b->widget), "preedit-changed", +	                 G_CALLBACK(stringPreeditChanged), b); +	g_signal_connect(GTK_OBJECT(b->widget), "focus-out-event", +	                 G_CALLBACK(stringFocusOutEvent), b); +	g_signal_connect(GTK_OBJECT(b->widget), "focus-in-event", +	                 G_CALLBACK(stringFocusInEvent), b); +	g_signal_connect(GTK_OBJECT(b->widget), "leave-notify-event", +	                 G_CALLBACK(stringLeaveNotifyEvent), b); +	g_signal_connect(GTK_OBJECT(b->widget), "event", G_CALLBACK(stringEvent), b); +	g_signal_connect(GTK_OBJECT(b->widget), "event-after", +	                 G_CALLBACK(stringEventAfter), b); +	g_signal_connect(GTK_OBJECT(b->widget), "key-press-event", +	                 G_CALLBACK(stringKeyPressEvent), b); +	g_signal_connect(GTK_OBJECT(b->widget), "state-changed", +	                 G_CALLBACK(stringStateChanged), b); +	g_signal_connect(GTK_OBJECT(b->widget), "activate", G_CALLBACK(stringActivate), +	                 b); +  	//if (option&BO_ENTER) -		g_signal_connect(GTK_OBJECT(b->widget), "activate", G_CALLBACK(stringActivated), b); +	g_signal_connect(GTK_OBJECT(b->widget), "activate", G_CALLBACK(stringActivated), +	                 b);  	b->hasSignal = 1; -		g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event", -	    							G_CALLBACK(stringExposed), b); -	 +	g_signal_connect_after(GTK_OBJECT(b->widget), "expose-event", +	                       G_CALLBACK(stringExposed), b); +  	// set the default text	and select it to make replacing it easier  	if (b->valueP) {  		wStringSetValue(b, b->valueP); @@ -355,7 +410,6 @@ wString_p wStringCreate(  	}  	gtk_widget_add_events( b->widget, GDK_FOCUS_CHANGE_MASK ); -	g_signal_connect(GTK_OBJECT(b->widget), "focus-out-event", G_CALLBACK(killTimer), b); -	 +  	return b;  }  | 
