Changeset 87a7cdb in mainline for uspace/srv/hid/display/output.c
- Timestamp:
- 2019-12-05T19:35:12Z (5 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 71cbe5c
- Parents:
- 973efd36
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/display/output.c
r973efd36 r87a7cdb 34 34 */ 35 35 36 #include <assert.h> 36 37 #include <errno.h> 37 #include <gfx/context.h> 38 #include <guigfx/canvas.h> 38 #include <fibril_synch.h> 39 39 #include <io/kbd_event.h> 40 40 #include <io/pos_event.h> 41 #include <loc.h> 41 42 #include <stdio.h> 42 43 #include <stdlib.h> 43 #include <window.h>44 #include "ddev.h" 44 45 #include "output.h" 45 46 47 #if 0 46 48 static void (*kbd_ev_handler)(void *, kbd_event_t *); 47 49 static void *kbd_ev_arg; … … 59 61 pos_ev_handler(pos_ev_arg, (pos_event_t *) data); 60 62 } 63 #endif 61 64 62 errno_t output_init(void (*kbd_event_handler)(void *, kbd_event_t *), 63 void *karg, void (*pos_event_handler)(void *, pos_event_t *), 64 void *parg, gfx_context_t **rgc) 65 /** Check for new display devices. 66 * 67 * @param output Display server output 68 */ 69 static errno_t ds_output_check_new_devs(ds_output_t *output) 65 70 { 66 canvas_gc_t *cgc = NULL; 67 window_t *window = NULL; 68 pixel_t *pixbuf = NULL; 69 surface_t *surface = NULL; 70 canvas_t *canvas = NULL; 71 gfx_coord_t vw, vh; 71 category_id_t ddev_cid; 72 service_id_t *svcs; 73 size_t count, i; 74 bool already_known; 75 ds_ddev_t *nddev; 72 76 errno_t rc; 73 77 74 printf("Init canvas..\n"); 75 kbd_ev_handler = kbd_event_handler; 76 kbd_ev_arg = karg; 78 assert(fibril_mutex_is_locked(&output->lock)); 77 79 78 pos_ev_handler = pos_event_handler; 79 pos_ev_arg = parg; 80 81 window = window_open("comp:0/winreg", NULL, 82 WINDOW_MAIN | WINDOW_DECORATED, "Display Server"); 83 if (window == NULL) { 84 printf("Error creating window.\n"); 85 return -1; 86 } 87 88 vw = 800; 89 vh = 600; 90 91 pixbuf = calloc(vw * vh, sizeof(pixel_t)); 92 if (pixbuf == NULL) { 93 printf("Error allocating memory for pixel buffer.\n"); 94 return ENOMEM; 95 } 96 97 surface = surface_create(vw, vh, pixbuf, 0); 98 if (surface == NULL) { 99 printf("Error creating surface.\n"); 80 rc = loc_category_get_id("display-device", &ddev_cid, 81 IPC_FLAG_BLOCKING); 82 if (rc != EOK) { 83 printf("Error looking up category 'display-device'.\n"); 100 84 return EIO; 101 85 } 102 86 103 canvas = create_canvas(window_root(window), NULL, vw, vh, 104 surface); 105 if (canvas == NULL) { 106 printf("Error creating canvas.\n"); 87 /* 88 * Check for new dispay devices 89 */ 90 rc = loc_category_get_svcs(ddev_cid, &svcs, &count); 91 if (rc != EOK) { 92 printf("Error getting list of display devices.\n"); 107 93 return EIO; 108 94 } 109 95 110 sig_connect(&canvas->keyboard_event, NULL, on_keyboard_event);111 sig_connect(&canvas->position_event, NULL, on_position_event);96 for (i = 0; i < count; i++) { 97 already_known = false; 112 98 113 window_resize(window, 0, 0, vw + 10, vh + 30, WINDOW_PLACEMENT_ANY); 114 window_exec(window); 99 /* Determine whether we already know this device. */ 100 list_foreach(output->ddevs, loutdevs, ds_ddev_t, ddev) { 101 if (ddev->svc_id == svcs[i]) { 102 already_known = true; 103 break; 104 } 105 } 115 106 116 printf("Create canvas GC\n"); 117 rc = canvas_gc_create(canvas, surface, &cgc); 118 if (rc != EOK) 107 if (!already_known) { 108 rc = ds_ddev_open(output->def_display, svcs[i], &nddev); 109 if (rc != EOK) { 110 printf("Error adding display device.\n"); 111 continue; 112 } 113 114 list_append(&nddev->loutdevs, &output->ddevs); 115 116 printf("Added display device '%lu'\n", 117 (unsigned long) svcs[i]); 118 } 119 } 120 121 free(svcs); 122 123 return EOK; 124 } 125 126 /** Display device category change callback. 127 * 128 * @param arg Display server output (cast to void *) 129 */ 130 static void ds_ddev_change_cb(void *arg) 131 { 132 ds_output_t *output = (ds_output_t *) arg; 133 134 printf("ds_ddev_change_cb\n"); 135 fibril_mutex_lock(&output->lock); 136 (void) ds_output_check_new_devs(output); 137 fibril_mutex_unlock(&output->lock); 138 } 139 140 /** Create display server output. 141 * 142 * @param kbd_event_handler 143 * @param karg 144 * @param pos_event_handler 145 * @param parg 146 * @param routput Place to store pointer to display server output object. 147 * @return EOK on success or an error code 148 */ 149 errno_t ds_output_create(void (*kbd_event_handler)(void *, kbd_event_t *), 150 void *karg, void (*pos_event_handler)(void *, pos_event_t *), 151 void *parg, ds_output_t **routput) 152 { 153 ds_output_t *output; 154 155 output = calloc(1, sizeof(ds_output_t)); 156 if (output == NULL) 157 return ENOMEM; 158 159 fibril_mutex_initialize(&output->lock); 160 list_initialize(&output->ddevs); 161 162 *routput = output; 163 return EOK; 164 } 165 166 /** Start display device discovery. 167 * 168 * @param output Display server output 169 * @return EOK on success or an error code 170 */ 171 errno_t ds_output_start_discovery(ds_output_t *output) 172 { 173 errno_t rc; 174 175 rc = loc_register_cat_change_cb(ds_ddev_change_cb, output); 176 if (rc != EOK) { 177 printf("Failed registering callback for device discovery.\n"); 119 178 return rc; 179 } 120 180 121 *rgc = canvas_gc_get_ctx(cgc); 122 return EOK; 181 fibril_mutex_lock(&output->lock); 182 rc = ds_output_check_new_devs(output); 183 fibril_mutex_unlock(&output->lock); 184 185 return rc; 186 } 187 188 /** Destroy display server output. 189 * 190 * @param output Display server output 191 */ 192 void ds_output_destroy(ds_output_t *output) 193 { 194 free(output); 123 195 } 124 196
Note:
See TracChangeset
for help on using the changeset viewer.