Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/shutdown-dlg/shutdown-dlg.c

    r97116a2 r0d00e53  
    11/*
    2  * Copyright (c) 2025 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4141#include <ui/fixed.h>
    4242#include <ui/label.h>
    43 #include <ui/msgdialog.h>
    4443#include <ui/resource.h>
    4544#include <ui/ui.h>
     
    4948static void wnd_close(ui_window_t *, void *);
    5049static errno_t bg_wnd_paint(ui_window_t *, void *);
    51 static void shutdown_progress_destroy(shutdown_progress_t *);
    52 static errno_t shutdown_confirm_msg_create(shutdown_dlg_t *);
    53 static errno_t shutdown_failed_msg_create(shutdown_dlg_t *);
    54 static errno_t shutdown_start(shutdown_dlg_t *);
    5550
    5651static ui_window_cb_t bg_window_cb = {
     
    6964        .shutdown_complete = sd_shutdown_complete,
    7065        .shutdown_failed = sd_shutdown_failed
    71 };
    72 
    73 static void shutdown_confirm_msg_button(ui_msg_dialog_t *, void *, unsigned);
    74 static void shutdown_confirm_msg_close(ui_msg_dialog_t *, void *);
    75 
    76 static ui_msg_dialog_cb_t shutdown_confirm_msg_cb = {
    77         .button = shutdown_confirm_msg_button,
    78         .close = shutdown_confirm_msg_close
    79 };
    80 
    81 static void shutdown_failed_msg_button(ui_msg_dialog_t *, void *, unsigned);
    82 static void shutdown_failed_msg_close(ui_msg_dialog_t *, void *);
    83 
    84 static ui_msg_dialog_cb_t shutdown_failed_msg_cb = {
    85         .button = shutdown_failed_msg_button,
    86         .close = shutdown_failed_msg_close
    8766};
    8867
     
    11190
    11291        ui_lock(sddlg->ui);
    113         shutdown_progress_destroy(sddlg->progress);
    114         sddlg->progress = NULL;
    115         ui_window_destroy(sddlg->bgwindow);
    116         sddlg->bgwindow = NULL;
    117         (void)shutdown_failed_msg_create(sddlg);
     92        (void)ui_label_set_text(sddlg->progress->label, "Shutdown failed.");
     93        (void)ui_window_paint(sddlg->progress->window);
    11894        ui_unlock(sddlg->ui);
    11995}
     
    159135
    160136        return EOK;
    161 }
    162 
    163 /** Create shutdown confirmation dialog.
    164  *
    165  * @param sddlg Shutdown dialog
    166  * @return EOK on success or an error code
    167  */
    168 static errno_t shutdown_confirm_msg_create(shutdown_dlg_t *sddlg)
    169 {
    170         ui_msg_dialog_params_t params;
    171         ui_msg_dialog_t *dialog;
    172         errno_t rc;
    173 
    174         ui_msg_dialog_params_init(&params);
    175         params.caption = "Shutdown";
    176         params.text = "Do you want to shut the system down?";
    177         params.choice = umdc_ok_cancel;
    178         params.flags |= umdf_topmost | umdf_center;
    179 
    180         rc = ui_msg_dialog_create(sddlg->ui, &params, &dialog);
    181         if (rc != EOK)
    182                 return rc;
    183 
    184         ui_msg_dialog_set_cb(dialog, &shutdown_confirm_msg_cb, sddlg);
    185 
    186         return EOK;
    187 }
    188 
    189 /** Create 'shutdown failed' message dialog.
    190  *
    191  * @param sddlg Shutdown dialog
    192  * @return EOK on success or an error code
    193  */
    194 static errno_t shutdown_failed_msg_create(shutdown_dlg_t *sddlg)
    195 {
    196         ui_msg_dialog_params_t params;
    197         ui_msg_dialog_t *dialog;
    198         errno_t rc;
    199 
    200         ui_msg_dialog_params_init(&params);
    201         params.caption = "Shutdown failed";
    202         params.text = "The system failed to shut down properly.";
    203 
    204         rc = ui_msg_dialog_create(sddlg->ui, &params, &dialog);
    205         if (rc != EOK)
    206                 return rc;
    207 
    208         ui_msg_dialog_set_cb(dialog, &shutdown_failed_msg_cb, sddlg);
    209 
    210         return EOK;
    211 }
    212 
    213 /** Shutdown confirm message dialog button press.
    214  *
    215  * @param dialog Message dialog
    216  * @param arg Argument (ui_demo_t *)
    217  * @param bnum Button number
    218  */
    219 static void shutdown_confirm_msg_button(ui_msg_dialog_t *dialog,
    220     void *arg, unsigned bnum)
    221 {
    222         shutdown_dlg_t *sddlg = (shutdown_dlg_t *) arg;
    223 
    224         ui_msg_dialog_destroy(dialog);
    225 
    226         if (bnum == 0)
    227                 shutdown_start(sddlg);
    228         else
    229                 ui_quit(sddlg->ui);
    230 }
    231 
    232 /** Shutdown confirm message dialog close request.
    233  *
    234  * @param dialog Message dialog
    235  * @param arg Argument (ui_demo_t *)
    236  */
    237 static void shutdown_confirm_msg_close(ui_msg_dialog_t *dialog, void *arg)
    238 {
    239         shutdown_dlg_t *sddlg = (shutdown_dlg_t *) arg;
    240 
    241         ui_msg_dialog_destroy(dialog);
    242         ui_quit(sddlg->ui);
    243 }
    244 
    245 /** Shutdown faield message dialog button press.
    246  *
    247  * @param dialog Message dialog
    248  * @param arg Argument (ui_demo_t *)
    249  * @param bnum Button number
    250  */
    251 static void shutdown_failed_msg_button(ui_msg_dialog_t *dialog,
    252     void *arg, unsigned bnum)
    253 {
    254         shutdown_dlg_t *sddlg = (shutdown_dlg_t *) arg;
    255 
    256         ui_msg_dialog_destroy(dialog);
    257         ui_quit(sddlg->ui);
    258 }
    259 
    260 /** Shutdown failed message dialog close request.
    261  *
    262  * @param dialog Message dialog
    263  * @param arg Argument (ui_demo_t *)
    264  */
    265 static void shutdown_failed_msg_close(ui_msg_dialog_t *dialog, void *arg)
    266 {
    267         shutdown_dlg_t *sddlg = (shutdown_dlg_t *) arg;
    268 
    269         ui_msg_dialog_destroy(dialog);
    270         ui_quit(sddlg->ui);
    271137}
    272138
     
    296162                params.rect.p0.x = 0;
    297163                params.rect.p0.y = 0;
    298                 params.rect.p1.x = 64;
     164                params.rect.p1.x = 24;
    299165                params.rect.p1.y = 5;
    300166        } else {
     
    379245static void shutdown_progress_destroy(shutdown_progress_t *progress)
    380246{
    381         if (progress == NULL)
    382                 return;
    383 
    384247        ui_window_destroy(progress->window);
    385248        free(progress);
    386249}
    387250
    388 static errno_t shutdown_start(shutdown_dlg_t *sddlg)
    389 {
    390         errno_t rc;
    391 
    392         rc = shutdown_progress_create(sddlg, &sddlg->progress);
    393         if (rc != EOK)
    394                 return rc;
    395 
    396         rc = system_open(SYSTEM_DEFAULT, &sd_system_cb, sddlg, &sddlg->system);
    397         if (rc != EOK) {
    398                 printf("Failed opening system control service.\n");
    399                 goto error;
    400         }
    401 
    402         rc = system_shutdown(sddlg->system);
    403         if (rc != EOK) {
    404                 printf("Failed requesting system shutdown.\n");
    405                 goto error;
    406         }
    407 
    408         return EOK;
    409 error:
    410         return rc;
    411 }
    412 
    413251/** Run shutdown dialog on display. */
    414252static errno_t shutdown_dlg(const char *display_spec)
    415253{
    416254        ui_t *ui = NULL;
     255        ui_wnd_params_t params;
     256        ui_window_t *window = NULL;
    417257        shutdown_dlg_t sddlg;
    418         ui_wnd_params_t params;
    419258        errno_t rc;
    420259
     
    426265                goto error;
    427266        }
    428 
    429         sddlg.ui = ui;
    430267
    431268        ui_wnd_params_init(&params);
     
    434271        params.placement = ui_wnd_place_full_screen;
    435272        params.flags |= ui_wndf_topmost | ui_wndf_nofocus;
    436         /*
    437          * params.rect.p0.x = 0;
    438          * params.rect.p0.y = 0;
    439          * params.rect.p1.x = 1;
    440          * params.rect.p1.y = 1;
    441          */
    442 
    443         rc = ui_window_create(sddlg.ui, &params, &sddlg.bgwindow);
     273        if (ui_is_textmode(ui)) {
     274                params.rect.p0.x = 0;
     275                params.rect.p0.y = 0;
     276                params.rect.p1.x = 24;
     277                params.rect.p1.y = 5;
     278        } else {
     279                params.rect.p0.x = 0;
     280                params.rect.p0.y = 0;
     281                params.rect.p1.x = 300;
     282                params.rect.p1.y = 60;
     283        }
     284
     285        sddlg.ui = ui;
     286
     287        rc = ui_window_create(ui, &params, &window);
    444288        if (rc != EOK) {
    445289                printf("Error creating window.\n");
     
    447291        }
    448292
    449         ui_window_set_cb(sddlg.bgwindow, &bg_window_cb, (void *)&sddlg);
    450 
    451         if (ui_is_textmode(sddlg.ui)) {
    452                 rc = gfx_color_new_ega(0x17, &sddlg.bg_color);
    453                 if (rc != EOK) {
    454                         printf("Error allocating color.\n");
    455                         goto error;
    456                 }
    457         } else {
    458                 rc = gfx_color_new_rgb_i16(0x8000, 0xc800, 0xffff, &sddlg.bg_color);
    459                 if (rc != EOK) {
    460                         printf("Error allocating color.\n");
    461                         goto error;
    462                 }
    463         }
    464 
    465         rc = ui_window_paint(sddlg.bgwindow);
     293        ui_window_set_cb(window, &bg_window_cb, (void *) &sddlg);
     294        sddlg.bgwindow = window;
     295
     296        rc = gfx_color_new_rgb_i16(0x8000, 0xc800, 0xffff, &sddlg.bg_color);
     297        if (rc != EOK) {
     298                printf("Error allocating color.\n");
     299                goto error;
     300        }
     301
     302        rc = ui_window_paint(window);
    466303        if (rc != EOK) {
    467304                printf("Error painting window.\n");
     
    469306        }
    470307
    471         (void)shutdown_confirm_msg_create(&sddlg);
     308        rc = shutdown_progress_create(&sddlg, &sddlg.progress);
     309        if (rc != EOK)
     310                return rc;
     311
     312        rc = system_open(SYSTEM_DEFAULT, &sd_system_cb, &sddlg, &sddlg.system);
     313        if (rc != EOK) {
     314                printf("Failed opening system control service.\n");
     315                goto error;
     316        }
     317
     318        rc = system_shutdown(sddlg.system);
     319        if (rc != EOK) {
     320                printf("Failed requesting system shutdown.\n");
     321                goto error;
     322        }
    472323
    473324        ui_run(ui);
    474325
    475326        shutdown_progress_destroy(sddlg.progress);
    476         if (sddlg.bgwindow != NULL)
    477                 ui_window_destroy(sddlg.bgwindow);
    478         if (sddlg.system != NULL)
    479                 system_close(sddlg.system);
     327        ui_window_destroy(window);
     328        system_close(sddlg.system);
    480329        gfx_color_delete(sddlg.bg_color);
    481330        ui_destroy(ui);
     
    487336        if (sddlg.bg_color != NULL)
    488337                gfx_color_delete(sddlg.bg_color);
    489         if (sddlg.bgwindow != NULL)
    490                 ui_window_destroy(sddlg.bgwindow);
     338        if (window != NULL)
     339                ui_window_destroy(window);
    491340        if (ui != NULL)
    492341                ui_destroy(ui);
Note: See TracChangeset for help on using the changeset viewer.