Ignore:
File:
1 edited

Legend:

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

    r0d00e53 r97116a2  
    11/*
    2  * Copyright (c) 2024 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4141#include <ui/fixed.h>
    4242#include <ui/label.h>
     43#include <ui/msgdialog.h>
    4344#include <ui/resource.h>
    4445#include <ui/ui.h>
     
    4849static void wnd_close(ui_window_t *, void *);
    4950static errno_t bg_wnd_paint(ui_window_t *, void *);
     51static void shutdown_progress_destroy(shutdown_progress_t *);
     52static errno_t shutdown_confirm_msg_create(shutdown_dlg_t *);
     53static errno_t shutdown_failed_msg_create(shutdown_dlg_t *);
     54static errno_t shutdown_start(shutdown_dlg_t *);
    5055
    5156static ui_window_cb_t bg_window_cb = {
     
    6469        .shutdown_complete = sd_shutdown_complete,
    6570        .shutdown_failed = sd_shutdown_failed
     71};
     72
     73static void shutdown_confirm_msg_button(ui_msg_dialog_t *, void *, unsigned);
     74static void shutdown_confirm_msg_close(ui_msg_dialog_t *, void *);
     75
     76static ui_msg_dialog_cb_t shutdown_confirm_msg_cb = {
     77        .button = shutdown_confirm_msg_button,
     78        .close = shutdown_confirm_msg_close
     79};
     80
     81static void shutdown_failed_msg_button(ui_msg_dialog_t *, void *, unsigned);
     82static void shutdown_failed_msg_close(ui_msg_dialog_t *, void *);
     83
     84static ui_msg_dialog_cb_t shutdown_failed_msg_cb = {
     85        .button = shutdown_failed_msg_button,
     86        .close = shutdown_failed_msg_close
    6687};
    6788
     
    90111
    91112        ui_lock(sddlg->ui);
    92         (void)ui_label_set_text(sddlg->progress->label, "Shutdown failed.");
    93         (void)ui_window_paint(sddlg->progress->window);
     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);
    94118        ui_unlock(sddlg->ui);
    95119}
     
    135159
    136160        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 */
     168static 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 */
     194static 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 */
     219static 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 */
     237static 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 */
     251static 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 */
     265static 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);
    137271}
    138272
     
    162296                params.rect.p0.x = 0;
    163297                params.rect.p0.y = 0;
    164                 params.rect.p1.x = 24;
     298                params.rect.p1.x = 64;
    165299                params.rect.p1.y = 5;
    166300        } else {
     
    245379static void shutdown_progress_destroy(shutdown_progress_t *progress)
    246380{
     381        if (progress == NULL)
     382                return;
     383
    247384        ui_window_destroy(progress->window);
    248385        free(progress);
    249386}
    250387
     388static 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;
     409error:
     410        return rc;
     411}
     412
    251413/** Run shutdown dialog on display. */
    252414static errno_t shutdown_dlg(const char *display_spec)
    253415{
    254416        ui_t *ui = NULL;
     417        shutdown_dlg_t sddlg;
    255418        ui_wnd_params_t params;
    256         ui_window_t *window = NULL;
    257         shutdown_dlg_t sddlg;
    258419        errno_t rc;
    259420
     
    265426                goto error;
    266427        }
     428
     429        sddlg.ui = ui;
    267430
    268431        ui_wnd_params_init(&params);
     
    271434        params.placement = ui_wnd_place_full_screen;
    272435        params.flags |= ui_wndf_topmost | ui_wndf_nofocus;
    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;
     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);
     444        if (rc != EOK) {
     445                printf("Error creating window.\n");
     446                goto error;
     447        }
     448
     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                }
    278457        } 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);
    288         if (rc != EOK) {
    289                 printf("Error creating window.\n");
    290                 goto error;
    291         }
    292 
    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);
     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);
    303466        if (rc != EOK) {
    304467                printf("Error painting window.\n");
     
    306469        }
    307470
    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         }
     471        (void)shutdown_confirm_msg_create(&sddlg);
    323472
    324473        ui_run(ui);
    325474
    326475        shutdown_progress_destroy(sddlg.progress);
    327         ui_window_destroy(window);
    328         system_close(sddlg.system);
     476        if (sddlg.bgwindow != NULL)
     477                ui_window_destroy(sddlg.bgwindow);
     478        if (sddlg.system != NULL)
     479                system_close(sddlg.system);
    329480        gfx_color_delete(sddlg.bg_color);
    330481        ui_destroy(ui);
     
    336487        if (sddlg.bg_color != NULL)
    337488                gfx_color_delete(sddlg.bg_color);
    338         if (window != NULL)
    339                 ui_window_destroy(window);
     489        if (sddlg.bgwindow != NULL)
     490                ui_window_destroy(sddlg.bgwindow);
    340491        if (ui != NULL)
    341492                ui_destroy(ui);
Note: See TracChangeset for help on using the changeset viewer.