Changes in uspace/app/calculator/calculator.c [d0dfbba:d942ca4] in mainline
- File:
-
- 1 edited
-
uspace/app/calculator/calculator.c (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/calculator/calculator.c
rd0dfbba rd942ca4 1 1 /* 2 * Copyright (c) 202 6Jiri Svoboda2 * Copyright (c) 2020 Jiri Svoboda 3 3 * Copyright (c) 2016 Martin Decky 4 4 * All rights reserved. … … 37 37 */ 38 38 39 #include <adt/list.h>40 #include <clipboard.h>41 39 #include <ctype.h> 42 40 #include <io/kbd_event.h> … … 47 45 #include <ui/entry.h> 48 46 #include <ui/fixed.h> 49 #include <ui/menu.h>50 #include <ui/menubar.h>51 #include <ui/menudd.h>52 #include <ui/menuentry.h>53 47 #include <ui/pbutton.h> 54 48 #include <ui/ui.h> … … 101 95 } stack_item_t; 102 96 103 /** Dimensions. Most of this should not be needed with auto layout */104 typedef struct {105 gfx_rect_t menubar_rect;106 gfx_rect_t entry_rect;107 gfx_coord2_t btn_orig;108 gfx_coord2_t btn_stride;109 gfx_coord2_t btn_dim;110 } calc_geom_t;111 112 97 typedef struct { 113 98 ui_t *ui; 114 ui_resource_t *ui_res;115 99 ui_pbutton_t *btn_eval; 116 100 ui_pbutton_t *btn_clear; … … 129 113 ui_pbutton_t *btn_8; 130 114 ui_pbutton_t *btn_9; 131 ui_menu_bar_t *menubar;132 calc_geom_t geom;133 115 } calc_t; 134 135 static void display_update(void);136 137 static void calc_file_exit(ui_menu_entry_t *, void *);138 static void calc_edit_copy(ui_menu_entry_t *, void *);139 static void calc_edit_paste(ui_menu_entry_t *, void *);140 116 141 117 static void calc_pb_clicked(ui_pbutton_t *, void *); … … 162 138 .kbd = wnd_kbd_event 163 139 }; 164 165 static char *expr = NULL;166 static ui_entry_t *display;167 140 168 141 /** Window close request … … 187 160 { 188 161 calc_t *calc = (calc_t *) arg; 189 190 if (ui_window_def_kbd(window, event) == ui_claimed)191 return;192 193 if (event->type == KEY_PRESS && (event->mods & KM_CTRL) != 0) {194 switch (event->key) {195 case KC_C:196 calc_edit_copy(NULL, calc);197 break;198 case KC_V:199 calc_edit_paste(NULL, calc);200 break;201 default:202 break;203 }204 }205 162 206 163 switch (event->key) { … … 307 264 } 308 265 309 /** File / Exit menu entry selected. 310 * 311 * @param mentry Menu entry 312 * @param arg Argument (calc_t *) 313 */ 314 static void calc_file_exit(ui_menu_entry_t *mentry, void *arg) 315 { 316 calc_t *calc = (calc_t *) arg; 317 318 ui_quit(calc->ui); 319 } 320 321 /** Edit / Copy menu entry selected. 322 * 323 * @param mentry Menu entry 324 * @param arg Argument (calc_t *) 325 */ 326 static void calc_edit_copy(ui_menu_entry_t *mentry, void *arg) 327 { 328 const char *str; 329 330 (void) arg; 331 str = (expr != NULL) ? expr : NULL_DISPLAY; 332 333 (void) clipboard_put_str(str); 334 } 335 336 /** Edit / Paste menu entry selected. 337 * 338 * @param mentry Menu entry 339 * @param arg Argument (calc_t *) 340 */ 341 static void calc_edit_paste(ui_menu_entry_t *mentry, void *arg) 342 { 343 char *str; 344 char *old; 345 char *cp; 346 errno_t rc; 347 348 (void) arg; 349 350 rc = clipboard_get_str(&str); 351 if (rc != EOK) 352 return; 353 354 /* Make sure string only contains allowed characters */ 355 cp = str; 356 while (*cp != '\0') { 357 if (!isdigit(*cp) && *cp != '+' && *cp != '-' && 358 *cp != '*' && *cp != '/') 359 return; 360 ++cp; 361 } 362 363 /* Update expression */ 364 old = expr; 365 expr = str; 366 free(old); 367 368 display_update(); 369 } 266 static char *expr = NULL; 267 static ui_entry_t *display; 370 268 371 269 static bool is_digit(char c) … … 752 650 } 753 651 754 static errno_t calc_button_create( calc_t *calc, ui_fixed_t *fixed,652 static errno_t calc_button_create(ui_resource_t *ui_res, ui_fixed_t *fixed, 755 653 int x, int y, const char *text, ui_pbutton_cb_t *cb, void *arg, 756 654 ui_pbutton_t **rbutton) … … 760 658 errno_t rc; 761 659 762 rc = ui_pbutton_create( calc->ui_res, text, &pb);660 rc = ui_pbutton_create(ui_res, text, &pb); 763 661 if (rc != EOK) { 764 662 printf("Error creating button.\n"); … … 768 666 ui_pbutton_set_cb(pb, cb, arg); 769 667 770 rect.p0.x = calc->geom.btn_orig.x + calc->geom.btn_stride.x* x;771 rect.p0.y = calc->geom.btn_orig.y + calc->geom.btn_stride.y* y;772 rect.p1.x = rect.p0.x + calc->geom.btn_dim.x;773 rect.p1.y = rect.p0.y + calc->geom.btn_dim.y;668 rect.p0.x = 10 + 60 * x; 669 rect.p0.y = 90 + 45 * y; 670 rect.p1.x = 60 + 60 * x; 671 rect.p1.y = 125 + 45 * y; 774 672 ui_pbutton_set_rect(pb, &rect); 775 673 … … 792 690 int main(int argc, char *argv[]) 793 691 { 794 const char *display_spec = UI_ ANY_DEFAULT;692 const char *display_spec = UI_DISPLAY_DEFAULT; 795 693 ui_t *ui; 796 694 ui_resource_t *ui_res; … … 798 696 ui_wnd_params_t params; 799 697 ui_window_t *window; 800 ui_menu_t *mfile; 801 ui_menu_entry_t *mexit; 802 ui_menu_t *medit; 803 ui_menu_entry_t *mcopy; 804 ui_menu_entry_t *mpaste; 698 gfx_rect_t rect; 805 699 calc_t calc; 806 700 errno_t rc; … … 835 729 params.rect.p0.x = 0; 836 730 params.rect.p0.y = 0; 837 838 if (ui_is_textmode(ui)) { 839 params.rect.p1.x = 38; 840 params.rect.p1.y = 18; 841 842 calc.geom.menubar_rect.p0.x = 1; 843 calc.geom.menubar_rect.p0.y = 1; 844 calc.geom.menubar_rect.p1.x = params.rect.p1.x - 1; 845 calc.geom.menubar_rect.p1.y = 2; 846 calc.geom.entry_rect.p0.x = 4; 847 calc.geom.entry_rect.p0.y = 3; 848 calc.geom.entry_rect.p1.x = 34; 849 calc.geom.entry_rect.p1.y = 4; 850 calc.geom.btn_orig.x = 4; 851 calc.geom.btn_orig.y = 5; 852 calc.geom.btn_dim.x = 6; 853 calc.geom.btn_dim.y = 2; 854 calc.geom.btn_stride.x = 8; 855 calc.geom.btn_stride.y = 3; 856 } else { 857 params.rect.p1.x = 250; 858 params.rect.p1.y = 270; 859 860 calc.geom.menubar_rect.p0.x = 4; 861 calc.geom.menubar_rect.p0.y = 30; 862 calc.geom.menubar_rect.p1.x = params.rect.p1.x - 4; 863 calc.geom.menubar_rect.p1.y = 52; 864 calc.geom.entry_rect.p0.x = 10; 865 calc.geom.entry_rect.p0.y = 51; 866 calc.geom.entry_rect.p1.x = 240; 867 calc.geom.entry_rect.p1.y = 76; 868 calc.geom.btn_orig.x = 10; 869 calc.geom.btn_orig.y = 90; 870 calc.geom.btn_dim.x = 50; 871 calc.geom.btn_dim.y = 35; 872 calc.geom.btn_stride.x = 60; 873 calc.geom.btn_stride.y = 45; 874 } 731 params.rect.p1.x = 250; 732 params.rect.p1.y = 270; 875 733 876 734 rc = ui_window_create(ui, ¶ms, &window); … … 884 742 885 743 ui_res = ui_window_get_res(window); 886 calc.ui_res = ui_res;887 744 888 745 rc = ui_fixed_create(&fixed); … … 892 749 } 893 750 894 rc = ui_menu_bar_create(ui, window, &calc.menubar); 895 if (rc != EOK) { 896 printf("Error creating menu bar.\n"); 897 return rc; 898 } 899 900 rc = ui_menu_dd_create(calc.menubar, "~F~ile", NULL, &mfile); 901 if (rc != EOK) { 902 printf("Error creating menu.\n"); 903 return rc; 904 } 905 906 rc = ui_menu_entry_create(mfile, "E~x~it", "Alt-F4", &mexit); 907 if (rc != EOK) { 908 printf("Error creating menu.\n"); 909 return rc; 910 } 911 912 ui_menu_entry_set_cb(mexit, calc_file_exit, (void *) &calc); 913 914 rc = ui_menu_dd_create(calc.menubar, "~E~dit", NULL, &medit); 915 if (rc != EOK) { 916 printf("Error creating menu.\n"); 917 return rc; 918 } 919 920 rc = ui_menu_entry_create(medit, "~C~opy", "Ctrl-C", &mcopy); 921 if (rc != EOK) { 922 printf("Error creating menu.\n"); 923 return rc; 924 } 925 926 ui_menu_entry_set_cb(mcopy, calc_edit_copy, (void *) &calc); 927 928 rc = ui_menu_entry_create(medit, "~P~aste", "Ctrl-V", &mpaste); 929 if (rc != EOK) { 930 printf("Error creating menu.\n"); 931 return rc; 932 } 933 934 ui_menu_entry_set_cb(mpaste, calc_edit_paste, (void *) &calc); 935 936 ui_menu_bar_set_rect(calc.menubar, &calc.geom.menubar_rect); 937 938 rc = ui_fixed_add(fixed, ui_menu_bar_ctl(calc.menubar)); 939 if (rc != EOK) { 940 printf("Error adding control to layout.\n"); 941 return rc; 942 } 943 944 rc = ui_entry_create(window, NULL_DISPLAY, &display); 751 rc = ui_entry_create(ui_res, NULL_DISPLAY, &display); 945 752 if (rc != EOK) { 946 753 printf("Error creating text lentry.\n"); … … 948 755 } 949 756 950 ui_entry_set_rect(display, &calc.geom.entry_rect); 757 rect.p0.x = 15; 758 rect.p0.y = 45; 759 rect.p1.x = 235; 760 rect.p1.y = 70; 761 ui_entry_set_rect(display, &rect); 951 762 ui_entry_set_halign(display, gfx_halign_right); 952 ui_entry_set_read_only(display, true);953 763 954 764 rc = ui_fixed_add(fixed, ui_entry_ctl(display)); … … 958 768 } 959 769 960 rc = calc_button_create( &calc, fixed, 0, 0, "7", &calc_pbutton_cb,770 rc = calc_button_create(ui_res, fixed, 0, 0, "7", &calc_pbutton_cb, 961 771 (void *) "7", &calc.btn_7); 962 772 if (rc != EOK) 963 773 return rc; 964 774 965 rc = calc_button_create( &calc, fixed, 1, 0, "8", &calc_pbutton_cb,775 rc = calc_button_create(ui_res, fixed, 1, 0, "8", &calc_pbutton_cb, 966 776 (void *) "8", &calc.btn_8); 967 777 if (rc != EOK) 968 778 return rc; 969 779 970 rc = calc_button_create( &calc, fixed, 2, 0, "9", &calc_pbutton_cb,780 rc = calc_button_create(ui_res, fixed, 2, 0, "9", &calc_pbutton_cb, 971 781 (void *) "9", &calc.btn_9); 972 782 if (rc != EOK) 973 783 return rc; 974 784 975 rc = calc_button_create( &calc, fixed, 3, 0, "/", &calc_pbutton_cb,785 rc = calc_button_create(ui_res, fixed, 3, 0, "/", &calc_pbutton_cb, 976 786 (void *) "/", &calc.btn_div); 977 787 if (rc != EOK) 978 788 return rc; 979 789 980 rc = calc_button_create( &calc, fixed, 0, 1, "4", &calc_pbutton_cb,790 rc = calc_button_create(ui_res, fixed, 0, 1, "4", &calc_pbutton_cb, 981 791 (void *) "4", &calc.btn_4); 982 792 if (rc != EOK) 983 793 return rc; 984 794 985 rc = calc_button_create( &calc, fixed, 1, 1, "5", &calc_pbutton_cb,795 rc = calc_button_create(ui_res, fixed, 1, 1, "5", &calc_pbutton_cb, 986 796 (void *) "5", &calc.btn_5); 987 797 if (rc != EOK) 988 798 return rc; 989 799 990 rc = calc_button_create( &calc, fixed, 2, 1, "6", &calc_pbutton_cb,800 rc = calc_button_create(ui_res, fixed, 2, 1, "6", &calc_pbutton_cb, 991 801 (void *) "6", &calc.btn_6); 992 802 if (rc != EOK) 993 803 return rc; 994 804 995 rc = calc_button_create( &calc, fixed, 3, 1, "*", &calc_pbutton_cb,805 rc = calc_button_create(ui_res, fixed, 3, 1, "*", &calc_pbutton_cb, 996 806 (void *) "*", &calc.btn_mul); 997 807 if (rc != EOK) 998 808 return rc; 999 809 1000 rc = calc_button_create( &calc, fixed, 0, 2, "1", &calc_pbutton_cb,810 rc = calc_button_create(ui_res, fixed, 0, 2, "1", &calc_pbutton_cb, 1001 811 (void *) "1", &calc.btn_1); 1002 812 if (rc != EOK) 1003 813 return rc; 1004 814 1005 rc = calc_button_create( &calc, fixed, 1, 2, "2", &calc_pbutton_cb,815 rc = calc_button_create(ui_res, fixed, 1, 2, "2", &calc_pbutton_cb, 1006 816 (void *) "2", &calc.btn_2); 1007 817 if (rc != EOK) 1008 818 return rc; 1009 819 1010 rc = calc_button_create( &calc, fixed, 2, 2, "3", &calc_pbutton_cb,820 rc = calc_button_create(ui_res, fixed, 2, 2, "3", &calc_pbutton_cb, 1011 821 (void *) "3", &calc.btn_3); 1012 822 if (rc != EOK) 1013 823 return rc; 1014 824 1015 rc = calc_button_create( &calc, fixed, 3, 2, "-", &calc_pbutton_cb,825 rc = calc_button_create(ui_res, fixed, 3, 2, "-", &calc_pbutton_cb, 1016 826 (void *) "-", &calc.btn_sub); 1017 827 if (rc != EOK) 1018 828 return rc; 1019 829 1020 rc = calc_button_create( &calc, fixed, 0, 3, "0", &calc_pbutton_cb,830 rc = calc_button_create(ui_res, fixed, 0, 3, "0", &calc_pbutton_cb, 1021 831 (void *) "0", &calc.btn_0); 1022 832 if (rc != EOK) 1023 833 return rc; 1024 834 1025 rc = calc_button_create( &calc, fixed, 1, 3, "C", &calc_clear_cb,835 rc = calc_button_create(ui_res, fixed, 1, 3, "C", &calc_clear_cb, 1026 836 (void *) "C", &calc.btn_clear); 1027 837 if (rc != EOK) 1028 838 return rc; 1029 839 1030 rc = calc_button_create( &calc, fixed, 2, 3, "=", &calc_eval_cb,840 rc = calc_button_create(ui_res, fixed, 2, 3, "=", &calc_eval_cb, 1031 841 (void *) "=", &calc.btn_eval); 1032 842 if (rc != EOK) 1033 843 return rc; 1034 844 1035 rc = calc_button_create( &calc, fixed, 3, 3, "+", &calc_pbutton_cb,845 rc = calc_button_create(ui_res, fixed, 3, 3, "+", &calc_pbutton_cb, 1036 846 (void *) "+", &calc.btn_add); 1037 847 if (rc != EOK)
Note:
See TracChangeset
for help on using the changeset viewer.
