Changes in uspace/srv/hid/compositor/compositor.c [071fefec:8e4a408] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/compositor/compositor.c
r071fefec r8e4a408 55 55 #include <async.h> 56 56 #include <loc.h> 57 #include <devman.h>58 57 59 58 #include <event.h> 60 #include <graph_iface.h>61 59 #include <io/keycode.h> 62 60 #include <io/mode.h> … … 1149 1147 } 1150 1148 1151 static async_sess_t *vsl_connect( const char *svc)1149 static async_sess_t *vsl_connect(service_id_t sid, const char *svc) 1152 1150 { 1153 1151 int rc; 1154 1152 async_sess_t *sess; 1155 service_id_t dsid; 1156 devman_handle_t handle; 1157 1158 rc = loc_service_get_id(svc, &dsid, 0); 1159 if (rc != EOK) { 1153 1154 sess = loc_service_connect(EXCHANGE_SERIALIZE, sid, 0); 1155 if (sess == NULL) { 1156 printf("%s: Unable to connect to visualizer %s\n", NAME, svc); 1160 1157 return NULL; 1161 1158 } 1162 1159 1163 rc = devman_fun_sid_to_handle(dsid, &handle);1164 if (rc == EOK) {1165 sess = devman_device_connect(EXCHANGE_SERIALIZE, handle, 0);1166 if (sess == NULL) {1167 printf("%s: Unable to connect to visualizer %s\n", NAME, svc);1168 return NULL;1169 }1170 rc = graph_dev_connect(sess);1171 if (rc != EOK) {1172 return NULL;1173 }1174 } else if (rc == ENOENT) {1175 sess = loc_service_connect(EXCHANGE_SERIALIZE, dsid, 0);1176 if (sess == NULL) {1177 printf("%s: Unable to connect to visualizer %s\n", NAME, svc);1178 return NULL;1179 }1180 } else {1181 return NULL;1182 }1183 1184 1160 async_exch_t *exch = async_exchange_begin(sess); 1185 rc = async_connect_to_me(exch, dsid, 0, 0, vsl_notifications, NULL);1161 rc = async_connect_to_me(exch, sid, 0, 0, vsl_notifications, NULL); 1186 1162 async_exchange_end(exch); 1187 1163 … … 1196 1172 } 1197 1173 1198 static viewport_t *viewport_create( const char *vsl_name)1174 static viewport_t *viewport_create(service_id_t sid) 1199 1175 { 1200 1176 int rc; 1201 1202 viewport_t *vp = (viewport_t *) malloc(sizeof(viewport_t)); 1203 if (!vp) { 1204 return NULL; 1205 } 1177 char *vsl_name = NULL; 1178 viewport_t *vp = NULL; 1179 bool claimed = false; 1180 1181 rc = loc_service_get_name(sid, &vsl_name); 1182 if (rc != EOK) 1183 goto error; 1184 1185 vp = (viewport_t *) calloc(1, sizeof(viewport_t)); 1186 if (!vp) 1187 goto error; 1206 1188 1207 1189 link_initialize(&vp->link); … … 1210 1192 1211 1193 /* Establish output bidirectional connection. */ 1212 vp->sess = vsl_connect(vsl_name); 1213 rc = loc_service_get_id(vsl_name, &vp->dsid, 0); 1214 if (vp->sess == NULL || rc != EOK) { 1215 free(vp); 1216 return NULL; 1217 } 1194 vp->dsid = sid; 1195 vp->sess = vsl_connect(sid, vsl_name); 1196 if (vp->sess == NULL) 1197 goto error; 1218 1198 1219 1199 /* Claim the given visualizer. */ 1220 1200 rc = visualizer_claim(vp->sess, 0); 1221 1201 if (rc != EOK) { 1222 async_hangup(vp->sess);1223 free(vp);1224 1202 printf("%s: Unable to claim visualizer (%s)\n", NAME, str_error(rc)); 1225 return NULL; 1226 } 1203 goto error; 1204 } 1205 1206 claimed = true; 1227 1207 1228 1208 /* Retrieve the default mode. */ 1229 1209 rc = visualizer_get_default_mode(vp->sess, &vp->mode); 1230 1210 if (rc != EOK) { 1231 visualizer_yield(vp->sess);1232 async_hangup(vp->sess);1233 free(vp);1234 1211 printf("%s: Unable to retrieve mode (%s)\n", NAME, str_error(rc)); 1235 return NULL;1212 goto error; 1236 1213 } 1237 1214 … … 1240 1217 NULL, SURFACE_FLAG_SHARED); 1241 1218 if (vp->surface == NULL) { 1242 visualizer_yield(vp->sess);1243 async_hangup(vp->sess);1244 free(vp);1245 1219 printf("%s: Unable to create surface (%s)\n", NAME, str_error(rc)); 1246 return NULL;1220 goto error; 1247 1221 } 1248 1222 … … 1251 1225 vp->mode.index, vp->mode.version, surface_direct_access(vp->surface)); 1252 1226 if (rc != EOK) { 1227 printf("%s: Unable to set mode (%s)\n", NAME, str_error(rc)); 1228 goto error; 1229 } 1230 1231 return vp; 1232 error: 1233 if (claimed) 1253 1234 visualizer_yield(vp->sess); 1254 surface_destroy(vp->surface);1235 if (vp->sess != NULL) 1255 1236 async_hangup(vp->sess); 1256 free(vp); 1257 printf("%s: Unable to set mode (%s)\n", NAME, str_error(rc)); 1258 return NULL; 1259 } 1260 1261 return vp; 1237 free(vp); 1238 free(vsl_name); 1239 return NULL; 1262 1240 } 1263 1241 … … 2190 2168 continue; 2191 2169 2192 char *svc_name; 2193 rc = loc_service_get_name(svcs[i], &svc_name); 2194 if (rc == EOK) { 2195 viewport_t *vp = viewport_create(svc_name); 2196 if (vp != NULL) { 2197 list_append(&vp->link, &viewport_list); 2198 } 2199 } 2170 viewport_t *vp = viewport_create(svcs[i]); 2171 if (vp != NULL) 2172 list_append(&vp->link, &viewport_list); 2200 2173 } 2201 2174 fibril_mutex_unlock(&viewport_list_mtx);
Note:
See TracChangeset
for help on using the changeset viewer.