Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/calculator/calculator.c

    rd0dfbba rd942ca4  
    11/*
    2  * Copyright (c) 2026 Jiri Svoboda
     2 * Copyright (c) 2020 Jiri Svoboda
    33 * Copyright (c) 2016 Martin Decky
    44 * All rights reserved.
     
    3737 */
    3838
    39 #include <adt/list.h>
    40 #include <clipboard.h>
    4139#include <ctype.h>
    4240#include <io/kbd_event.h>
     
    4745#include <ui/entry.h>
    4846#include <ui/fixed.h>
    49 #include <ui/menu.h>
    50 #include <ui/menubar.h>
    51 #include <ui/menudd.h>
    52 #include <ui/menuentry.h>
    5347#include <ui/pbutton.h>
    5448#include <ui/ui.h>
     
    10195} stack_item_t;
    10296
    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 
    11297typedef struct {
    11398        ui_t *ui;
    114         ui_resource_t *ui_res;
    11599        ui_pbutton_t *btn_eval;
    116100        ui_pbutton_t *btn_clear;
     
    129113        ui_pbutton_t *btn_8;
    130114        ui_pbutton_t *btn_9;
    131         ui_menu_bar_t *menubar;
    132         calc_geom_t geom;
    133115} 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 *);
    140116
    141117static void calc_pb_clicked(ui_pbutton_t *, void *);
     
    162138        .kbd = wnd_kbd_event
    163139};
    164 
    165 static char *expr = NULL;
    166 static ui_entry_t *display;
    167140
    168141/** Window close request
     
    187160{
    188161        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         }
    205162
    206163        switch (event->key) {
     
    307264}
    308265
    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 }
     266static char *expr = NULL;
     267static ui_entry_t *display;
    370268
    371269static bool is_digit(char c)
     
    752650}
    753651
    754 static errno_t calc_button_create(calc_t *calc, ui_fixed_t *fixed,
     652static errno_t calc_button_create(ui_resource_t *ui_res, ui_fixed_t *fixed,
    755653    int x, int y, const char *text, ui_pbutton_cb_t *cb, void *arg,
    756654    ui_pbutton_t **rbutton)
     
    760658        errno_t rc;
    761659
    762         rc = ui_pbutton_create(calc->ui_res, text, &pb);
     660        rc = ui_pbutton_create(ui_res, text, &pb);
    763661        if (rc != EOK) {
    764662                printf("Error creating button.\n");
     
    768666        ui_pbutton_set_cb(pb, cb, arg);
    769667
    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;
    774672        ui_pbutton_set_rect(pb, &rect);
    775673
     
    792690int main(int argc, char *argv[])
    793691{
    794         const char *display_spec = UI_ANY_DEFAULT;
     692        const char *display_spec = UI_DISPLAY_DEFAULT;
    795693        ui_t *ui;
    796694        ui_resource_t *ui_res;
     
    798696        ui_wnd_params_t params;
    799697        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;
    805699        calc_t calc;
    806700        errno_t rc;
     
    835729        params.rect.p0.x = 0;
    836730        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;
    875733
    876734        rc = ui_window_create(ui, &params, &window);
     
    884742
    885743        ui_res = ui_window_get_res(window);
    886         calc.ui_res = ui_res;
    887744
    888745        rc = ui_fixed_create(&fixed);
     
    892749        }
    893750
    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);
    945752        if (rc != EOK) {
    946753                printf("Error creating text lentry.\n");
     
    948755        }
    949756
    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);
    951762        ui_entry_set_halign(display, gfx_halign_right);
    952         ui_entry_set_read_only(display, true);
    953763
    954764        rc = ui_fixed_add(fixed, ui_entry_ctl(display));
     
    958768        }
    959769
    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,
    961771            (void *) "7", &calc.btn_7);
    962772        if (rc != EOK)
    963773                return rc;
    964774
    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,
    966776            (void *) "8", &calc.btn_8);
    967777        if (rc != EOK)
    968778                return rc;
    969779
    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,
    971781            (void *) "9", &calc.btn_9);
    972782        if (rc != EOK)
    973783                return rc;
    974784
    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,
    976786            (void *) "/", &calc.btn_div);
    977787        if (rc != EOK)
    978788                return rc;
    979789
    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,
    981791            (void *) "4", &calc.btn_4);
    982792        if (rc != EOK)
    983793                return rc;
    984794
    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,
    986796            (void *) "5", &calc.btn_5);
    987797        if (rc != EOK)
    988798                return rc;
    989799
    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,
    991801            (void *) "6", &calc.btn_6);
    992802        if (rc != EOK)
    993803                return rc;
    994804
    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,
    996806            (void *) "*", &calc.btn_mul);
    997807        if (rc != EOK)
    998808                return rc;
    999809
    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,
    1001811            (void *) "1", &calc.btn_1);
    1002812        if (rc != EOK)
    1003813                return rc;
    1004814
    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,
    1006816            (void *) "2", &calc.btn_2);
    1007817        if (rc != EOK)
    1008818                return rc;
    1009819
    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,
    1011821            (void *) "3", &calc.btn_3);
    1012822        if (rc != EOK)
    1013823                return rc;
    1014824
    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,
    1016826            (void *) "-", &calc.btn_sub);
    1017827        if (rc != EOK)
    1018828                return rc;
    1019829
    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,
    1021831            (void *) "0", &calc.btn_0);
    1022832        if (rc != EOK)
    1023833                return rc;
    1024834
    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,
    1026836            (void *) "C", &calc.btn_clear);
    1027837        if (rc != EOK)
    1028838                return rc;
    1029839
    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,
    1031841            (void *) "=", &calc.btn_eval);
    1032842        if (rc != EOK)
    1033843                return rc;
    1034844
    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,
    1036846            (void *) "+", &calc.btn_add);
    1037847        if (rc != EOK)
Note: See TracChangeset for help on using the changeset viewer.