1 /*
2  * Calcoo: b_layout.c
3  *
4  * Copyright (C) 2001, 2002, 2005 Alexei Kaminski
5  *
6  * determines layout of the buttons
7  * calls create_display()
8  *
9  * the sizes and layout of everything are defined here
10  */
11 
12 #include <stdlib.h>
13 #include <stdio.h>
14 
15 #include "basic.h"
16 #include "codes.h"
17 #include "displays.h"
18 #include "const.h"
19 #include "defaults.h"
20 #include "b_headers.h"
21 #include "io_headers.h"
22 
23 #define BUTTON_SIZE 32 /* buttons are square */
24 
25 #define LEFT_MARGIN 8
26 #define RIGHT_MARGIN 8
27 #define TOP_MARGIN 8
28 #define BOTTOM_MARGIN 8
29 
30 #define DISPLAY_SIZE_HORIZ 240
31 #define DISPLAY_SIZE_VERT BUTTON_SIZE
32 #define UNDERDISPLAY_SPACING (BUTTON_SIZE / 2 )
33 
34 /* the buttons are groupped in (rectangular) blocks */
35 
36 #define INTERBLOCK_SPACING (BUTTON_SIZE / 2)
37 
38 #define NUMBER_OF_ROWS 5
39 #define NUMBER_OF_COLS_IN_BLOCK_0 1
40 #define NUMBER_OF_COLS_IN_BLOCK_1 3
41 #define NUMBER_OF_COLS_IN_BLOCK_2 3
42 #define NUMBER_OF_COLS_IN_BLOCK_3 4
43 
44 /* the offset of a block is the distance from the block's left edge
45  * to the left edge of the calculator's body */
46 
47 #define	OFFSET_OF_BLOCK_0 LEFT_MARGIN
48 
49 #define	OFFSET_OF_BLOCK_1 ( LEFT_MARGIN \
50                           + NUMBER_OF_COLS_IN_BLOCK_0 * BUTTON_SIZE \
51 	                  + INTERBLOCK_SPACING )
52 
53 #define	OFFSET_OF_BLOCK_2 ( LEFT_MARGIN \
54                           + NUMBER_OF_COLS_IN_BLOCK_0 * BUTTON_SIZE \
55 	                  + INTERBLOCK_SPACING \
56                           + NUMBER_OF_COLS_IN_BLOCK_1 * BUTTON_SIZE \
57 		          + INTERBLOCK_SPACING )
58 
59 #define	OFFSET_OF_BLOCK_3 ( LEFT_MARGIN \
60                           + NUMBER_OF_COLS_IN_BLOCK_0 * BUTTON_SIZE \
61 	                  + INTERBLOCK_SPACING \
62                           + NUMBER_OF_COLS_IN_BLOCK_1 * BUTTON_SIZE \
63 	                  + INTERBLOCK_SPACING \
64 		          + NUMBER_OF_COLS_IN_BLOCK_2 * BUTTON_SIZE \
65                           + INTERBLOCK_SPACING )
66 
67 #define	LEFT_FOR_DISPLAY_VERT ( TOP_MARGIN \
68                               + DISPLAY_SIZE_VERT \
69                               + UNDERDISPLAY_SPACING )
70 
71 #define	BODY_SIZE_VERT ( LEFT_FOR_DISPLAY_VERT \
72 		       + BUTTON_SIZE * NUMBER_OF_ROWS \
73                        + BOTTOM_MARGIN + INTERBLOCK_SPACING)
74 
75 #define	BODY_SIZE_HORIZ ( LEFT_MARGIN \
76 		        + NUMBER_OF_COLS_IN_BLOCK_0 * BUTTON_SIZE \
77                         + INTERBLOCK_SPACING \
78 		        + NUMBER_OF_COLS_IN_BLOCK_1 * BUTTON_SIZE \
79                         + INTERBLOCK_SPACING \
80                         + NUMBER_OF_COLS_IN_BLOCK_2 * BUTTON_SIZE \
81                         + INTERBLOCK_SPACING \
82                         + NUMBER_OF_COLS_IN_BLOCK_3 * BUTTON_SIZE \
83                         + RIGHT_MARGIN )
84 
85 #define DISPLAY_CELL_WIDTH 15
86 #define DISPLAY_DOT_OFFSET_VERT 17
87 #define DISPLAY_DOT_WIDTH 5
88 #define DISPLAY_MARGIN_VERT 7
89 #define DISPLAY_MARGIN_HORIZ 6
90 #define DISPLAY_OVERFLOW_INDENT 76
91 #define DISPLAY_TICK_OFFSET_VERT -3
92 #define DISPLAY_TICK_OFFSET_HORIZ 12
93 #define DISPLAY_LEFT_SHIFT OFFSET_OF_BLOCK_2
94 
95 #define MEM_DISPLAY_LEFT_SHIFT ( OFFSET_OF_BLOCK_3 + BUTTON_SIZE / 2 )
96 #define MEM_DISPLAY_TOP_SHIFT  ( LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 4 \
97 		                            + INTERBLOCK_SPACING )
98 #define MEM_DISPLAY_V_STEP 16
99 #define MEM_DISPLAY_SIZE_HORIZ 112
100 #define MEM_DISPLAY_SIZE_VERT 16
101 #define MEM_DISPLAY_CELL_WIDTH 7
102 #define MEM_DISPLAY_DOT_OFFSET_VERT 0
103 #define MEM_DISPLAY_DOT_WIDTH 3
104 #define MEM_DISPLAY_MARGIN_VERT 4
105 #define MEM_DISPLAY_MARGIN_HORIZ 1
106 #define MEM_DISPLAY_OVERFLOW_INDENT 40
107 
108 #define REG_DISPLAY_LEFT_SHIFT (LEFT_MARGIN + 12)
109 
create_widgets(void)110 void create_widgets(void)
111 {
112 	char **button_xpm[MAX_BUTTON_NUMBER];
113 	char **op_xpm[NUMBER_OF_OPERATION_DISPLAY_GLYPHS];
114 	char **deg_rad_xpm[NUMBER_OF_ANGLE_UNIT_GLYPHS];
115 	char **format_xpm[NUMBER_OF_FORMAT_GLYPHS];
116 	char **reg_display_label_xpm[NUMBER_OF_REG_DISPLAYS];
117 	static char **digit_xpm[NUMBER_OF_DISPLAY_GLYPHS];
118 	static char **ldigit_xpm[NUMBER_OF_DISPLAY_GLYPHS];
119 	/* static because the display digit widgets are created on demand,
120 	 * therefore one need a static repository for their pixmaps */
121 
122 	int i;
123 
124 	create_main_window(BODY_SIZE_HORIZ, BODY_SIZE_VERT);
125 
126 	assign_pixmaps(button_xpm,
127 		       digit_xpm,
128 		       ldigit_xpm,
129 		       op_xpm,
130 		       deg_rad_xpm,
131 		       format_xpm,
132 		       reg_display_label_xpm);
133 
134 /*======= Register displays ==========================*/
135 
136 	create_display(MAIN_DISPLAY,
137 		       DISPLAY_LEFT_SHIFT,
138 		       TOP_MARGIN,
139 		       DISPLAY_SIZE_HORIZ,
140 		       DISPLAY_SIZE_VERT,
141 		       DISPLAY_CELL_WIDTH,
142 		       DISPLAY_DOT_OFFSET_VERT,
143 		       DISPLAY_DOT_WIDTH,
144 		       DISPLAY_MARGIN_VERT,
145 		       DISPLAY_MARGIN_HORIZ,
146 		       DISPLAY_OVERFLOW_INDENT,
147 		       DISPLAY_TICK_OFFSET_VERT,
148 		       DISPLAY_TICK_OFFSET_HORIZ,
149 		       TRUE, /* frame */
150 		       digit_xpm);
151 
152 	for(i = 0; i < NUMBER_OF_REG_DISPLAYS; i++){
153 		create_display(REG_DISPLAY_OFFSET + i,
154 			       REG_DISPLAY_LEFT_SHIFT,
155 			       TOP_MARGIN + (NUMBER_OF_REG_DISPLAYS - i - 1)
156 			                    * MEM_DISPLAY_SIZE_VERT,
157 			       MEM_DISPLAY_SIZE_HORIZ,
158 			       MEM_DISPLAY_SIZE_VERT,
159 			       MEM_DISPLAY_CELL_WIDTH,
160 			       MEM_DISPLAY_DOT_OFFSET_VERT,
161 			       MEM_DISPLAY_DOT_WIDTH,
162 			       MEM_DISPLAY_MARGIN_VERT,
163 			       MEM_DISPLAY_MARGIN_HORIZ,
164 			       MEM_DISPLAY_OVERFLOW_INDENT,
165 			       0,
166 			       0,
167 			       TRUE, /* frame */
168   			       ldigit_xpm);
169 
170 		create_simple_display(OPERATION_DISPLAY_OFFSET + i,
171 				      REG_DISPLAY_LEFT_SHIFT +
172 				      MEM_DISPLAY_SIZE_HORIZ,
173 				      TOP_MARGIN +
174 				      (NUMBER_OF_REG_DISPLAYS - i - 1)
175 				      * MEM_DISPLAY_SIZE_VERT,
176 				      20, 16,
177 				      NUMBER_OF_OPERATION_DISPLAY_GLYPHS,
178 				      TRUE, /* frame */
179 				      op_xpm);
180 
181 		create_simple_display(DISPLAY_LABEL_DISPLAY_OFFSET + i,
182 				      LEFT_MARGIN,
183 				      TOP_MARGIN +
184 				      (NUMBER_OF_REG_DISPLAYS - i - 1)
185 				      * MEM_DISPLAY_SIZE_VERT,
186 				      12, 16,
187 				      NUMBER_OF_REG_DISPLAYS,
188 				      FALSE, /* frame */
189 				      reg_display_label_xpm);
190 		show_display_glyph(DISPLAY_LABEL_DISPLAY_OFFSET + i, i);
191 	}
192 
193 /*======= Block 0 =====================================*/
194 
195 	create_button(CODE_DEG_RAD,
196 		      OFFSET_OF_BLOCK_0,
197 		      LEFT_FOR_DISPLAY_VERT + INTERBLOCK_SPACING,
198 		      BUTTON_SIZE, BUTTON_SIZE / 2,
199 		      button_xpm, &clicked_change_angle_units,
200 		      "Change angle units");
201 
202 	create_simple_display(ANGLE_UNIT_DISPLAY_OFFSET,
203 			      OFFSET_OF_BLOCK_0,
204 			      LEFT_FOR_DISPLAY_VERT + INTERBLOCK_SPACING
205 		              + BUTTON_SIZE / 2,
206 			      BUTTON_SIZE, BUTTON_SIZE / 2,
207 			      NUMBER_OF_ANGLE_UNIT_GLYPHS,
208 			      TRUE, /* frame */
209 			      deg_rad_xpm);
210 
211 	create_button(CODE_INFO,
212 		      OFFSET_OF_BLOCK_0,
213 		      LEFT_FOR_DISPLAY_VERT + INTERBLOCK_SPACING
214 		      + BUTTON_SIZE,
215 		      BUTTON_SIZE, BUTTON_SIZE,
216 		      button_xpm, &clicked_code_info,
217 		      "About/Help");
218 
219 	create_button(CODE_SETTINGS,
220 		      OFFSET_OF_BLOCK_0,
221 		      LEFT_FOR_DISPLAY_VERT + INTERBLOCK_SPACING
222 		      + BUTTON_SIZE * 2,
223 		      BUTTON_SIZE, BUTTON_SIZE,
224 		      button_xpm, &clicked_code_settings,
225 		      "Settings");
226 
227 
228 	create_copy_button(CODE_COPY,
229 		      OFFSET_OF_BLOCK_0,
230 		      LEFT_FOR_DISPLAY_VERT  + INTERBLOCK_SPACING
231 			   + BUTTON_SIZE * 3,
232 		      BUTTON_SIZE, BUTTON_SIZE,
233 		      button_xpm,
234 		      NULL);
235 
236 	create_paste_button(CODE_PASTE,
237 			    OFFSET_OF_BLOCK_0,
238 			    LEFT_FOR_DISPLAY_VERT + INTERBLOCK_SPACING
239 			    + BUTTON_SIZE * 4,
240 			    BUTTON_SIZE, BUTTON_SIZE,
241 			    button_xpm,
242 			    NULL);
243 
244 /*======= Block 1 =====================================*/
245 /*------- Block 1 Row 1 -------------------------------*/
246 
247 	create_button(CODE_SIN,
248 		      OFFSET_OF_BLOCK_1,
249 		      LEFT_FOR_DISPLAY_VERT + INTERBLOCK_SPACING,
250 		      BUTTON_SIZE, BUTTON_SIZE,
251 		      button_xpm, &clicked_code_sin,
252 		      NULL);
253 
254 	create_button(CODE_SQR,
255 		      OFFSET_OF_BLOCK_1 + BUTTON_SIZE,
256 		      LEFT_FOR_DISPLAY_VERT + INTERBLOCK_SPACING,
257 		      BUTTON_SIZE, BUTTON_SIZE,
258 		      button_xpm, &clicked_code_sqr,
259 		      NULL);
260 
261 	create_button(CODE_SQRT,
262 		      OFFSET_OF_BLOCK_1 + BUTTON_SIZE * 2,
263 		      LEFT_FOR_DISPLAY_VERT + INTERBLOCK_SPACING,
264 		      BUTTON_SIZE, BUTTON_SIZE,
265 		      button_xpm,  &clicked_code_sqrt,
266 		      NULL);
267 
268 /*----- Block 1 Row 2 -----------------------------------*/
269 
270 	create_button(CODE_COS,
271 		      OFFSET_OF_BLOCK_1,
272 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE
273 		                            + INTERBLOCK_SPACING,
274 		      BUTTON_SIZE, BUTTON_SIZE,
275 		      button_xpm,  &clicked_code_cos,
276 		      NULL);
277 
278 	create_button(CODE_ETOX,
279 		      OFFSET_OF_BLOCK_1 + BUTTON_SIZE,
280 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE
281 		                            + INTERBLOCK_SPACING,
282 		      BUTTON_SIZE, BUTTON_SIZE,
283 		      button_xpm,  &clicked_code_etox,
284 		      NULL);
285 
286 	create_button(CODE_LN,
287 		      OFFSET_OF_BLOCK_1 + BUTTON_SIZE * 2,
288 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE
289 		                            + INTERBLOCK_SPACING,
290 		      BUTTON_SIZE, BUTTON_SIZE,
291 		      button_xpm, &clicked_code_ln,
292 		      NULL);
293 
294 /*----- Block 1 Row 3 -------------------------------------*/
295 
296 	create_button(CODE_TAN,
297 		      OFFSET_OF_BLOCK_1,
298 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 2
299 		                            + INTERBLOCK_SPACING,
300 		      BUTTON_SIZE, BUTTON_SIZE,
301 		      button_xpm,  &clicked_code_tan,
302 		      NULL);
303 
304 	create_button(CODE_10TOX,
305 		      OFFSET_OF_BLOCK_1 + BUTTON_SIZE,
306 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 2
307 		                            + INTERBLOCK_SPACING,
308 		      BUTTON_SIZE, BUTTON_SIZE,
309 		      button_xpm,  &clicked_code_10tox,
310 		      NULL);
311 
312 	create_button(CODE_LOG,
313 		      OFFSET_OF_BLOCK_1 + BUTTON_SIZE * 2,
314 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 2
315 		                            + INTERBLOCK_SPACING,
316 		      BUTTON_SIZE, BUTTON_SIZE,
317 		      button_xpm,  &clicked_code_log,
318 		      NULL);
319 
320 /*----- Block 1 Row 4 ---------------------------------------*/
321 
322 	create_toggle_button(CODE_ARC,
323 			     OFFSET_OF_BLOCK_1,
324 			     LEFT_FOR_DISPLAY_VERT  + BUTTON_SIZE * 3
325 		                            + INTERBLOCK_SPACING,
326 			     BUTTON_SIZE, BUTTON_SIZE,
327 			     button_xpm, &toggled_arc_button,
328 			     NULL);
329 
330 	create_button(CODE_POW,
331 		      OFFSET_OF_BLOCK_1 + BUTTON_SIZE,
332 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 3
333 		                            + INTERBLOCK_SPACING,
334 		      BUTTON_SIZE, BUTTON_SIZE,
335 		      button_xpm, &clicked_code_pow,
336 		      NULL);
337 
338 	create_button(CODE_INVX,
339 		      OFFSET_OF_BLOCK_1 + BUTTON_SIZE * 2,
340 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 3
341 		                            + INTERBLOCK_SPACING,
342 		      BUTTON_SIZE, BUTTON_SIZE,
343 		      button_xpm, &clicked_code_invx,
344 		      NULL);
345 
346 /*----- Block 1 Row 5 ---------------------------------------*/
347 
348 	create_toggle_button(CODE_HYP,
349 			     OFFSET_OF_BLOCK_1,
350 			     LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 4
351 		                            + INTERBLOCK_SPACING,
352 			     BUTTON_SIZE, BUTTON_SIZE,
353 			     button_xpm, &toggled_hyp_button,
354 			     NULL);
355 
356 	create_button(CODE_PI,
357 		      OFFSET_OF_BLOCK_1 + BUTTON_SIZE,
358 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 4
359 		                            + INTERBLOCK_SPACING,
360 		      BUTTON_SIZE, BUTTON_SIZE,
361 		      button_xpm, &clicked_code_pi,
362 		      NULL);
363 
364 	create_button(CODE_FACT,
365 		      OFFSET_OF_BLOCK_1 + BUTTON_SIZE * 2,
366 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 4
367 		                            + INTERBLOCK_SPACING,
368 		      BUTTON_SIZE, BUTTON_SIZE,
369 		      button_xpm, &clicked_code_fact,
370 		      NULL);
371 
372 /*===== Block 2 ===========================================*/
373 /*----- Block 2 Row 1 -------------------------------------*/
374 
375     	create_button(CODE_7,
376 		      OFFSET_OF_BLOCK_2,
377 		      LEFT_FOR_DISPLAY_VERT,
378 		      BUTTON_SIZE, BUTTON_SIZE,
379 		      button_xpm, &clicked_code_7,
380 		      NULL);
381 
382 	create_button(CODE_8,
383 		      OFFSET_OF_BLOCK_2 + BUTTON_SIZE,
384 		      LEFT_FOR_DISPLAY_VERT,
385 		      BUTTON_SIZE, BUTTON_SIZE,
386 		      button_xpm, &clicked_code_8,
387 		      NULL);
388 
389 	create_button(CODE_9,
390 		      OFFSET_OF_BLOCK_2 + BUTTON_SIZE * 2,
391 		      LEFT_FOR_DISPLAY_VERT,
392 		      BUTTON_SIZE, BUTTON_SIZE,
393 		      button_xpm,  &clicked_code_9,
394 		      NULL);
395 
396 /*----- Block 2 Row 2 -------------------------------------*/
397 
398 	create_button(CODE_4,
399 		      OFFSET_OF_BLOCK_2,
400 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE,
401 		      BUTTON_SIZE, BUTTON_SIZE,
402 		      button_xpm,  &clicked_code_4,
403 		      NULL);
404 
405 	create_button(CODE_5,
406 		      OFFSET_OF_BLOCK_2 + BUTTON_SIZE,
407 		      LEFT_FOR_DISPLAY_VERT  + BUTTON_SIZE,
408 		      BUTTON_SIZE, BUTTON_SIZE,
409 		      button_xpm, &clicked_code_5,
410 		      NULL);
411 
412 	create_button(CODE_6,
413 		      OFFSET_OF_BLOCK_2 + BUTTON_SIZE * 2,
414 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE,
415 		      BUTTON_SIZE, BUTTON_SIZE,
416 		      button_xpm,  &clicked_code_6,
417 		      NULL);
418 
419 /*----- Block 2 Row 3 -------------------------------------*/
420 
421 	create_button(CODE_1,
422 		      OFFSET_OF_BLOCK_2,
423 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 2,
424 		      BUTTON_SIZE, BUTTON_SIZE,
425 		      button_xpm, &clicked_code_1,
426 		      NULL);
427 
428 	create_button(CODE_2,
429 		      OFFSET_OF_BLOCK_2 + BUTTON_SIZE,
430 		      LEFT_FOR_DISPLAY_VERT  + BUTTON_SIZE * 2,
431 		      BUTTON_SIZE, BUTTON_SIZE,
432 		      button_xpm, &clicked_code_2,
433 		      NULL);
434 
435 	create_button(CODE_3,
436 		      OFFSET_OF_BLOCK_2 + BUTTON_SIZE * 2,
437 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 2,
438 		      BUTTON_SIZE, BUTTON_SIZE,
439 		      button_xpm, &clicked_code_3,
440 		      NULL);
441 
442 /*----- Block 2 Row 4 -------------------------------------*/
443 
444 	create_button(CODE_0,
445 		      OFFSET_OF_BLOCK_2,
446 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 3,
447 		      BUTTON_SIZE, BUTTON_SIZE,
448 		      button_xpm, &clicked_code_0,
449 		      NULL);
450 
451 	create_button(CODE_SIGN,
452 		      OFFSET_OF_BLOCK_2 + BUTTON_SIZE,
453 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 3,
454 		      BUTTON_SIZE, BUTTON_SIZE,
455 		      button_xpm, &clicked_code_sign,
456 		      NULL);
457 
458 	create_button(CODE_DOT,
459 		      OFFSET_OF_BLOCK_2 + BUTTON_SIZE * 2,
460 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 3,
461 		      BUTTON_SIZE, BUTTON_SIZE,
462 		      button_xpm, &clicked_code_dot,
463 		      NULL);
464 
465 /*----- Block 2 Row 5 ------------------------------------------*/
466 
467 	create_button(CODE_EXP,
468 		      OFFSET_OF_BLOCK_2,
469 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 4
470 		                            + INTERBLOCK_SPACING,
471 		      BUTTON_SIZE, BUTTON_SIZE,
472 		      button_xpm, &clicked_code_exp,
473 		      NULL);
474 
475 	create_button(CODE_EXP_SIGN,
476 		      OFFSET_OF_BLOCK_2 + BUTTON_SIZE,
477 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 4
478 		                            + INTERBLOCK_SPACING,
479 		      BUTTON_SIZE, BUTTON_SIZE,
480 		      button_xpm, &clicked_code_exp_sign,
481 		      NULL);
482 
483 	create_button(CODE_FORMAT,
484 		      OFFSET_OF_BLOCK_2 + BUTTON_SIZE * 2,
485 		      LEFT_FOR_DISPLAY_VERT + INTERBLOCK_SPACING
486 		              + BUTTON_SIZE * 4,
487 		      BUTTON_SIZE, BUTTON_SIZE / 2,
488 		      button_xpm, &clicked_change_display_format,
489 		      "Change display format");
490 
491 	/* format display */
492 	create_simple_display(FORMAT_DISPLAY_OFFSET,
493 			      OFFSET_OF_BLOCK_2 + BUTTON_SIZE * 2,
494 			      LEFT_FOR_DISPLAY_VERT + INTERBLOCK_SPACING
495 		                      + BUTTON_SIZE * 4 + BUTTON_SIZE / 2,
496 			      BUTTON_SIZE, BUTTON_SIZE / 2,
497 			      NUMBER_OF_FORMAT_GLYPHS,
498 			      TRUE, /* frame */
499 			      format_xpm);
500 
501 /*====== Block 3 ===============================================*/
502 /*------ Block 3 Row 1 -----------------------------------------*/
503 
504 	create_button(CODE_ADD,
505 		      OFFSET_OF_BLOCK_3,
506 		      LEFT_FOR_DISPLAY_VERT,
507 		      BUTTON_SIZE, BUTTON_SIZE,
508 		      button_xpm, &clicked_code_add,
509 		      NULL);
510 
511 	create_button(CODE_SUB,
512 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE,
513 		      LEFT_FOR_DISPLAY_VERT,
514 		      BUTTON_SIZE, BUTTON_SIZE,
515 		      button_xpm, &clicked_code_sub,
516 		      NULL);
517 
518 	create_button(CODE_CLEAR_ALL,
519 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE * 2,
520 		      LEFT_FOR_DISPLAY_VERT,
521 		      BUTTON_SIZE, BUTTON_SIZE,
522 		      button_xpm, &clicked_code_clear_all,
523 		      NULL);
524 
525 	create_button(CODE_UNDO,
526 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE * 3,
527 		      LEFT_FOR_DISPLAY_VERT,
528 		      BUTTON_SIZE, BUTTON_SIZE,
529 		      button_xpm, &clicked_code_undo,
530 		      "Undo");
531 
532 /*----- Block 3 Row 2 -----------------------------------------------*/
533 
534 	create_button(CODE_MUL,
535 		      OFFSET_OF_BLOCK_3,
536 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE,
537 		      BUTTON_SIZE, BUTTON_SIZE,
538 		      button_xpm, &clicked_code_mul,
539 		      NULL);
540 
541 	create_button(CODE_DIV,
542 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE,
543 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE,
544 		      BUTTON_SIZE, BUTTON_SIZE,
545 		      button_xpm, &clicked_code_div,
546 		      NULL);
547 
548 	create_button(CODE_EQ,
549 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE * 2,
550 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE,
551 		      BUTTON_SIZE, BUTTON_SIZE,
552 		      button_xpm, &clicked_code_eq,
553 		      NULL);
554 
555 	create_button(CODE_ENTER,
556 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE * 2,
557 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE,
558 		      BUTTON_SIZE, BUTTON_SIZE,
559 		      button_xpm, &clicked_code_enter,
560 		      "Enter");
561 
562 	create_button(CODE_REDO,
563 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE * 3,
564 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE,
565 		      BUTTON_SIZE, BUTTON_SIZE,
566 		      button_xpm, &clicked_code_redo,
567 		      "Redo");
568 
569 /*----- Block 3 Row 3 ----------------------------------------------*/
570 
571 	create_button(CODE_EXCH_XY,
572 		      OFFSET_OF_BLOCK_3,
573 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 2,
574 		      BUTTON_SIZE, BUTTON_SIZE,
575 		      button_xpm, &clicked_code_exch_xy,
576 		      "Swap X and Y");
577 
578 	create_button(CODE_LEFT_PAREN,
579 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE,
580 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 2,
581 		      BUTTON_SIZE, BUTTON_SIZE,
582 		      button_xpm, &clicked_code_left_paren,
583 		      NULL);
584 
585 	create_button(CODE_STACK_DOWN,
586 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE,
587 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 2,
588 		      BUTTON_SIZE, BUTTON_SIZE,
589 		      button_xpm, &clicked_code_stack_down,
590 		      "Scroll stack down");
591 
592 	create_button(CODE_RIGHT_PAREN,
593 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE * 2,
594 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 2,
595 		      BUTTON_SIZE, BUTTON_SIZE,
596 		      button_xpm, &clicked_code_right_paren,
597 		      NULL);
598 
599 	create_button(CODE_STACK_UP,
600 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE * 2,
601 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 2,
602 		      BUTTON_SIZE, BUTTON_SIZE,
603 		      button_xpm, &clicked_code_stack_up,
604 		      "Scroll stack up");
605 
606 	create_button(CODE_CLEAR_X,
607 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE * 3,
608 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 2,
609 		      BUTTON_SIZE, BUTTON_SIZE,
610 		      button_xpm, &clicked_code_clear_x,
611 		      "Clear X");
612 
613 /*----- Block 3 Row 4 ----------------------------------------------*/
614 
615 	create_button(CODE_X_TO_MEM,
616 		      OFFSET_OF_BLOCK_3,
617 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 3
618 		                            + INTERBLOCK_SPACING,
619 		      BUTTON_SIZE, BUTTON_SIZE,
620 		      button_xpm, &clicked_code_x_to_mem,
621 		      "STO");
622 
623 	create_button(CODE_MEM_TO_X,
624 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE,
625 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 3
626 		                            + INTERBLOCK_SPACING,
627 		      BUTTON_SIZE, BUTTON_SIZE,
628 		      button_xpm, &clicked_code_mem_to_x,
629 		      "RCL");
630 
631 	create_button(CODE_MEM_PLUS,
632 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE * 2,
633 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 3
634 		                            + INTERBLOCK_SPACING,
635 		      BUTTON_SIZE, BUTTON_SIZE,
636 		      button_xpm, &clicked_code_mem_plus,
637 		      "Add X to memory");
638 
639 	create_button(CODE_EXCH_XMEM,
640 		      OFFSET_OF_BLOCK_3 + BUTTON_SIZE * 3,
641 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 3
642 		                            + INTERBLOCK_SPACING,
643 		      BUTTON_SIZE, BUTTON_SIZE,
644 		      button_xpm, &clicked_code_exch_xmem,
645 		      "Swap X and memory");
646 
647 /*----- Block 3 Row 5 ----------------------------------------------*/
648 
649 	create_button(CODE_SWITCH_TO_MEM0,
650 		      OFFSET_OF_BLOCK_3,
651 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 4
652 		                            + INTERBLOCK_SPACING,
653 		      BUTTON_SIZE / 2, BUTTON_SIZE / 2,
654 		      button_xpm, &clicked_code_switch_to_mem0,
655 		      "Switch to memory register 0");
656 
657 	create_button(CODE_SWITCH_TO_MEM1,
658 		      OFFSET_OF_BLOCK_3,
659 		      LEFT_FOR_DISPLAY_VERT + BUTTON_SIZE * 4
660 		                            + BUTTON_SIZE / 2
661 		                            + INTERBLOCK_SPACING,
662 		      BUTTON_SIZE / 2, BUTTON_SIZE /2 ,
663 		      button_xpm, &clicked_code_switch_to_mem1,
664 		      "Switch to memory register 1");
665 
666 
667 	for(i = 0; i < NUMBER_OF_MEMS; i++)
668 		create_display(MEM_DISPLAY_OFFSET + i,
669 			       MEM_DISPLAY_LEFT_SHIFT,
670 			       MEM_DISPLAY_TOP_SHIFT +
671 			       i * MEM_DISPLAY_V_STEP,
672 			       MEM_DISPLAY_SIZE_HORIZ,
673 			       MEM_DISPLAY_SIZE_VERT,
674 			       MEM_DISPLAY_CELL_WIDTH,
675 			       MEM_DISPLAY_DOT_OFFSET_VERT,
676 			       MEM_DISPLAY_DOT_WIDTH,
677 			       MEM_DISPLAY_MARGIN_VERT,
678 			       MEM_DISPLAY_MARGIN_HORIZ,
679 			       MEM_DISPLAY_OVERFLOW_INDENT,
680 			       0,
681 			       0,
682 			       TRUE, /* frame */
683 			       ldigit_xpm);
684 
685 }
686 
687 
688