Changeset 7cc30e9 in mainline for uspace/lib/display/src


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.

Location:
uspace/lib/display/src
Files:
2 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:
  • uspace/lib/display/src/display.c

    r7a05d924 r7cc30e9  
    3838#include <mem.h>
    3939#include <stdlib.h>
     40#include <str.h>
    4041#include "../private/display.h"
    4142#include "../private/params.h"
     
    147148{
    148149        memset(params, 0, sizeof(*params));
     150        params->caption = "";
    149151}
    150152
     
    162164{
    163165        display_window_t *window;
    164         async_exch_t *exch;
    165         aid_t req;
    166         ipc_call_t answer;
    167         errno_t rc;
     166        display_wnd_params_enc_t eparams;
     167        async_exch_t *exch;
     168        aid_t req;
     169        ipc_call_t answer;
     170        errno_t rc;
     171
     172        /* Encode the parameters for transport */
     173        eparams.rect = params->rect;
     174        eparams.caption_size = str_size(params->caption);
     175        eparams.min_size = params->min_size;
     176        eparams.pos = params->pos;
     177        eparams.flags = params->flags;
    168178
    169179        window = calloc(1, sizeof(display_window_t));
     
    173183        exch = async_exchange_begin(display->sess);
    174184        req = async_send_0(exch, DISPLAY_WINDOW_CREATE, &answer);
    175         rc = async_data_write_start(exch, params, sizeof (display_wnd_params_t));
     185
     186        /* Write fixed fields */
     187        rc = async_data_write_start(exch, &eparams,
     188            sizeof (display_wnd_params_enc_t));
     189        if (rc != EOK) {
     190                async_exchange_end(exch);
     191                async_forget(req);
     192                free(window);
     193                return rc;
     194        }
     195
     196        /* Write caption */
     197        rc = async_data_write_start(exch, params->caption,
     198            eparams.caption_size);
    176199        async_exchange_end(exch);
    177200        if (rc != EOK) {
     
    540563            cursor);
    541564        async_exchange_end(exch);
     565        return rc;
     566}
     567
     568/** Set display window caption.
     569 *
     570 * @param window Window
     571 * @param caption New caption
     572 * @return EOK on success or an error code
     573 */
     574errno_t display_window_set_caption(display_window_t *window,
     575    const char *caption)
     576{
     577        async_exch_t *exch;
     578        aid_t req;
     579        ipc_call_t answer;
     580        size_t cap_size;
     581        errno_t rc;
     582
     583        cap_size = str_size(caption);
     584
     585        exch = async_exchange_begin(window->display->sess);
     586        req = async_send_1(exch, DISPLAY_WINDOW_SET_CAPTION, window->id,
     587            &answer);
     588
     589        /* Write caption */
     590        rc = async_data_write_start(exch, caption, cap_size);
     591        async_exchange_end(exch);
     592        if (rc != EOK) {
     593                async_forget(req);
     594                return rc;
     595        }
     596
     597        async_wait_for(req, &rc);
    542598        return rc;
    543599}
Note: See TracChangeset for help on using the changeset viewer.