1 
2 /*
3  *  Ump - Unnamed Math Program
4  *  Copyright (c) 2004-2006 by Mattias Hultgren <mattias_hultgren@tele2.se>
5  *
6  *  See main.cpp
7  */
8 
9 #include <gtk/gtk.h>
10 #include <gdk/gdkkeysyms.h>
11 #include "ump_simplewin.h"
12 #include "ump_editor.h"
13 #include "ump_aboutwin.h"
14 #include "ump_advancedwin.h"
15 #include "ump_graphwin.h"
16 #include "ump_prefwin.h"
17 #include "matrix_editor.h"
18 #include "math2.h"
19 #include "main.h"
20 #include <string.h>
21 
22 extern "C"
23 {
24 	#include "image_sqrt.c"
25 }
26 
27 using math::Variable;
28 
29 
30 GtkWidget *simplewin = 0, *simplewin_vbox, *simplewin_menu;
31 GtkWidget *entry, *statusbar;
32 
33 math::CodeLine simplebrain,simple_intern;
34 Complex mem;
35 bool showing_answer,empty_brain;
36 char count_func[2];
37 
aboutwin_show_simple(void)38 void aboutwin_show_simple(void) { aboutwin_show(GTK_WINDOW(simplewin)); }
prefwin_show_simple(void)39 void prefwin_show_simple(void) { prefwin_show(GTK_WINDOW(simplewin)); }
40 
41 
button_CE(void)42 void button_CE(void)
43 {
44 	gtk_entry_set_text(GTK_ENTRY(entry), "0");
45 	showing_answer = false;
46 }
button_AC(void)47 void button_AC(void)
48 {
49 	simplebrain.set_code_line(" ");
50 	empty_brain = true;
51 	count_func[0] = '\0';
52 	button_CE();
53 }
button_comma(void)54 void button_comma(void)
55 {
56 	const char *entrytext;
57 	int i,c;
58 
59 	if(showing_answer)
60 		button_CE();
61 
62 	entrytext = gtk_entry_get_text(GTK_ENTRY(entry));
63 
64 	for(i=0,c=0;entrytext[i] != '\0';i++)
65 	{
66 		if(entrytext[i] == '.')
67 		c++;
68 	}
69 	if(c != 0)
70 		return;
71 
72 	gint pos = strlen(entrytext);
73 	gtk_editable_insert_text(GTK_EDITABLE(entry), ".", 1, &pos);
74 }
button0_9(GtkButton * button,gpointer tmp)75 void button0_9(GtkButton *button, gpointer tmp)
76 {
77 	char *buttontext = (char *) tmp;
78 	const char *entrytext;
79 
80 	if(showing_answer)
81 		button_CE();
82 
83 	entrytext = gtk_entry_get_text(GTK_ENTRY(entry));
84 
85 	if(strcmp("0",entrytext) == 0)
86 		gtk_entry_set_text(GTK_ENTRY(entry), buttontext);
87 	else
88 	{
89 		gint pos = strlen(entrytext);
90 		gtk_editable_insert_text(GTK_EDITABLE(entry), buttontext, 1, &pos);
91 	}
92 }
button_count(GtkButton * button,gpointer tmp)93 void button_count(GtkButton *button, gpointer tmp)
94 {
95 	char *buttontext = (char *) tmp;
96 	const char *entrytext;
97 	utf8_string tmp_str;
98 
99 
100 	entrytext = gtk_entry_get_text(GTK_ENTRY(entry));
101 
102 	try
103 	{
104 		if( !showing_answer )
105 		{
106 			simplebrain.get_code_line( &tmp_str );
107 			if(count_func[0] != ' ')
108 				tmp_str.append( count_func );
109 			empty_brain = false;
110 			tmp_str.append( "(" );
111 			tmp_str.append( entrytext );
112 			tmp_str.append( ")" );
113 			simplebrain.set_code_line( tmp_str.c_str() );
114 
115 			showing_answer = true;
116 
117 			{
118 				utf8_string str;
119 				Variable ans;
120 
121 				simplebrain.calc( &ans );
122 				ans.append_to_string( str, *math::intern_format );
123 				gtk_entry_set_text( GTK_ENTRY(entry), str.c_str() );
124 			}
125 		}
126 		count_func[0] = buttontext[0];
127 		if( empty_brain )
128 		{
129 			simplebrain.get_code_line( &tmp_str );
130 			tmp_str.append( entrytext );
131 			simplebrain.set_code_line( tmp_str.c_str() );
132 			empty_brain = false;
133 		}
134 	}
135 	catch(error_obj error)
136 	{
137 		GtkWidget *dialog;
138 		dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
139 		                                 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
140 		gtk_dialog_run(GTK_DIALOG(dialog));
141 		gtk_widget_destroy(dialog);
142 		return;
143 	}
144 	catch(...)
145 	{
146 		try{ THROW_ERROR( ErrorType_Memory, _("Couldn't get memory.") ); }
147 		catch(error_obj error)
148 		{
149 			GtkWidget *dialog;
150 			dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
151 			                                 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
152 			gtk_dialog_run(GTK_DIALOG(dialog));
153 			gtk_widget_destroy(dialog);
154 			return;
155 		}
156 	}
157 }
button_percent(void)158 void button_percent(void)
159 {
160 	bool should_do_percent = false;
161 	char c[2];
162 
163 	if(count_func[0] == '/')
164 		should_do_percent = true;
165 
166 	try
167 	{
168 		c[0] = ' ';
169 		c[1] = '\0';
170 		button_count( 0, gpointer (c) );
171 
172 		if(should_do_percent)
173 		{
174 			utf8_string str, tmp_str;
175 			Variable ans;
176 
177 			simplebrain.get_code_line( &tmp_str );
178 			tmp_str.append( "*100" );
179 			simplebrain.set_code_line( tmp_str.c_str() );
180 
181 			showing_answer = true;
182 
183 			simplebrain.calc( &ans );
184 			ans.append_to_string( str, *math::intern_format );
185 			gtk_entry_set_text( GTK_ENTRY(entry), str.c_str() );
186 		}
187 
188 		simplebrain.set_code_line( " " );
189 		empty_brain = true;
190 	}
191 	catch(error_obj error)
192 	{
193 		GtkWidget *dialog;
194 		dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
195 		                                 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
196 		gtk_dialog_run(GTK_DIALOG(dialog));
197 		gtk_widget_destroy(dialog);
198 	}
199 }
button_equal(void)200 void button_equal(void)
201 {
202 	char c[2];
203 
204 	c[0] = ' ';
205 	c[1] = '\0';
206 	button_count( 0, gpointer (c) );
207 
208 	simplebrain.set_code_line( " " );
209 	showing_answer = true;
210 	empty_brain = true;
211 }
button_toggle_sign(void)212 void button_toggle_sign(void)
213 {
214 	const char *entrytext;
215 	char *tmp = 0;
216 
217 	if(showing_answer)
218 	{
219 		if(!empty_brain)
220 			return;
221 
222 		showing_answer = false;
223 
224 		simplebrain.set_code_line( " " );
225 	}
226 
227 	entrytext = gtk_entry_get_text(GTK_ENTRY(entry));
228 
229 	try
230 	{
231 		tmp = new char [ strlen(entrytext) + 3];
232 
233 		if(entrytext[0] == '-')
234 		{
235 			for(int i=1;;i++)
236 			{
237 				tmp[i-1] = entrytext[i];
238 				if(entrytext[i] == '\0')
239 					break;
240 			}
241 		}
242 		else
243 		{
244 			tmp[0] = '-';
245 			for(int i=0;;i++)
246 			{
247 				tmp[i+1] = entrytext[i];
248 				if(entrytext[i] == '\0')
249 					break;
250 			}
251 		}
252 
253 		gtk_entry_set_text(GTK_ENTRY(entry), tmp);
254 		delete [] tmp;
255 	}
256 	catch(...)
257 	{
258 		delete [] tmp;
259 		try{  THROW_ERROR( ErrorType_Memory, _("Couldn't get memory.") );  }
260 		catch(error_obj error)
261 		{
262 			GtkWidget *dialog;
263 			dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
264 			                                 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
265 			gtk_dialog_run(GTK_DIALOG(dialog));
266 			gtk_widget_destroy(dialog);
267 			return;
268 		}
269 	}
270 }
button_bracket_count_before(GtkButton * button,gpointer tmp)271 void button_bracket_count_before(GtkButton *button, gpointer tmp)
272 {
273 	char *buttontext = (char *) tmp;
274 	const char *entrytext;
275 
276 	entrytext = gtk_entry_get_text(GTK_ENTRY(entry));
277 
278 	try
279 	{
280 		utf8_string str, tmp_str;
281 		Variable ans;
282 
283 		tmp_str = buttontext;
284 		tmp_str.append( "(" );
285 		tmp_str.append( entrytext );
286 		tmp_str.append( ")" );
287 
288 		simple_intern.set_code_line( tmp_str.c_str() );
289 		simple_intern.calc( &ans );
290 
291 		ans.append_to_string( str, *math::intern_format );
292 		gtk_entry_set_text( GTK_ENTRY(entry), str.c_str() );
293 		showing_answer = true;
294 		empty_brain = true;
295 	}
296 	catch(error_obj error)
297 	{
298 		GtkWidget *dialog;
299 		dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
300 		                                 GTK_MESSAGE_ERROR,	GTK_BUTTONS_CLOSE, error.msg );
301 		gtk_dialog_run(GTK_DIALOG(dialog));
302 		gtk_widget_destroy(dialog);
303 	}
304 }
button_bracket_count_after(GtkButton * button,gpointer tmp)305 void button_bracket_count_after(GtkButton *button, gpointer tmp)
306 {
307 	char *buttontext = (char *) tmp;
308 	const char *entrytext;
309 
310 	entrytext = gtk_entry_get_text(GTK_ENTRY(entry));
311 
312 	try
313 	{
314 		utf8_string str, tmp_str;
315 		Variable ans;
316 
317 		tmp_str = "(";
318 		tmp_str.append( entrytext );
319 		tmp_str.append( ")" );
320 		tmp_str.append( buttontext );
321 		simple_intern.set_code_line( tmp_str.c_str() );
322 		simple_intern.calc( &ans );
323 
324 		ans.append_to_string( str, *math::intern_format );
325 		gtk_entry_set_text( GTK_ENTRY(entry), str.c_str() );
326 		showing_answer = true;
327 		empty_brain = true;
328 	}
329 	catch(error_obj error)
330 	{
331 		GtkWidget *dialog;
332 		dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
333 		                                 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
334 		gtk_dialog_run( GTK_DIALOG(dialog) );
335 		gtk_widget_destroy( dialog );
336 	}
337 }
button_mem_clear(void)338 void button_mem_clear(void)
339 {
340 	mem = Real(0);
341 }
button_mem_recall(void)342 void button_mem_recall(void)
343 {
344 	utf8_string str;
345 	if(showing_answer)
346 		button_CE();
347 
348 	try
349 	{
350 		mem.append_to_string( str, *math::intern_format );
351 		gtk_entry_set_text( GTK_ENTRY(entry), str.c_str() );
352 	}
353 	catch(error_obj error)
354 	{
355 		GtkWidget *dialog;
356 		dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
357 		                                 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
358 		gtk_dialog_run( GTK_DIALOG(dialog) );
359 		gtk_widget_destroy( dialog );
360 	}
361 	button_equal();
362 }
button_mem_calc(GtkButton * button,gpointer tmp)363 void button_mem_calc(GtkButton *button, gpointer tmp)
364 {
365 	char *buttontext = (char *) tmp;
366 	const char *entrytext;
367 	utf8_string str;
368 
369 	button_equal();
370 	entrytext = gtk_entry_get_text(GTK_ENTRY(entry));
371 
372 	try
373 	{
374 		Variable ans;
375 
376 		mem.append_to_string( str, *math::intern_format );
377 		str.append( buttontext );
378 		str.append( "(" );
379 		str.append( entrytext );
380 		str.append( ")" );
381 
382 		simple_intern.set_code_line( str.c_str() );
383 		simple_intern.calc( &ans );
384 		mem = *ans.get_complex();
385 	}
386 	catch(error_obj error)
387 	{
388 		GtkWidget *dialog;
389 		dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
390 		                                 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
391 		gtk_dialog_run(GTK_DIALOG(dialog));
392 		gtk_widget_destroy(dialog);
393 	}
394 }
395 
simplewin_keypress(GtkWidget * widget,GdkEventKey * event,gpointer user_data)396 gboolean simplewin_keypress( GtkWidget *widget, GdkEventKey *event, gpointer     user_data)
397 {
398 	if( event->type == GDK_KEY_PRESS )
399 	{
400 		switch( event->keyval )
401 		{
402 		case GDK_0: case GDK_KP_0:
403 			button0_9( 0, gpointer("0") ); break;
404 		case GDK_1: case GDK_KP_1:
405 			button0_9( 0, gpointer("1") ); break;
406 		case GDK_2: case GDK_KP_2:
407 			button0_9( 0, gpointer("2") ); break;
408 		case GDK_3: case GDK_KP_3:
409 			button0_9( 0, gpointer("3") ); break;
410 		case GDK_4: case GDK_KP_4:
411 			button0_9( 0, gpointer("4") ); break;
412 		case GDK_5: case GDK_KP_5:
413 			button0_9( 0, gpointer("5") ); break;
414 		case GDK_6: case GDK_KP_6:
415 			button0_9( 0, gpointer("6") ); break;
416 		case GDK_7: case GDK_KP_7:
417 			button0_9( 0, gpointer("7") ); break;
418 		case GDK_8: case GDK_KP_8:
419 			button0_9( 0, gpointer("8") ); break;
420 		case GDK_9: case GDK_KP_9:
421 			button0_9( 0, gpointer("9") ); break;
422 		case GDK_plus: case GDK_KP_Add:
423 			button_count( 0, gpointer("+") ); break;
424 		case GDK_minus: case GDK_KP_Subtract:
425 			button_count( 0, gpointer("-") ); break;
426 		case GDK_asterisk: case GDK_KP_Multiply:
427 			button_count( 0, gpointer("*") ); break;
428 		case GDK_slash: case GDK_KP_Divide:
429 			button_count( 0, gpointer("/") ); break;
430 		case GDK_percent:
431 			button_percent(); break;
432 		case GDK_comma: case GDK_period: case GDK_KP_Separator:
433 			button_comma(); break;
434 		case GDK_equal: case GDK_Return: case GDK_KP_Enter:
435 			button_equal(); break;
436 		default:
437 #ifdef DEVELOP
438 			printf("0x%X\n", event->keyval);
439 #endif
440 			break;
441 		}
442 	}
443 }
444 
simplewin_build_menu(void)445 GtkWidget* simplewin_build_menu(void)
446 {
447 	GtkActionGroup *actions;
448 	GtkUIManager *ui_manager;
449 	GError *error = NULL;
450 	static const gchar *menu =
451 "<ui>"
452 "  <menubar name='MenuBar'>"
453 "    <menu action='FileMenu'>"
454 "      <menuitem action='Preferences'/>"
455 "      <separator/>"
456 "      <menuitem action='Close'/>"
457 "      <separator/>"
458 "      <menuitem action='Quit'/>"
459 "    </menu>"
460 "    <menu action='ToolsMenu'>"
461 "      <menuitem action='Advanced'/>"
462 "      <menuitem action='Editor'/>"
463 "      <menuitem action='Graphtool'/>"
464 "      <menuitem action='MatrixEdit'/>"
465 "    </menu>"
466 "    <menuitem action='About'/>"
467 "  </menubar>"
468 "</ui>";
469 	GtkActionEntry entries[] = {
470 		{ "FileMenu",    NULL,                  menu_file },
471 		{ "Preferences", GTK_STOCK_PREFERENCES, menu_pref,            NULL,      NULL, G_CALLBACK(prefwin_show_simple) },
472 		{ "Close",       GTK_STOCK_CLOSE,       menu_file_close,      "<ctrl>W", NULL, G_CALLBACK(simplewin_close) },
473 		{ "Quit",        GTK_STOCK_QUIT,        menu_file_quit,       "<ctrl>Q", NULL, G_CALLBACK(UMP_gtk_quit) },
474 		{ "ToolsMenu",   NULL,                  menu_tools },
475 		{ "Advanced",    NULL,                  menu_tools_advanced,  NULL,      NULL, G_CALLBACK(advancedwin_show) },
476 		{ "Editor",      NULL,                  menu_tools_editor,    NULL,      NULL, G_CALLBACK(editor_showwin) },
477 		{ "Graphtool",   NULL,                  menu_tools_graphtool, NULL,      NULL, G_CALLBACK(graphwin_show) },
478 		{ "MatrixEdit",  NULL,                  menu_tools_matrixedit,NULL,      NULL, G_CALLBACK(matrix_editor_show) },
479 		{ "About",       NULL,                  menu_about,           NULL,      NULL, G_CALLBACK(aboutwin_show_simple) }
480 	};
481 	guint n_entries = G_N_ELEMENTS(entries);
482 
483 	actions = gtk_action_group_new( "Actions" );
484 	gtk_action_group_add_actions( actions, entries, n_entries, NULL );
485 	ui_manager = gtk_ui_manager_new();
486 	gtk_ui_manager_insert_action_group( ui_manager, actions, 0 );
487 	gtk_window_add_accel_group( GTK_WINDOW(simplewin),
488 	gtk_ui_manager_get_accel_group( ui_manager ) );
489 	if (!gtk_ui_manager_add_ui_from_string( ui_manager, menu, -1, &error ))
490 	{
491 		g_message( "building menus failed: %s", error->message );
492 		g_error_free( error );
493 		return 0;
494 	}
495 	gtk_ui_manager_ensure_update( ui_manager );
496 
497 	return gtk_ui_manager_get_widget( ui_manager, "/MenuBar" );
498 }
499 
simplewin_show(void)500 GtkWindow* simplewin_show(void)
501 {
502 	if(simplewin == 0)
503 	{
504 		GtkWidget *tmp,*table;
505 
506 		simplebrain.set_code_line( " " );
507 		mem = Real(0);
508 		showing_answer = false;
509 		empty_brain = true;
510 		count_func[0] = ' ';
511 		count_func[1] = '\0';
512 
513 		simplewin = gtk_window_new( GTK_WINDOW_TOPLEVEL );
514 
515 		gtk_window_set_title( GTK_WINDOW(simplewin), _("Ump - Simple calculator") );
516 		g_signal_connect_swapped( G_OBJECT(simplewin), "delete-event", G_CALLBACK(simplewin_close),
517 		                          NULL );
518 
519 		g_signal_connect_swapped( G_OBJECT(simplewin), "key-press-event", G_CALLBACK(simplewin_keypress),
520 		                          NULL );
521 
522 		simplewin_vbox = gtk_vbox_new( FALSE, 0 );
523 		gtk_container_add( GTK_CONTAINER(simplewin), simplewin_vbox);
524 
525 		if( (simplewin_menu  = simplewin_build_menu()) == 0 )
526 		{
527 			gtk_widget_destroy( simplewin );
528 			simplewin = 0;
529 			return 0;
530 		}
531 		gtk_box_pack_start( GTK_BOX(simplewin_vbox), simplewin_menu, FALSE, FALSE, 0 );
532 
533 
534 		entry = gtk_entry_new();
535 		gtk_editable_set_editable( GTK_EDITABLE(entry), FALSE );
536 		gtk_entry_set_text( GTK_ENTRY(entry), "0" );
537 		gtk_entry_set_alignment( GTK_ENTRY(entry), 1.0f );
538 		g_object_set( G_OBJECT(entry), "can-focus", FALSE, NULL );
539 		gtk_box_pack_start( GTK_BOX(simplewin_vbox), entry, FALSE, FALSE, 0 );
540 
541 
542 		table = gtk_table_new ( 5, 7, TRUE );
543 		gtk_container_set_border_width( GTK_CONTAINER(table), 5 );
544 		gtk_table_set_row_spacings( GTK_TABLE(table), 4 );
545 		gtk_table_set_col_spacings( GTK_TABLE(table), 4 );
546 		gtk_box_pack_start( GTK_BOX(simplewin_vbox), table, TRUE, TRUE, 0 );
547 
548 		tmp = gtk_button_new_with_label( "CE" );
549 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
550 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_CE), NULL );
551 		gtk_table_attach( GTK_TABLE(table), tmp, 5, 6, 0, 1, GTK_FILL, GTK_FILL, 0, 0 );
552 
553 		tmp = gtk_button_new_with_label( "AC" );
554 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
555 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_AC), NULL );
556 		gtk_table_attach( GTK_TABLE(table), tmp, 6, 7, 0, 1, GTK_FILL, GTK_FILL, 0, 0 );
557 
558 		tmp = gtk_button_new_with_label( "7" );
559 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
560 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("7") );
561 		gtk_table_attach( GTK_TABLE(table), tmp, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0 );
562 		gtk_widget_set_size_request(tmp, 45, 32);
563 
564 		tmp = gtk_button_new_with_label( "8" );
565 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
566 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("8") );
567 		gtk_table_attach( GTK_TABLE(table), tmp, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0 );
568 
569 		tmp = gtk_button_new_with_label( "9" );
570 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
571 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("9") );
572 		gtk_table_attach( GTK_TABLE(table), tmp, 2, 3, 1, 2, GTK_FILL, GTK_FILL, 0, 0 );
573 
574 		tmp = gtk_button_new_with_label( "/" );
575 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
576 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_count), gpointer("/") );
577 		gtk_table_attach( GTK_TABLE (table), tmp, 3, 4, 1, 2, GTK_FILL, GTK_FILL, 0, 0 );
578 
579 		tmp = gtk_button_new_with_label( "%" );
580 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
581 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_percent), NULL );
582 		gtk_table_attach( GTK_TABLE (table), tmp, 4, 5, 1, 2, GTK_FILL, GTK_FILL, 0, 0 );
583 
584 		tmp = gtk_button_new_with_label( "M-" );
585 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
586 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_mem_calc), gpointer("-") );
587 		gtk_table_attach( GTK_TABLE(table), tmp, 5, 6, 1, 2, GTK_FILL, GTK_FILL, 0, 0) ;
588 
589 		tmp = gtk_button_new_with_label( "MC" );
590 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
591 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_mem_clear), NULL );
592 		gtk_table_attach( GTK_TABLE(table), tmp, 6, 7, 1, 2, GTK_FILL, GTK_FILL, 0, 0 );
593 
594 		tmp = gtk_button_new_with_label("4");
595 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
596 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("4") );
597 		gtk_table_attach( GTK_TABLE(table), tmp, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0 );
598 
599 		tmp = gtk_button_new_with_label("5");
600 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
601 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("5") );
602 		gtk_table_attach( GTK_TABLE (table), tmp, 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0 );
603 
604 		tmp = gtk_button_new_with_label("6");
605 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
606 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("6") );
607 		gtk_table_attach( GTK_TABLE (table), tmp, 2, 3, 2, 3, GTK_FILL, GTK_FILL, 0, 0 );
608 
609 		tmp = gtk_button_new_with_label("*");
610 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
611 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_count), gpointer("*") );
612 		gtk_table_attach( GTK_TABLE (table), tmp, 3, 4, 2, 3, GTK_FILL, GTK_FILL, 0, 0 );
613 
614 		{
615 			GdkPixbuf *pixbuf;
616 			GtkWidget *img;
617 			pixbuf = gdk_pixbuf_new_from_inline (-1, image_sqrt, FALSE, NULL);
618 
619 			img = gtk_image_new_from_pixbuf( pixbuf );
620 
621 			tmp = gtk_button_new();
622 			g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
623 			gtk_container_add( GTK_CONTAINER(tmp), img );
624 			g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_bracket_count_before),
625 			                  gpointer("sqrt") );
626 			gtk_table_attach(GTK_TABLE (table), tmp, 4, 5, 2, 3, GTK_FILL, GTK_FILL, 0, 0 );
627 		}
628 
629 		tmp = gtk_button_new_with_label("M+");
630 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
631 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_mem_calc), gpointer("+") );
632 		gtk_table_attach(GTK_TABLE (table), tmp, 5, 6, 2, 3, GTK_FILL, GTK_FILL, 0, 0 );
633 
634 		tmp = gtk_button_new_with_label("MR");
635 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
636 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_mem_recall), NULL );
637 		gtk_table_attach( GTK_TABLE (table), tmp, 6, 7, 2, 3, GTK_FILL, GTK_FILL, 0, 0 );
638 
639 		tmp = gtk_button_new_with_label("1");
640 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
641 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("1") );
642 		gtk_table_attach( GTK_TABLE(table), tmp, 0, 1, 3, 4, GTK_FILL, GTK_FILL, 0, 0 );
643 
644 		tmp = gtk_button_new_with_label("2");
645 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
646 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("2") );
647 		gtk_table_attach( GTK_TABLE(table), tmp, 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0 );
648 
649 		tmp = gtk_button_new_with_label("3");
650 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
651 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("3") );
652 		gtk_table_attach( GTK_TABLE(table), tmp, 2, 3, 3, 4, GTK_FILL, GTK_FILL, 0, 0 );
653 
654 		tmp = gtk_button_new_with_label("-");
655 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
656 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_count), gpointer("-") );
657 		gtk_table_attach( GTK_TABLE(table), tmp, 3, 4, 3, 4, GTK_FILL, GTK_FILL, 0, 0 );
658 
659 		tmp = gtk_button_new_with_label("x\302\262");
660 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
661 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_bracket_count_after),
662 		                  gpointer("^2") );
663 		gtk_table_attach( GTK_TABLE(table), tmp, 4, 5, 3, 4, GTK_FILL, GTK_FILL, 0, 0 );
664 
665 		tmp = gtk_button_new_with_label("1/x");
666 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
667 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_bracket_count_before),
668 		                  gpointer("1/") );
669 		gtk_table_attach( GTK_TABLE(table), tmp, 5, 6, 3, 4, GTK_FILL, GTK_FILL, 0, 0 );
670 
671 		tmp = gtk_button_new_with_label("x^y");
672 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
673 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_count), gpointer("^") );
674 		gtk_table_attach( GTK_TABLE(table), tmp, 6, 7, 3, 4, GTK_FILL, GTK_FILL, 0, 0 );
675 
676 		tmp = gtk_button_new_with_label("0");
677 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
678 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("0") );
679 		gtk_table_attach( GTK_TABLE(table), tmp, 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0 );
680 
681 		tmp = gtk_button_new_with_label(".");
682 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
683 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_comma), NULL );
684 		gtk_table_attach( GTK_TABLE(table), tmp, 1, 2, 4, 5, GTK_FILL, GTK_FILL, 0, 0 );
685 
686 		tmp = gtk_button_new_with_label("=");
687 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
688 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_equal), NULL );
689 		gtk_table_attach( GTK_TABLE(table), tmp, 2, 3, 4, 5, GTK_FILL, GTK_FILL, 0, 0 );
690 
691 		tmp = gtk_button_new_with_label("+");
692 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
693 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_count), gpointer("+") );
694 		gtk_table_attach( GTK_TABLE(table), tmp, 3, 4, 4, 5, GTK_FILL, GTK_FILL, 0, 0 );
695 
696 		tmp = gtk_button_new_with_label("+/-");
697 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
698 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_toggle_sign), NULL );
699 		gtk_table_attach( GTK_TABLE(table), tmp, 4, 5, 4, 5, GTK_FILL, GTK_FILL, 0, 0 );
700 
701 		tmp = gtk_button_new_with_label("Dec");
702 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
703 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_bracket_count_before),
704 		                  gpointer("dec") );
705 		gtk_table_attach( GTK_TABLE (table), tmp, 5, 6, 4, 5, GTK_FILL, GTK_FILL, 0, 0 );
706 
707 		tmp = gtk_button_new_with_label("Frac");
708 		g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
709 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_bracket_count_before),
710 		                  gpointer("frac") );
711 		gtk_table_attach( GTK_TABLE (table), tmp, 6, 7, 4, 5, GTK_FILL, GTK_FILL, 0, 0 );
712 
713 		statusbar = gtk_statusbar_new();
714 		gtk_box_pack_start( GTK_BOX(simplewin_vbox), statusbar, FALSE, FALSE, 0 );
715 
716 
717 		gtk_widget_show_all(simplewin);
718 		open_windows |= SIMPLE_WIN;
719 	}
720 	else
721 		gtk_window_present( GTK_WINDOW(simplewin) );
722 
723 	return GTK_WINDOW(simplewin);
724 }
725 
726 
simplewin_close(void)727 void simplewin_close(void)
728 {
729 	if(simplewin != 0)
730 	{
731 		gtk_widget_destroy(simplewin);
732 		simplewin = 0;
733 
734 		open_windows &= ~SIMPLE_WIN;
735 		if(open_windows == 0)
736 			UMP_gtk_quit();
737 	}
738 }
739 
simplewin_translate(void)740 void simplewin_translate(void)
741 {
742 	if(simplewin != 0)
743 	{
744 		GtkWidget *new_menu;
745 
746 		if(( new_menu = simplewin_build_menu()) == 0 )
747 			return;
748 
749 		gtk_widget_destroy( simplewin_menu );
750 		simplewin_menu = new_menu;
751 
752 		gtk_box_pack_start(GTK_BOX(simplewin_vbox), simplewin_menu, FALSE, FALSE, 0);
753 		gtk_box_reorder_child( GTK_BOX(simplewin_vbox), simplewin_menu, 0 );
754 
755 		gtk_window_set_title(GTK_WINDOW(simplewin), _("Ump - Simple calculator") );
756 	}
757 }
758