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