Changes in uspace/app/calculator/calculator.c [d942ca4:d0dfbba] in mainline
- File:
-
- 1 edited
-
uspace/app/calculator/calculator.c (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/calculator/calculator.c
rd942ca4 rd0dfbba 1 1 /* 2 * Copyright (c) 202 0Jiri Svoboda2 * Copyright (c) 2026 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> 39 41 #include <ctype.h> 40 42 #include <io/kbd_event.h> … … 45 47 #include <ui/entry.h> 46 48 #include <ui/fixed.h> 49 #include <ui/menu.h> 50 #include <ui/menubar.h> 51 #include <ui/menudd.h> 52 #include <ui/menuentry.h> 47 53 #include <ui/pbutton.h> 48 54 #include <ui/ui.h> … … 95 101 } stack_item_t; 96 102 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 97 112 typedef struct { 98 113 ui_t *ui; 114 ui_resource_t *ui_res; 99 115 ui_pbutton_t *btn_eval; 100 116 ui_pbutton_t *btn_clear; … … 113 129 ui_pbutton_t *btn_8; 114 130 ui_pbutton_t *btn_9; 131 ui_menu_bar_t *menubar; 132 calc_geom_t geom; 115 133 } 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 *); 116 140 117 141 static void calc_pb_clicked(ui_pbutton_t *, void *); … … 138 162 .kbd = wnd_kbd_event 139 163 }; 164 165 static char *expr = NULL; 166 static ui_entry_t *display; 140 167 141 168 /** Window close request … … 160 187 { 161 188 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 } 162 205 163 206 switch (event->key) { … … 264 307 } 265 308 266 static char *expr = NULL; 267 static ui_entry_t *display; 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 } 268 370 269 371 static bool is_digit(char c) … … 650 752 } 651 753 652 static errno_t calc_button_create( ui_resource_t *ui_res, ui_fixed_t *fixed,754 static errno_t calc_button_create(calc_t *calc, ui_fixed_t *fixed, 653 755 int x, int y, const char *text, ui_pbutton_cb_t *cb, void *arg, 654 756 ui_pbutton_t **rbutton) … … 658 760 errno_t rc; 659 761 660 rc = ui_pbutton_create( ui_res, text, &pb);762 rc = ui_pbutton_create(calc->ui_res, text, &pb); 661 763 if (rc != EOK) { 662 764 printf("Error creating button.\n"); … … 666 768 ui_pbutton_set_cb(pb, cb, arg); 667 769 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;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; 672 774 ui_pbutton_set_rect(pb, &rect); 673 775 … … 690 792 int main(int argc, char *argv[]) 691 793 { 692 const char *display_spec = UI_ DISPLAY_DEFAULT;794 const char *display_spec = UI_ANY_DEFAULT; 693 795 ui_t *ui; 694 796 ui_resource_t *ui_res; … … 696 798 ui_wnd_params_t params; 697 799 ui_window_t *window; 698 gfx_rect_t rect; 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; 699 805 calc_t calc; 700 806 errno_t rc; … … 729 835 params.rect.p0.x = 0; 730 836 params.rect.p0.y = 0; 731 params.rect.p1.x = 250; 732 params.rect.p1.y = 270; 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 } 733 875 734 876 rc = ui_window_create(ui, ¶ms, &window); … … 742 884 743 885 ui_res = ui_window_get_res(window); 886 calc.ui_res = ui_res; 744 887 745 888 rc = ui_fixed_create(&fixed); … … 749 892 } 750 893 751 rc = ui_entry_create(ui_res, NULL_DISPLAY, &display); 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); 752 945 if (rc != EOK) { 753 946 printf("Error creating text lentry.\n"); … … 755 948 } 756 949 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); 950 ui_entry_set_rect(display, &calc.geom.entry_rect); 762 951 ui_entry_set_halign(display, gfx_halign_right); 952 ui_entry_set_read_only(display, true); 763 953 764 954 rc = ui_fixed_add(fixed, ui_entry_ctl(display)); … … 768 958 } 769 959 770 rc = calc_button_create( ui_res, fixed, 0, 0, "7", &calc_pbutton_cb,960 rc = calc_button_create(&calc, fixed, 0, 0, "7", &calc_pbutton_cb, 771 961 (void *) "7", &calc.btn_7); 772 962 if (rc != EOK) 773 963 return rc; 774 964 775 rc = calc_button_create( ui_res, fixed, 1, 0, "8", &calc_pbutton_cb,965 rc = calc_button_create(&calc, fixed, 1, 0, "8", &calc_pbutton_cb, 776 966 (void *) "8", &calc.btn_8); 777 967 if (rc != EOK) 778 968 return rc; 779 969 780 rc = calc_button_create( ui_res, fixed, 2, 0, "9", &calc_pbutton_cb,970 rc = calc_button_create(&calc, fixed, 2, 0, "9", &calc_pbutton_cb, 781 971 (void *) "9", &calc.btn_9); 782 972 if (rc != EOK) 783 973 return rc; 784 974 785 rc = calc_button_create( ui_res, fixed, 3, 0, "/", &calc_pbutton_cb,975 rc = calc_button_create(&calc, fixed, 3, 0, "/", &calc_pbutton_cb, 786 976 (void *) "/", &calc.btn_div); 787 977 if (rc != EOK) 788 978 return rc; 789 979 790 rc = calc_button_create( ui_res, fixed, 0, 1, "4", &calc_pbutton_cb,980 rc = calc_button_create(&calc, fixed, 0, 1, "4", &calc_pbutton_cb, 791 981 (void *) "4", &calc.btn_4); 792 982 if (rc != EOK) 793 983 return rc; 794 984 795 rc = calc_button_create( ui_res, fixed, 1, 1, "5", &calc_pbutton_cb,985 rc = calc_button_create(&calc, fixed, 1, 1, "5", &calc_pbutton_cb, 796 986 (void *) "5", &calc.btn_5); 797 987 if (rc != EOK) 798 988 return rc; 799 989 800 rc = calc_button_create( ui_res, fixed, 2, 1, "6", &calc_pbutton_cb,990 rc = calc_button_create(&calc, fixed, 2, 1, "6", &calc_pbutton_cb, 801 991 (void *) "6", &calc.btn_6); 802 992 if (rc != EOK) 803 993 return rc; 804 994 805 rc = calc_button_create( ui_res, fixed, 3, 1, "*", &calc_pbutton_cb,995 rc = calc_button_create(&calc, fixed, 3, 1, "*", &calc_pbutton_cb, 806 996 (void *) "*", &calc.btn_mul); 807 997 if (rc != EOK) 808 998 return rc; 809 999 810 rc = calc_button_create( ui_res, fixed, 0, 2, "1", &calc_pbutton_cb,1000 rc = calc_button_create(&calc, fixed, 0, 2, "1", &calc_pbutton_cb, 811 1001 (void *) "1", &calc.btn_1); 812 1002 if (rc != EOK) 813 1003 return rc; 814 1004 815 rc = calc_button_create( ui_res, fixed, 1, 2, "2", &calc_pbutton_cb,1005 rc = calc_button_create(&calc, fixed, 1, 2, "2", &calc_pbutton_cb, 816 1006 (void *) "2", &calc.btn_2); 817 1007 if (rc != EOK) 818 1008 return rc; 819 1009 820 rc = calc_button_create( ui_res, fixed, 2, 2, "3", &calc_pbutton_cb,1010 rc = calc_button_create(&calc, fixed, 2, 2, "3", &calc_pbutton_cb, 821 1011 (void *) "3", &calc.btn_3); 822 1012 if (rc != EOK) 823 1013 return rc; 824 1014 825 rc = calc_button_create( ui_res, fixed, 3, 2, "-", &calc_pbutton_cb,1015 rc = calc_button_create(&calc, fixed, 3, 2, "-", &calc_pbutton_cb, 826 1016 (void *) "-", &calc.btn_sub); 827 1017 if (rc != EOK) 828 1018 return rc; 829 1019 830 rc = calc_button_create( ui_res, fixed, 0, 3, "0", &calc_pbutton_cb,1020 rc = calc_button_create(&calc, fixed, 0, 3, "0", &calc_pbutton_cb, 831 1021 (void *) "0", &calc.btn_0); 832 1022 if (rc != EOK) 833 1023 return rc; 834 1024 835 rc = calc_button_create( ui_res, fixed, 1, 3, "C", &calc_clear_cb,1025 rc = calc_button_create(&calc, fixed, 1, 3, "C", &calc_clear_cb, 836 1026 (void *) "C", &calc.btn_clear); 837 1027 if (rc != EOK) 838 1028 return rc; 839 1029 840 rc = calc_button_create( ui_res, fixed, 2, 3, "=", &calc_eval_cb,1030 rc = calc_button_create(&calc, fixed, 2, 3, "=", &calc_eval_cb, 841 1031 (void *) "=", &calc.btn_eval); 842 1032 if (rc != EOK) 843 1033 return rc; 844 1034 845 rc = calc_button_create( ui_res, fixed, 3, 3, "+", &calc_pbutton_cb,1035 rc = calc_button_create(&calc, fixed, 3, 3, "+", &calc_pbutton_cb, 846 1036 (void *) "+", &calc.btn_add); 847 1037 if (rc != EOK)
Note:
See TracChangeset
for help on using the changeset viewer.
