Changeset 7cc30e9 in mainline for uspace/lib/display/src/disp_srv.c


Ignore:
Timestamp:
2022-10-24T17:50:46Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
913add60
Parents:
7a05d924
Message:

Display server needs to store window caption

Even though it does not use it itself, it needs to provide it to
window managers (e.g. Task bar). We need to be able to set caption
for a new window and to change it for an existing window.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/display/src/disp_srv.c

    r7a05d924 r7cc30e9  
    6363        sysarg_t wnd_id;
    6464        ipc_call_t call;
     65        display_wnd_params_enc_t eparams;
    6566        display_wnd_params_t params;
     67        char *caption;
    6668        size_t size;
    6769        errno_t rc;
     
    7375        }
    7476
    75         if (size != sizeof(display_wnd_params_t)) {
    76                 async_answer_0(&call, EINVAL);
    77                 async_answer_0(icall, EINVAL);
    78                 return;
    79         }
    80 
    81         rc = async_data_write_finalize(&call, &params, size);
    82         if (rc != EOK) {
     77        if (size != sizeof(display_wnd_params_enc_t)) {
     78                async_answer_0(&call, EINVAL);
     79                async_answer_0(icall, EINVAL);
     80                return;
     81        }
     82
     83        rc = async_data_write_finalize(&call, &eparams, size);
     84        if (rc != EOK) {
     85                async_answer_0(&call, rc);
     86                async_answer_0(icall, rc);
     87                return;
     88        }
     89
     90        caption = calloc(eparams.caption_size + 1, 1);
     91        if (caption == NULL) {
     92                async_answer_0(icall, ENOMEM);
     93                return;
     94        }
     95
     96        if (!async_data_write_receive(&call, &size)) {
     97                free(caption);
     98                async_answer_0(&call, EREFUSED);
     99                async_answer_0(icall, EREFUSED);
     100                return;
     101        }
     102
     103        if (size != eparams.caption_size) {
     104                free(caption);
     105                async_answer_0(&call, EINVAL);
     106                async_answer_0(icall, EINVAL);
     107                return;
     108        }
     109
     110        rc = async_data_write_finalize(&call, caption, eparams.caption_size);
     111        if (rc != EOK) {
     112                free(caption);
    83113                async_answer_0(&call, rc);
    84114                async_answer_0(icall, rc);
     
    87117
    88118        if (srv->ops->window_create == NULL) {
    89                 async_answer_0(icall, ENOTSUP);
    90                 return;
    91         }
     119                free(caption);
     120                async_answer_0(icall, ENOTSUP);
     121                return;
     122        }
     123
     124        /* Decode the parameters from transport */
     125        params.rect = eparams.rect;
     126        params.caption = caption;
     127        params.min_size = eparams.min_size;
     128        params.pos = eparams.pos;
     129        params.flags = eparams.flags;
    92130
    93131        rc = srv->ops->window_create(srv->arg, &params, &wnd_id);
     
    401439        rc = srv->ops->window_set_cursor(srv->arg, wnd_id, cursor);
    402440        async_answer_0(icall, rc);
     441}
     442
     443static void display_window_set_caption_srv(display_srv_t *srv,
     444    ipc_call_t *icall)
     445{
     446        sysarg_t wnd_id;
     447        ipc_call_t call;
     448        char *caption;
     449        size_t size;
     450        errno_t rc;
     451
     452        wnd_id = ipc_get_arg1(icall);
     453
     454        if (!async_data_write_receive(&call, &size)) {
     455                async_answer_0(&call, EREFUSED);
     456                async_answer_0(icall, EREFUSED);
     457                return;
     458        }
     459
     460        caption = calloc(size + 1, 1);
     461        if (caption == NULL) {
     462                async_answer_0(&call, ENOMEM);
     463                async_answer_0(icall, ENOMEM);
     464                return;
     465        }
     466
     467        rc = async_data_write_finalize(&call, caption, size);
     468        if (rc != EOK) {
     469                free(caption);
     470                async_answer_0(&call, rc);
     471                async_answer_0(icall, rc);
     472                return;
     473        }
     474
     475        if (srv->ops->window_set_caption == NULL) {
     476                free(caption);
     477                async_answer_0(icall, ENOTSUP);
     478                return;
     479        }
     480
     481        rc = srv->ops->window_set_caption(srv->arg, wnd_id, caption);
     482        async_answer_0(icall, rc);
     483        free(caption);
    403484}
    404485
     
    538619                case DISPLAY_WINDOW_SET_CURSOR:
    539620                        display_window_set_cursor_srv(srv, &call);
     621                        break;
     622                case DISPLAY_WINDOW_SET_CAPTION:
     623                        display_window_set_caption_srv(srv, &call);
    540624                        break;
    541625                case DISPLAY_GET_EVENT:
Note: See TracChangeset for help on using the changeset viewer.