Ignore:
File:
1 edited

Legend:

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

    rfeeac0d rf9f45e7  
    143143static LIST_INITIALIZE(viewport_list);
    144144
     145static FIBRIL_MUTEX_INITIALIZE(discovery_mtx);
     146
    145147/** Input server proxy */
    146148static input_t *input;
     
    21142116}
    21152117
     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
    21162172static int compositor_srv_init(char *input_svc, char *name)
    21172173{
     
    21652221        }
    21662222
    2167         /* Create viewports and connect them to visualizers. */
    2168         category_id_t cat_id;
    2169         rc = loc_category_get_id("visualizer", &cat_id, IPC_FLAG_BLOCKING);
     2223        rc = loc_register_cat_change_cb(category_change_cb);
    21702224        if (rc != EOK) {
    2171                 printf("%s: Failed to get visualizer category.\n", NAME);
     2225                printf("%s: Failed to register category change callback\n", NAME);
    21722226                input_disconnect();
    2173                 return -1;
    2174         }
    2175        
    2176         service_id_t *svcs;
    2177         size_t svcs_cnt = 0;
    2178         rc = loc_category_get_svcs(cat_id, &svcs, &svcs_cnt);
    2179         if (rc != EOK || svcs_cnt == 0) {
    2180                 printf("%s: Failed to get visualizer category services.\n", NAME);
     2227                return rc;
     2228        }       
     2229
     2230        rc = discover_viewports();
     2231        if (rc != EOK) {
    21812232                input_disconnect();
    2182                 return -1;
    2183         }
    2184        
    2185         for (size_t i = 0; i < svcs_cnt; ++i) {
    2186                 char *svc_name;
    2187                 rc = loc_service_get_name(svcs[i], &svc_name);
    2188                 if (rc == EOK) {
    2189                         viewport_t *vp = viewport_create(svc_name);
    2190                         if (vp != NULL) {
    2191                                 list_append(&vp->link, &viewport_list);
    2192                         }
    2193                 }
     2233                return rc;
    21942234        }
    21952235       
     
    22032243        comp_damage(0, 0, UINT32_MAX, UINT32_MAX);
    22042244       
     2245       
    22052246        return EOK;
    22062247}
Note: See TracChangeset for help on using the changeset viewer.