Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/compositor/compositor.c

    r3b98311 rfbb2d0d  
    143143static LIST_INITIALIZE(viewport_list);
    144144
     145static FIBRIL_MUTEX_INITIALIZE(discovery_mtx);
     146
    145147/** Input server proxy */
    146148static input_t *input;
     
    335337        }
    336338
    337         list_foreach(viewport_list, link) {
    338                 viewport_t *vp = list_get_instance(link, viewport_t, link);
     339        list_foreach(viewport_list, link, viewport_t, vp) {
    339340                sysarg_t w_vp, h_vp;
    340341                surface_get_resolution(vp->surface, &w_vp, &h_vp);
     
    354355        fibril_mutex_lock(&pointer_list_mtx);
    355356
    356         list_foreach(pointer_list, link) {
    357                 pointer_t *ptr = list_get_instance(link, pointer_t, link);
     357        list_foreach(pointer_list, link, pointer_t, ptr) {
    358358                ptr->pos.x = ptr->pos.x > viewport_bound_rect.x ? ptr->pos.x : viewport_bound_rect.x;
    359359                ptr->pos.y = ptr->pos.y > viewport_bound_rect.y ? ptr->pos.y : viewport_bound_rect.y;
     
    374374        fibril_mutex_lock(&pointer_list_mtx);
    375375
    376         list_foreach(viewport_list, link) {
    377 
     376        list_foreach(viewport_list, link, viewport_t, vp) {
    378377                /* Determine what part of the viewport must be updated. */
    379                 viewport_t *vp = list_get_instance(link, viewport_t, link);
    380378                sysarg_t x_dmg_vp, y_dmg_vp, w_dmg_vp, h_dmg_vp;
    381379                surface_get_resolution(vp->surface, &w_dmg_vp, &h_dmg_vp);
     
    446444                        }
    447445
    448                         list_foreach(pointer_list, link) {
    449 
    450                                 pointer_t *ptr = list_get_instance(link, pointer_t, link);
     446                        list_foreach(pointer_list, link, pointer_t, ptr) {
    451447                                if (ptr->ghost.surface) {
    452448
     
    522518                        }
    523519
    524                         list_foreach(pointer_list, link) {
     520                        list_foreach(pointer_list, link, pointer_t, ptr) {
    525521
    526522                                /* Determine what part of the pointer intersects with the
    527523                                 * updated area of the current viewport. */
    528                                 pointer_t *ptr = list_get_instance(link, pointer_t, link);
    529524                                sysarg_t x_dmg_ptr, y_dmg_ptr, w_dmg_ptr, h_dmg_ptr;
    530525                                surface_t *sf_ptr = ptr->cursor.states[ptr->state];
     
    569564
    570565        /* Notify visualizers about updated regions. */
    571         list_foreach(viewport_list, link) {
    572                 viewport_t *vp = list_get_instance(link, viewport_t, link);
     566        list_foreach(viewport_list, link, viewport_t, vp) {
    573567                sysarg_t x_dmg_vp, y_dmg_vp, w_dmg_vp, h_dmg_vp;
    574568                surface_get_damaged_region(vp->surface, &x_dmg_vp, &y_dmg_vp, &w_dmg_vp, &h_dmg_vp);
     
    631625
    632626        fibril_mutex_lock(&pointer_list_mtx);
    633         list_foreach(pointer_list, link) {
    634                 pointer_t *pointer = list_get_instance(link, pointer_t, link);
     627        list_foreach(pointer_list, link, pointer_t, pointer) {
    635628                if (pointer->id == pos_id) {
    636629                        pointer->grab_flags = pointer->pressed ? grab_flags : GF_EMPTY;
     
    710703{
    711704        fibril_mutex_lock(&window_list_mtx);
    712         window_t *window = NULL;
    713         list_foreach(window_list, link) {
    714                 window = list_get_instance(link, window_t, link);
     705
     706        list_foreach(window_list, link, window_t, window) {
    715707                if (window == target) {
    716708                        prodcons_produce(&window->queue, &event->link);
    717                 }
    718         }
    719         if (!window) {
    720                 free(event);
    721         }
     709                        fibril_mutex_unlock(&window_list_mtx);
     710                        return;
     711                }
     712        }
     713
    722714        fibril_mutex_unlock(&window_list_mtx);
     715        free(event);
    723716}
    724717
     
    863856        window_t *win = NULL;
    864857        fibril_mutex_lock(&window_list_mtx);
    865         list_foreach(window_list, link) {
    866                 window_t *cur = list_get_instance(link, window_t, link);
     858        list_foreach(window_list, link, window_t, cur) {
    867859                if (cur->in_dsid == service_id || cur->out_dsid == service_id) {
    868860                        win = cur;
     
    1007999                /* Close all clients and their windows. */
    10081000                fibril_mutex_lock(&window_list_mtx);
    1009                 list_foreach(window_list, link) {
    1010                         window_t *win = list_get_instance(link, window_t, link);
     1001                list_foreach(window_list, link, window_t, win) {
    10111002                        window_event_t *event = (window_event_t *) malloc(sizeof(window_event_t));
    10121003                        if (event) {
     
    10341025        viewport_t *vp = NULL;
    10351026        fibril_mutex_lock(&viewport_list_mtx);
    1036         list_foreach(viewport_list, link) {
    1037                 viewport_t *cur = list_get_instance(link, viewport_t, link);
     1027        list_foreach(viewport_list, link, viewport_t, cur) {
    10381028                if (cur->dsid == (service_id_t) IPC_GET_ARG1(*icall)) {
    10391029                        vp = cur;
     
    15711561
    15721562        /* Determine the window which the mouse click belongs to. */
    1573         list_foreach(window_list, link) {
    1574                 win = list_get_instance(link, window_t, link);
     1563        list_foreach(window_list, link, window_t, cw) {
     1564                win = cw;
    15751565                if (win->surface) {
    15761566                        surface_get_resolution(win->surface, &width, &height);
     
    21262116}
    21272117
     2118static int discover_viewports(void)
     2119{
     2120        /* Create viewports and connect them to visualizers. */
     2121        category_id_t cat_id;
     2122        int rc = loc_category_get_id("visualizer", &cat_id, IPC_FLAG_BLOCKING);
     2123        if (rc != EOK) {
     2124                printf("%s: Failed to get visualizer category.\n", NAME);
     2125                return -1;
     2126        }
     2127       
     2128        service_id_t *svcs;
     2129        size_t svcs_cnt = 0;
     2130        rc = loc_category_get_svcs(cat_id, &svcs, &svcs_cnt);
     2131        if (rc != EOK || svcs_cnt == 0) {
     2132                printf("%s: Failed to get visualizer category services.\n", NAME);
     2133                return -1;
     2134        }
     2135
     2136        fibril_mutex_lock(&viewport_list_mtx); 
     2137        for (size_t i = 0; i < svcs_cnt; ++i) {
     2138                bool exists = false;
     2139                list_foreach(viewport_list, link, viewport_t, vp) {
     2140                        if (vp->dsid == svcs[i]) {
     2141                                exists = true;
     2142                                break;
     2143                        }
     2144                }
     2145               
     2146                if (exists)
     2147                        continue;
     2148               
     2149                char *svc_name;
     2150                rc = loc_service_get_name(svcs[i], &svc_name);
     2151                if (rc == EOK) {
     2152                        viewport_t *vp = viewport_create(svc_name);
     2153                        if (vp != NULL) {
     2154                                list_append(&vp->link, &viewport_list);
     2155                        }
     2156                }
     2157        }
     2158        fibril_mutex_unlock(&viewport_list_mtx);
     2159       
     2160        /* TODO damage only newly added viewports */
     2161        comp_damage(0, 0, UINT32_MAX, UINT32_MAX);
     2162        return EOK;
     2163}
     2164
     2165static void category_change_cb(void)
     2166{
     2167        fibril_mutex_lock(&discovery_mtx);
     2168        discover_viewports();
     2169        fibril_mutex_unlock(&discovery_mtx);
     2170}
     2171
    21282172static int compositor_srv_init(char *input_svc, char *name)
    21292173{
     
    21322176       
    21332177        /* Color of the viewport background. Must be opaque. */
    2134         bg_color = PIXEL(255, 75, 70, 75);
     2178        bg_color = PIXEL(255, 69, 51, 103);
    21352179       
    21362180        /* Register compositor server. */
     
    21722216        /* Establish input bidirectional connection. */
    21732217        rc = input_connect(input_svc);
    2174         if (rc != EOK)
     2218        if (rc != EOK) {
     2219                printf("%s: Failed to connect to input service.\n", NAME);
    21752220                return rc;
    2176 
    2177         /* Create viewports and connect them to visualizers. */
    2178         category_id_t cat_id;
    2179         rc = loc_category_get_id("visualizer", &cat_id, IPC_FLAG_BLOCKING);
     2221        }
     2222
     2223        rc = loc_register_cat_change_cb(category_change_cb);
     2224        if (rc != EOK) {
     2225                printf("%s: Failed to register category change callback\n", NAME);
     2226                input_disconnect();
     2227                return rc;
     2228        }       
     2229
     2230        rc = discover_viewports();
    21802231        if (rc != EOK) {
    21812232                input_disconnect();
    2182                 return -1;
    2183         }
    2184        
    2185         service_id_t *svcs;
    2186         size_t svcs_cnt = 0;
    2187         rc = loc_category_get_svcs(cat_id, &svcs, &svcs_cnt);
    2188         if (rc != EOK || svcs_cnt == 0) {
     2233                return rc;
     2234        }
     2235       
     2236        if (list_empty(&viewport_list)) {
     2237                printf("%s: Failed to get viewports.\n", NAME);
    21892238                input_disconnect();
    21902239                return -1;
    21912240        }
    2192        
    2193         for (size_t i = 0; i < svcs_cnt; ++i) {
    2194                 char *svc_name;
    2195                 rc = loc_service_get_name(svcs[i], &svc_name);
    2196                 if (rc == EOK) {
    2197                         viewport_t *vp = viewport_create(svc_name);
    2198                         if (vp != NULL) {
    2199                                 list_append(&vp->link, &viewport_list);
    2200                         }
    2201                 }
    2202         }
    2203        
    2204         if (list_empty(&viewport_list)) {
    2205                 input_disconnect();
    2206                 return -1;
    2207         }
    22082241
    22092242        comp_restrict_pointers();
    22102243        comp_damage(0, 0, UINT32_MAX, UINT32_MAX);
     2244       
    22112245       
    22122246        return EOK;
Note: See TracChangeset for help on using the changeset viewer.