Changes in uspace/app/vlaunch/vlaunch.c [1c635d6:62fbb7e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/vlaunch/vlaunch.c
r1c635d6 r62fbb7e 41 41 #include <str.h> 42 42 #include <str_error.h> 43 #include <loc.h>44 #include <fibril_synch.h>45 #include <io/pixel.h>46 #include <device/led_dev.h>47 43 48 44 #include <window.h> … … 64 60 #define LOGO_HEIGHT 66 65 61 66 #define PERIOD 100000067 #define COLORS 768 69 62 static char *winreg = NULL; 70 static fibril_timer_t *timer = NULL;71 static list_t led_devs;72 73 static pixel_t colors[COLORS] = {74 PIXEL(0xff, 0xff, 0x00, 0x00),75 PIXEL(0xff, 0x00, 0xff, 0x00),76 PIXEL(0xff, 0x00, 0x00, 0xff),77 PIXEL(0xff, 0xff, 0xff, 0x00),78 PIXEL(0xff, 0xff, 0x00, 0xff),79 PIXEL(0xff, 0x00, 0xff, 0xff),80 PIXEL(0xff, 0xff, 0xff, 0xff)81 };82 83 static unsigned int color = 0;84 85 typedef struct {86 link_t link;87 service_id_t svc_id;88 async_sess_t *sess;89 } led_dev_t;90 63 91 64 static int app_launch(const char *app) 92 65 { 66 int rc; 93 67 printf("%s: Spawning %s %s \n", NAME, app, winreg); 94 68 95 69 task_id_t id; 96 task_wait_t wait; 97 int rc = task_spawnl(&id, &wait, app, app, winreg, NULL); 70 task_exit_t texit; 71 int retval; 72 rc = task_spawnl(&id, app, app, winreg, NULL); 98 73 if (rc != EOK) { 99 74 printf("%s: Error spawning %s %s (%s)\n", NAME, app, … … 101 76 return -1; 102 77 } 103 104 task_exit_t texit; 105 int retval; 106 rc = task_wait(&wait, &texit, &retval); 107 if ((rc != EOK) || (texit != TASK_EXIT_NORMAL)) { 78 rc = task_wait(id, &texit, &retval); 79 if (rc != EOK || texit != TASK_EXIT_NORMAL) { 108 80 printf("%s: Error retrieving retval from %s (%s)\n", NAME, 109 81 app, str_error(rc)); 110 82 return -1; 111 83 } 112 84 113 85 return retval; 114 86 } … … 129 101 } 130 102 131 static void timer_callback(void *data)132 {133 pixel_t next_color = colors[color];134 135 color++;136 if (color >= COLORS)137 color = 0;138 139 list_foreach(led_devs, link, led_dev_t, dev) {140 if (dev->sess)141 led_dev_color_set(dev->sess, next_color);142 }143 144 fibril_timer_set(timer, PERIOD, timer_callback, NULL);145 }146 147 static void loc_callback(void)148 {149 category_id_t led_cat;150 int rc = loc_category_get_id("led", &led_cat, IPC_FLAG_BLOCKING);151 if (rc != EOK)152 return;153 154 service_id_t *svcs;155 size_t count;156 rc = loc_category_get_svcs(led_cat, &svcs, &count);157 if (rc != EOK)158 return;159 160 for (size_t i = 0; i < count; i++) {161 bool known = false;162 163 /* Determine whether we already know this device. */164 list_foreach(led_devs, link, led_dev_t, dev) {165 if (dev->svc_id == svcs[i]) {166 known = true;167 break;168 }169 }170 171 if (!known) {172 led_dev_t *dev = (led_dev_t *) calloc(1, sizeof(led_dev_t));173 if (!dev)174 continue;175 176 link_initialize(&dev->link);177 dev->svc_id = svcs[i];178 dev->sess = loc_service_connect(EXCHANGE_SERIALIZE, svcs[i], 0);179 180 list_append(&dev->link, &led_devs);181 }182 }183 184 // FIXME: Handle LED device removal185 186 free(svcs);187 }188 189 103 int main(int argc, char *argv[]) 190 104 { 191 105 if (argc < 2) { 192 106 printf("Compositor server not specified.\n"); 193 return 1;194 }195 196 list_initialize(&led_devs);197 int rc = loc_register_cat_change_cb(loc_callback);198 if (rc != EOK) {199 printf("Unable to register callback for device discovery.\n");200 return 1;201 }202 203 timer = fibril_timer_create(NULL);204 if (!timer) {205 printf("Unable to create timer.\n");206 107 return 1; 207 108 } … … 262 163 window_exec(main_window); 263 164 264 fibril_timer_set(timer, PERIOD, timer_callback, NULL);265 266 165 task_retval(0); 267 166 async_manager();
Note:
See TracChangeset
for help on using the changeset viewer.