Changes in / [69c1995:ce60be1] in mainline
- Files:
-
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/src/fpu_context.c
r69c1995 rce60be1 57 57 { 58 58 /* TODO: Zero all SSE, MMX etc. registers */ 59 /* Default value of SCR register is 0x1f80,60 * it masks all FPU exceptions*/61 59 asm volatile ( 62 60 "fninit\n" -
kernel/arch/ia32/src/fpu_context.c
r69c1995 rce60be1 37 37 #include <arch.h> 38 38 #include <cpu.h> 39 40 41 /** x87 FPU scr values (P3+ MMX2) */42 enum {43 X87_FLUSH_ZERO_FLAG = (1 << 15),44 X87_ROUND_CONTROL_MASK = (0x3 << 13),45 x87_ROUND_TO_NEAREST_EVEN = (0x0 << 13),46 X87_ROUND_DOWN_TO_NEG_INF = (0x1 << 13),47 X87_ROUND_UP_TO_POS_INF = (0x2 << 13),48 X87_ROUND_TO_ZERO = (0x3 << 13),49 X87_PRECISION_MASK = (1 << 12),50 X87_UNDERFLOW_MASK = (1 << 11),51 X87_OVERFLOW_MASK = (1 << 10),52 X87_ZERO_DIV_MASK = (1 << 9),53 X87_DENORMAL_OP_MASK = (1 << 8),54 X87_INVALID_OP_MASK = (1 << 7),55 X87_DENOM_ZERO_FLAG = (1 << 6),56 X87_PRECISION_EXC_FLAG = (1 << 5),57 X87_UNDERFLOW_EXC_FLAG = (1 << 4),58 X87_OVERFLOW_EXC_FLAG = (1 << 3),59 X87_ZERO_DIV_EXC_FLAG = (1 << 2),60 X87_DENORMAL_EXC_FLAG = (1 << 1),61 X87_INVALID_OP_EXC_FLAG = (1 << 0),62 63 X87_ALL_MASK = X87_PRECISION_MASK | X87_UNDERFLOW_MASK | X87_OVERFLOW_MASK | X87_ZERO_DIV_MASK | X87_DENORMAL_OP_MASK | X87_INVALID_OP_MASK,64 };65 66 39 67 40 typedef void (*fpu_context_function)(fpu_context_t *fctx); … … 125 98 } 126 99 127 /** Initialize x87 FPU. Mask all exceptions. */128 100 void fpu_init() 129 101 { … … 139 111 "ldmxcsr %[help0]\n" 140 112 : [help0] "+m" (help0), [help1] "+r" (help1) 141 : [magic] "i" ( X87_ALL_MASK)113 : [magic] "i" (0x1f80) 142 114 ); 143 115 } -
uspace/app/vdemo/vdemo.c
r69c1995 rce60be1 110 110 { 111 111 if (argc >= 2) { 112 window_t *main_window = window_open(argv[1], true, true, "vdemo" , 0, 0);112 window_t *main_window = window_open(argv[1], true, true, "vdemo"); 113 113 if (!main_window) { 114 114 printf("Cannot open main window.\n"); -
uspace/app/vlaunch/vlaunch.c
r69c1995 rce60be1 98 98 99 99 winreg = argv[1]; 100 window_t *main_window = window_open(argv[1], true, true, "vlaunch" , 0, 0);100 window_t *main_window = window_open(argv[1], true, true, "vlaunch"); 101 101 if (!main_window) { 102 102 printf("Cannot open main window.\n"); -
uspace/app/vterm/vterm.c
r69c1995 rce60be1 49 49 } 50 50 51 window_t *main_window = window_open(argv[1], true, true, "vterm" , 0, 0);51 window_t *main_window = window_open(argv[1], true, true, "vterm"); 52 52 if (!main_window) { 53 53 printf("%s: Cannot open main window.\n", NAME); -
uspace/drv/fb/kfb/port.c
r69c1995 rce60be1 163 163 /* Faster damage routine ignoring offsets. */ 164 164 for (sysarg_t y = y0; y < height + y0; ++y) { 165 pixel_t *pixel = pixelmap_pixel_at(map, x0, y);166 165 for (sysarg_t x = x0; x < width + x0; ++x) { 167 kfb.pixel2visual(kfb.addr + FB_POS(x, y), *pixel++); 166 kfb.pixel2visual(kfb.addr + FB_POS(x, y), 167 *pixelmap_pixel_at(map, x, y)); 168 168 } 169 169 } -
uspace/lib/c/generic/io/window.c
r69c1995 rce60be1 40 40 #include <stdio.h> 41 41 42 int win_register(async_sess_t *sess, service_id_t *in, service_id_t *out, 43 sysarg_t x_offset, sysarg_t y_offset) 42 int win_register(async_sess_t *sess, service_id_t *in, service_id_t *out) 44 43 { 45 44 async_exch_t *exch = async_exchange_begin(sess); 46 int ret = async_req_ 2_2(exch, WINDOW_REGISTER, x_offset, y_offset, in, out);45 int ret = async_req_0_2(exch, WINDOW_REGISTER, in, out); 47 46 async_exchange_end(exch); 48 47 -
uspace/lib/c/generic/stdlib.c
r69c1995 rce60be1 39 39 long int random(void) 40 40 { 41 return glbl_seed = ((1366 *glbl_seed + 150889) % RAND_MAX);41 return glbl_seed = ((1366*glbl_seed + 150889) % RAND_MAX); 42 42 } 43 43 44 44 void srandom(unsigned int seed) 45 45 { 46 glbl_seed = seed % RAND_MAX;46 glbl_seed = seed; 47 47 } 48 48 -
uspace/lib/c/include/io/pixel.h
r69c1995 rce60be1 42 42 ((channel) >> (8 - (bits))) 43 43 44 #define INVERT(pixel) ((pixel) ^ 0x00ffffff)45 46 44 #define ALPHA(pixel) ((pixel) >> 24) 47 45 #define RED(pixel) (((pixel) & 0x00ff0000) >> 16) -
uspace/lib/c/include/io/pixelmap.h
r69c1995 rce60be1 52 52 sysarg_t y) 53 53 { 54 if (x < pixelmap->width && y < pixelmap->height) { 55 size_t offset = y * pixelmap->width + x; 56 pixel_t *pixel = pixelmap->data + offset; 57 return pixel; 58 } else { 59 return NULL; 60 } 54 size_t offset = y * pixelmap->width + x; 55 pixel_t *pixel = pixelmap->data + offset; 56 return pixel; 61 57 } 62 58 -
uspace/lib/c/include/io/window.h
r69c1995 rce60be1 71 71 ET_POSITION_EVENT, 72 72 ET_SIGNAL_EVENT, 73 ET_WINDOW_FOCUS,74 ET_WINDOW_UNFOCUS,75 73 ET_WINDOW_RESIZE, 76 74 ET_WINDOW_REFRESH, … … 102 100 } window_grab_flags_t; 103 101 104 extern int win_register(async_sess_t *, service_id_t *, service_id_t * , sysarg_t, sysarg_t);102 extern int win_register(async_sess_t *, service_id_t *, service_id_t *); 105 103 106 104 extern int win_get_event(async_sess_t *, window_event_t *); -
uspace/lib/draw/drawctx.c
r69c1995 rce60be1 129 129 } 130 130 131 bool transfer_fast = source_is_fast(context->source) 132 && (context->shall_clip == false) 133 && (context->mask == NULL) 134 && (context->compose == compose_src || context->compose == compose_over); 135 136 if (transfer_fast) { 137 138 for (sysarg_t _y = y; _y < y + height; ++_y) { 139 pixel_t *src = source_direct_access(context->source, x, _y); 140 pixel_t *dst = pixelmap_pixel_at(surface_pixmap_access(context->surface), x, _y); 141 if (src && dst) { 142 sysarg_t count = width; 143 while (count-- != 0) { 144 *dst++ = *src++; 145 } 131 bool clipped = false; 132 bool masked = false; 133 134 for (sysarg_t _y = y; _y < y + height; ++_y) { 135 for (sysarg_t _x = x; _x < x + width; ++_x) { 136 if (context->shall_clip) { 137 clipped = _x < context->clip_x && _x >= context->clip_width 138 && _y < context->clip_y && _y >= context->clip_height; 139 } 140 141 if (context->mask) { 142 pixel_t p = surface_get_pixel(context->mask, _x, _y); 143 masked = p > 0 ? false : true; 144 } 145 146 if (!clipped && !masked) { 147 pixel_t p_src = source_determine_pixel(context->source, _x, _y); 148 pixel_t p_dst = surface_get_pixel(context->surface, _x, _y); 149 pixel_t p_res = context->compose(p_src, p_dst); 150 surface_put_pixel(context->surface, _x, _y, p_res); 146 151 } 147 152 } 148 surface_add_damaged_region(context->surface, x, y, width, height);149 150 } else {151 152 bool clipped = false;153 bool masked = false;154 for (sysarg_t _y = y; _y < y + height; ++_y) {155 for (sysarg_t _x = x; _x < x + width; ++_x) {156 if (context->shall_clip) {157 clipped = _x < context->clip_x && _x >= context->clip_width158 && _y < context->clip_y && _y >= context->clip_height;159 }160 161 if (context->mask) {162 pixel_t p = surface_get_pixel(context->mask, _x, _y);163 masked = p > 0 ? false : true;164 }165 166 if (!clipped && !masked) {167 pixel_t p_src = source_determine_pixel(context->source, _x, _y);168 pixel_t p_dst = surface_get_pixel(context->surface, _x, _y);169 pixel_t p_res = context->compose(p_src, p_dst);170 surface_put_pixel(context->surface, _x, _y, p_res);171 }172 }173 }174 175 153 } 176 154 } -
uspace/lib/draw/source.c
r69c1995 rce60be1 90 90 } 91 91 92 bool source_is_fast(source_t *source)93 {94 return (source->mask == NULL)95 && (source->alpha == (pixel_t) PIXEL(255, 0, 0, 0))96 && (source->texture != NULL)97 && (source->texture_tile == false)98 && transform_is_fast(&source->transform);99 }100 101 pixel_t *source_direct_access(source_t *source, double x, double y)102 {103 assert(source_is_fast(source));104 105 long _x = (long) (x + source->transform.m[0][2]);106 long _y = (long) (y + source->transform.m[1][2]);107 108 return pixelmap_pixel_at(109 surface_pixmap_access(source->texture), (sysarg_t) _x, (sysarg_t) _y);110 }111 112 92 pixel_t source_determine_pixel(source_t *source, double x, double y) 113 93 { -
uspace/lib/draw/source.h
r69c1995 rce60be1 71 71 extern void source_set_mask(source_t *, surface_t *, bool); 72 72 73 extern bool source_is_fast(source_t *);74 extern pixel_t *source_direct_access(source_t *, double, double);75 73 extern pixel_t source_determine_pixel(source_t *, double, double); 76 74 -
uspace/lib/draw/surface.c
r69c1995 rce60be1 143 143 } 144 144 145 void surface_add_damaged_region(surface_t *surface, surface_coord_t x, surface_coord_t y,146 surface_coord_t width, surface_coord_t height)147 {148 surface->dirty_x_lo = surface->dirty_x_lo > x ? x : surface->dirty_x_lo;149 surface->dirty_y_lo = surface->dirty_y_lo > y ? y : surface->dirty_y_lo;150 151 surface_coord_t x_hi = x + width - 1;152 surface_coord_t y_hi = y + height - 1;153 154 surface->dirty_x_hi = surface->dirty_x_hi < x_hi ? x_hi : surface->dirty_x_hi;155 surface->dirty_y_hi = surface->dirty_y_hi < y_hi ? y_hi : surface->dirty_y_hi;156 }157 158 145 void surface_reset_damaged_region(surface_t *surface) 159 146 { … … 171 158 surface->dirty_y_hi = surface->dirty_y_hi < y ? y : surface->dirty_y_hi; 172 159 173 pixelmap_put_pixel(&surface->pixmap, x, y, pixel); 160 if (x < surface->pixmap.width && y < surface->pixmap.height) { 161 pixelmap_put_pixel(&surface->pixmap, x, y, pixel); 162 } 174 163 } 175 164 176 165 pixel_t surface_get_pixel(surface_t *surface, surface_coord_t x, surface_coord_t y) 177 166 { 178 return pixelmap_get_pixel(&surface->pixmap, x, y); 167 if (x < surface->pixmap.width && y < surface->pixmap.height) { 168 return pixelmap_get_pixel(&surface->pixmap, x, y); 169 } else { 170 return 0; 171 } 179 172 } 180 173 -
uspace/lib/draw/surface.h
r69c1995 rce60be1 61 61 extern void surface_get_damaged_region(surface_t *, surface_coord_t *, surface_coord_t *, 62 62 surface_coord_t *, surface_coord_t *); 63 extern void surface_add_damaged_region(surface_t *, surface_coord_t , surface_coord_t ,64 surface_coord_t , surface_coord_t );65 63 extern void surface_reset_damaged_region(surface_t *); 66 64 -
uspace/lib/gui/terminal.c
r69c1995 rce60be1 196 196 uint16_t glyph = fb_font_glyph(field->ch); 197 197 198 // FIXME: This font drawing routine is shamelessly 199 // suboptimal. It should be optimized for 200 // aligned memory transfers, etc. 201 198 202 for (unsigned int y = 0; y < FONT_SCANLINES; y++) { 199 pixel_t *dst = pixelmap_pixel_at( 200 surface_pixmap_access(surface), bx, by + y); 201 pixel_t *dst_max = pixelmap_pixel_at( 202 surface_pixmap_access(surface), bx + FONT_WIDTH - 1, by + y); 203 if (!dst || !dst_max) continue; 204 int count = FONT_WIDTH; 205 while (count-- != 0) { 206 *dst++ = (fb_font[glyph][y] & (1 << count)) ? fgcolor : bgcolor; 203 for (unsigned int x = 0; x < FONT_WIDTH; x++) { 204 pixel_t pixel = 205 (fb_font[glyph][y] & (1 << (7 - x))) ? fgcolor : bgcolor; 206 surface_put_pixel(surface, bx + x, by + y, pixel); 207 207 } 208 208 } 209 surface_add_damaged_region(surface, bx, by, FONT_WIDTH, FONT_SCANLINES);210 209 } 211 210 -
uspace/lib/gui/window.c
r69c1995 rce60be1 66 66 67 67 static pixel_t border_color = PIXEL(255, 0, 0, 0); 68 static pixel_t header_bg_focus_color = PIXEL(255, 25, 25, 112); 69 static pixel_t header_fg_focus_color = PIXEL(255, 255, 255, 255); 70 static pixel_t header_bg_unfocus_color = PIXEL(255, 70, 130, 180); 71 static pixel_t header_fg_unfocus_color = PIXEL(255, 255, 255, 255); 68 static pixel_t header_bgcolor = PIXEL(255, 25, 25, 112); 69 static pixel_t header_fgcolor = PIXEL(255, 255, 255, 255); 72 70 73 71 static void paint_internal(widget_t *w) … … 96 94 w->vpos + w->height - border_thickness, w->width, border_thickness); 97 95 98 source_set_color(&source, 99 w->window->is_focused ? header_bg_focus_color : header_bg_unfocus_color); 96 source_set_color(&source, header_bgcolor); 100 97 drawctx_transfer(&drawctx, 101 98 w->hpos + border_thickness, w->vpos + border_thickness, … … 109 106 char cls_pict[] = "x"; 110 107 font_get_box(&font, cls_pict, &cls_width, &cls_height); 111 source_set_color(&source, 112 w->window->is_focused ? header_fg_focus_color : header_fg_unfocus_color); 108 source_set_color(&source, header_fgcolor); 113 109 sysarg_t cls_x = ((close_width - cls_width) / 2) + w->hpos + w->width - 114 110 border_thickness - close_width; … … 451 447 break; 452 448 case ET_POSITION_EVENT: 453 if (!win->is_focused) {454 win->is_focused = true;455 handle_refresh(win);456 }457 449 deliver_position_event(win, event->data.pos); 458 450 break; … … 462 454 case ET_WINDOW_RESIZE: 463 455 handle_resize(win, event->data.rsz.width, event->data.rsz.height); 464 break;465 case ET_WINDOW_FOCUS:466 if (!win->is_focused) {467 win->is_focused = true;468 handle_refresh(win);469 }470 break;471 case ET_WINDOW_UNFOCUS:472 if (win->is_focused) {473 win->is_focused = false;474 handle_refresh(win);475 }476 456 break; 477 457 case ET_WINDOW_REFRESH: … … 534 514 } 535 515 536 window_t *window_open(char *winreg, bool is_main, bool is_decorated, 537 const char *caption, sysarg_t x_offset, sysarg_t y_offset) 516 window_t *window_open(char *winreg, bool is_main, bool is_decorated, const char *caption) 538 517 { 539 518 int rc; … … 546 525 win->is_main = is_main; 547 526 win->is_decorated = is_decorated; 548 win->is_focused = true;549 527 prodcons_initialize(&win->events); 550 528 fibril_mutex_initialize(&win->guard); … … 579 557 service_id_t out_dsid; 580 558 581 rc = win_register(reg_sess, &in_dsid, &out_dsid , x_offset, y_offset);559 rc = win_register(reg_sess, &in_dsid, &out_dsid); 582 560 async_hangup(reg_sess); 583 561 if (rc != EOK) { -
uspace/lib/gui/window.h
r69c1995 rce60be1 50 50 bool is_main; /**< True for the main window of the application. */ 51 51 bool is_decorated; /**< True if the window decorations should be rendered. */ 52 bool is_focused; /**< True for the top level window of the desktop. */53 52 char *caption; /**< Text title of the window header. */ 54 53 async_sess_t *isess; /**< Input events from compositor. */ … … 66 65 * If the window is declared as main, its closure causes termination of the 67 66 * whole application. Note that opened window does not have any surface yet. */ 68 extern window_t *window_open(char *, bool, bool, const char * , sysarg_t, sysarg_t);67 extern window_t *window_open(char *, bool, bool, const char *); 69 68 70 69 /** -
uspace/lib/softrend/filter.c
r69c1995 rce60be1 44 44 _x %= pixmap->width; 45 45 _y %= pixmap->height; 46 } else if (_x < 0 || _x >= (long) pixmap->width || _y < 0 || _y >= (long) pixmap->height) { 47 return 0; 46 48 } 47 49 -
uspace/lib/softrend/transform.c
r69c1995 rce60be1 136 136 } 137 137 138 bool transform_is_fast(transform_t *t)139 {140 return (t->m[0][0] == 1) && (t->m[0][1] == 0)141 && (t->m[1][0] == 0) && (t->m[1][1] == 1)142 && ((t->m[0][2] - ((long) t->m[0][2])) == 0.0)143 && ((t->m[1][2] - ((long) t->m[1][2])) == 0.0);144 }145 146 138 void transform_apply_linear(const transform_t *t, double *x, double *y) 147 139 { -
uspace/lib/softrend/transform.h
r69c1995 rce60be1 37 37 #define SOFTREND_TRANSFORM_H_ 38 38 39 #include <bool.h>40 41 39 #ifndef PI 42 40 #define PI 3.141592653589793 … … 55 53 extern void transform_rotate(transform_t *, double); 56 54 57 extern bool transform_is_fast(transform_t *);58 59 55 extern void transform_apply_linear(const transform_t *, double *, double *); 60 56 extern void transform_apply_affine(const transform_t *, double *, double *); -
uspace/srv/hid/compositor/compositor.c
r69c1995 rce60be1 90 90 typedef struct { 91 91 link_t link; 92 sysarg_t id; 93 uint8_t state; 94 desktop_point_t pos; 95 sysarg_t btn_num; 96 desktop_point_t btn_pos; 97 desktop_vector_t accum; 98 sysarg_t grab_flags; 99 bool pressed; 100 cursor_t cursor; 101 } pointer_t; 102 103 static sysarg_t pointer_id = 0; 104 static FIBRIL_MUTEX_INITIALIZE(pointer_list_mtx); 105 static LIST_INITIALIZE(pointer_list); 106 107 typedef struct { 108 link_t link; 92 109 service_id_t in_dsid; 93 110 service_id_t out_dsid; … … 112 129 typedef struct { 113 130 link_t link; 114 sysarg_t id;115 uint8_t state;116 desktop_point_t pos;117 sysarg_t btn_num;118 desktop_point_t btn_pos;119 desktop_vector_t accum;120 sysarg_t grab_flags;121 bool pressed;122 cursor_t cursor;123 window_t ghost;124 desktop_vector_t accum_ghost;125 } pointer_t;126 127 static sysarg_t pointer_id = 0;128 static FIBRIL_MUTEX_INITIALIZE(pointer_list_mtx);129 static LIST_INITIALIZE(pointer_list);130 131 typedef struct {132 link_t link;133 131 service_id_t dsid; 134 132 vslmode_t mode; … … 183 181 cursor_init(&p->cursor, CURSOR_DECODER_EMBEDDED, NULL); 184 182 185 /* Ghost window for transformation animation. */186 transform_identity(&p->ghost.transform);187 transform_translate(&p->ghost.transform, coord_origin, coord_origin);188 p->ghost.dx = coord_origin;189 p->ghost.dy = coord_origin;190 p->ghost.fx = 1;191 p->ghost.fy = 1;192 p->ghost.angle = 0;193 p->ghost.opacity = 255;194 p->ghost.surface = NULL;195 p->accum_ghost.x = 0;196 p->accum_ghost.y = 0;197 198 183 return p; 199 184 } … … 207 192 } 208 193 209 static window_t *window_create( sysarg_t x_offset, sysarg_t y_offset)194 static window_t *window_create() 210 195 { 211 196 window_t *win = (window_t *) malloc(sizeof(window_t)); … … 217 202 prodcons_initialize(&win->queue); 218 203 transform_identity(&win->transform); 219 transform_translate(&win->transform, 220 coord_origin + x_offset, coord_origin + y_offset); 221 win->dx = coord_origin + x_offset; 222 win->dy = coord_origin + y_offset; 204 transform_translate(&win->transform, coord_origin, coord_origin); 205 win->dx = coord_origin; 206 win->dy = coord_origin; 223 207 win->fx = 1; 224 208 win->fy = 1; … … 283 267 sysarg_t *x_out, sysarg_t *y_out, sysarg_t *w_out, sysarg_t *h_out) 284 268 { 285 if (w_in > 0 && h_in > 0) { 286 sysarg_t x[4]; 287 sysarg_t y[4]; 288 comp_coord_from_client(x_in, y_in, win_trans, &x[0], &y[0]); 289 comp_coord_from_client(x_in + w_in - 1, y_in, win_trans, &x[1], &y[1]); 290 comp_coord_from_client(x_in + w_in - 1, y_in + h_in - 1, win_trans, &x[2], &y[2]); 291 comp_coord_from_client(x_in, y_in + h_in - 1, win_trans, &x[3], &y[3]); 292 (*x_out) = x[0]; 293 (*y_out) = y[0]; 294 (*w_out) = x[0]; 295 (*h_out) = y[0]; 296 for (int i = 1; i < 4; ++i) { 297 (*x_out) = (x[i] < (*x_out)) ? x[i] : (*x_out); 298 (*y_out) = (y[i] < (*y_out)) ? y[i] : (*y_out); 299 (*w_out) = (x[i] > (*w_out)) ? x[i] : (*w_out); 300 (*h_out) = (y[i] > (*h_out)) ? y[i] : (*h_out); 301 } 302 (*w_out) = (*w_out) - (*x_out) + 1; 303 (*h_out) = (*h_out) - (*y_out) + 1; 304 } else { 305 (*w_out) = 0; 306 (*h_out) = 0; 307 } 269 sysarg_t x[4]; 270 sysarg_t y[4]; 271 comp_coord_from_client(x_in, y_in, win_trans, &x[0], &y[0]); 272 comp_coord_from_client(x_in + w_in, y_in, win_trans, &x[1], &y[1]); 273 comp_coord_from_client(x_in + w_in, y_in + h_in, win_trans, &x[2], &y[2]); 274 comp_coord_from_client(x_in, y_in + h_in, win_trans, &x[3], &y[3]); 275 (*x_out) = x[0]; 276 (*y_out) = y[0]; 277 (*w_out) = x[0]; 278 (*h_out) = y[0]; 279 for (int i = 1; i < 4; ++i) { 280 (*x_out) = (x[i] < (*x_out)) ? x[i] : (*x_out); 281 (*y_out) = (y[i] < (*y_out)) ? y[i] : (*y_out); 282 (*w_out) = (x[i] > (*w_out)) ? x[i] : (*w_out); 283 (*h_out) = (y[i] > (*h_out)) ? y[i] : (*h_out); 284 } 285 (*w_out) -= (*x_out); 286 (*h_out) -= (*y_out); 308 287 } 309 288 … … 330 309 /* Paint background color. */ 331 310 for (sysarg_t y = y_dmg_vp - vp->pos.y; y < y_dmg_vp - vp->pos.y + h_dmg_vp; ++y) { 332 pixel_t *dst = pixelmap_pixel_at( 333 surface_pixmap_access(vp->surface), x_dmg_vp - vp->pos.x, y); 334 sysarg_t count = w_dmg_vp; 335 while (count-- != 0) { 336 *dst++ = bg_color; 311 for (sysarg_t x = x_dmg_vp - vp->pos.x; x < x_dmg_vp - vp->pos.x + w_dmg_vp; ++x) { 312 surface_put_pixel(vp->surface, x, y, bg_color); 337 313 } 338 314 } 339 surface_add_damaged_region(vp->surface,340 x_dmg_vp - vp->pos.x, y_dmg_vp - vp->pos.y, w_dmg_vp, h_dmg_vp);341 315 342 316 transform_t transform; … … 389 363 list_foreach(pointer_list, link) { 390 364 391 pointer_t *ptr = list_get_instance(link, pointer_t, link);392 if (ptr->ghost.surface) {393 394 sysarg_t x_bnd_ghost, y_bnd_ghost, w_bnd_ghost, h_bnd_ghost;395 sysarg_t x_dmg_ghost, y_dmg_ghost, w_dmg_ghost, h_dmg_ghost;396 surface_get_resolution(ptr->ghost.surface, &w_bnd_ghost, &h_bnd_ghost);397 comp_coord_bounding_rect(0, 0, w_bnd_ghost, h_bnd_ghost, ptr->ghost.transform,398 &x_bnd_ghost, &y_bnd_ghost, &w_bnd_ghost, &h_bnd_ghost);399 bool isec_ghost = rectangle_intersect(400 x_dmg_vp, y_dmg_vp, w_dmg_vp, h_dmg_vp,401 x_bnd_ghost, y_bnd_ghost, w_bnd_ghost, h_bnd_ghost,402 &x_dmg_ghost, &y_dmg_ghost, &w_dmg_ghost, &h_dmg_ghost);403 404 if (isec_ghost) {405 /* FIXME: Ghost is currently drawn based on the bounding406 * rectangle of the window, which is sufficient as long407 * as the windows can be rotated only by 90 degrees.408 * For ghost to be compatible with arbitrary-angle409 * rotation, it should be drawn as four lines adjusted410 * by the transformation matrix. That would however411 * require to equip libdraw with line drawing functionality. */412 413 transform_t transform = ptr->ghost.transform;414 double_point_t pos;415 pos.x = vp->pos.x;416 pos.y = vp->pos.y;417 transform_translate(&transform, -pos.x, -pos.y);418 419 pixel_t ghost_color;420 421 if (y_bnd_ghost == y_dmg_ghost) {422 for (sysarg_t x = x_dmg_ghost - vp->pos.x;423 x < x_dmg_ghost - vp->pos.x + w_dmg_ghost; ++x) {424 ghost_color = surface_get_pixel(vp->surface,425 x, y_dmg_ghost - vp->pos.y);426 surface_put_pixel(vp->surface,427 x, y_dmg_ghost - vp->pos.y, INVERT(ghost_color));428 }429 }430 431 if (y_bnd_ghost + h_bnd_ghost == y_dmg_ghost + h_dmg_ghost) {432 for (sysarg_t x = x_dmg_ghost - vp->pos.x;433 x < x_dmg_ghost - vp->pos.x + w_dmg_ghost; ++x) {434 ghost_color = surface_get_pixel(vp->surface,435 x, y_dmg_ghost - vp->pos.y + h_dmg_ghost - 1);436 surface_put_pixel(vp->surface,437 x, y_dmg_ghost - vp->pos.y + h_dmg_ghost - 1, INVERT(ghost_color));438 }439 }440 441 if (x_bnd_ghost == x_dmg_ghost) {442 for (sysarg_t y = y_dmg_ghost - vp->pos.y;443 y < y_dmg_ghost - vp->pos.y + h_dmg_ghost; ++y) {444 ghost_color = surface_get_pixel(vp->surface,445 x_dmg_ghost - vp->pos.x, y);446 surface_put_pixel(vp->surface,447 x_dmg_ghost - vp->pos.x, y, INVERT(ghost_color));448 }449 }450 451 if (x_bnd_ghost + w_bnd_ghost == x_dmg_ghost + w_dmg_ghost) {452 for (sysarg_t y = y_dmg_ghost - vp->pos.y;453 y < y_dmg_ghost - vp->pos.y + h_dmg_ghost; ++y) {454 ghost_color = surface_get_pixel(vp->surface,455 x_dmg_ghost - vp->pos.x + w_dmg_ghost - 1, y);456 surface_put_pixel(vp->surface,457 x_dmg_ghost - vp->pos.x + w_dmg_ghost - 1, y, INVERT(ghost_color));458 }459 }460 }461 462 }463 }464 465 list_foreach(pointer_list, link) {466 467 365 /* Determine what part of the pointer intersects with the 468 366 * updated area of the current viewport. */ … … 478 376 if (isec_ptr) { 479 377 /* Pointer is currently painted directly by copying pixels. 480 * However, it is possible to draw the p ointer similarly378 * However, it is possible to draw the painter similarly 481 379 * as window by using drawctx_transfer. It would allow 482 380 * more sophisticated control over drawing, but would also 483 381 * cost more regarding the performance. */ 484 382 383 pixel_t pix = 0; 485 384 sysarg_t x_vp = x_dmg_ptr - vp->pos.x; 486 385 sysarg_t y_vp = y_dmg_ptr - vp->pos.y; … … 489 388 490 389 for (sysarg_t y = 0; y < h_dmg_ptr; ++y) { 491 pixel_t *src = pixelmap_pixel_at( 492 surface_pixmap_access(sf_ptr), x_ptr, y_ptr + y); 493 pixel_t *dst = pixelmap_pixel_at( 494 surface_pixmap_access(vp->surface), x_vp, y_vp + y); 495 sysarg_t count = w_dmg_ptr; 496 while (count-- != 0) { 497 *dst = (*src & 0xff000000) ? *src : *dst; 498 ++dst; ++src; 390 for (sysarg_t x = 0; x < w_dmg_ptr; ++x) { 391 pix = surface_get_pixel(sf_ptr, x_ptr + x, y_ptr + y); 392 if (ALPHA(pix) == 255) { 393 surface_put_pixel(vp->surface, x_vp + x, y_vp + y, pix); 394 } 499 395 } 500 396 } 501 surface_add_damaged_region(vp->surface, x_vp, y_vp, w_dmg_ptr, h_dmg_ptr);502 397 } 503 504 398 } 505 399 } … … 556 450 } else { 557 451 fibril_mutex_lock(&window_list_mtx); 558 comp_coord_bounding_rect(x - 1, y - 1, width + 2, height + 2,452 comp_coord_bounding_rect(x, y, width, height, 559 453 win->transform, &x, &y, &width, &height); 560 454 fibril_mutex_unlock(&window_list_mtx); … … 574 468 pointer_t *pointer = list_get_instance(link, pointer_t, link); 575 469 if (pointer->id == pos_id) { 576 pointer->grab_flags = pointer->pressed ? grab_flags : GF_EMPTY;470 pointer->grab_flags = grab_flags; 577 471 // TODO change pointer->state according to grab_flags 578 472 break; … … 647 541 } 648 542 649 static void comp_post_event_win(window_event_t *event, window_t *target)650 {651 fibril_mutex_lock(&window_list_mtx);652 window_t *window = NULL;653 list_foreach(window_list, link) {654 window = list_get_instance(link, window_t, link);655 if (window == target) {656 prodcons_produce(&window->queue, &event->link);657 }658 }659 if (!window) {660 free(event);661 }662 fibril_mutex_unlock(&window_list_mtx);663 }664 665 static void comp_post_event_top(window_event_t *event)666 {667 fibril_mutex_lock(&window_list_mtx);668 window_t *win = (window_t *) list_first(&window_list);669 if (win) {670 prodcons_produce(&win->queue, &event->link);671 } else {672 free(event);673 }674 fibril_mutex_unlock(&window_list_mtx);675 }676 677 543 static void comp_window_close(window_t *win, ipc_callid_t iid, ipc_call_t *icall) 678 544 { … … 680 546 fibril_mutex_lock(&window_list_mtx); 681 547 list_remove(&win->link); 682 window_t *win_focus = (window_t *) list_first(&window_list);683 window_event_t *event_focus = (window_event_t *) malloc(sizeof(window_event_t));684 if (event_focus) {685 link_initialize(&event_focus->link);686 event_focus->type = ET_WINDOW_FOCUS;687 }688 548 fibril_mutex_unlock(&window_list_mtx); 689 690 if (event_focus && win_focus) {691 comp_post_event_win(event_focus, win_focus);692 }693 549 694 550 /* Calculate damage. */ … … 745 601 fibril_mutex_lock(&window_list_mtx); 746 602 747 window_t *win = window_create( IPC_GET_ARG1(call), IPC_GET_ARG2(call));603 window_t *win = window_create(); 748 604 if (!win) { 749 605 async_answer_2(callid, ENOMEM, 0, 0); … … 774 630 } 775 631 776 window_t *win_unfocus = (window_t *) list_first(&window_list);777 632 list_prepend(&win->link, &window_list); 778 779 window_event_t *event_unfocus = (window_event_t *) malloc(sizeof(window_event_t));780 if (event_unfocus) {781 link_initialize(&event_unfocus->link);782 event_unfocus->type = ET_WINDOW_UNFOCUS;783 }784 633 785 634 async_answer_2(callid, EOK, win->in_dsid, win->out_dsid); 786 635 fibril_mutex_unlock(&window_list_mtx); 787 788 if (event_unfocus && win_unfocus) {789 comp_post_event_win(event_unfocus, win_unfocus);790 }791 792 636 return; 793 637 } else { … … 1109 953 } 1110 954 955 static void comp_post_event(window_event_t *event) 956 { 957 fibril_mutex_lock(&window_list_mtx); 958 window_t *win = (window_t *) list_first(&window_list); 959 if (win) { 960 prodcons_produce(&win->queue, &event->link); 961 } else { 962 free(event); 963 } 964 fibril_mutex_unlock(&window_list_mtx); 965 } 966 1111 967 static void comp_recalc_transform(window_t *win) 1112 968 { … … 1117 973 transform_t scale; 1118 974 transform_identity(&scale); 1119 if (win->fx != 1 || win->fy != 1) { 1120 transform_scale(&scale, win->fx, win->fy); 1121 } 975 transform_scale(&scale, win->fx, win->fy); 1122 976 1123 977 transform_t rotate; 1124 978 transform_identity(&rotate); 1125 if (win->angle != 0) { 1126 transform_rotate(&rotate, win->angle); 1127 } 979 transform_rotate(&rotate, win->angle); 1128 980 1129 981 transform_t transform; … … 1142 994 1143 995 static void comp_window_animate(pointer_t *pointer, window_t *win, 1144 sysarg_t *dmg_x, sysarg_t *dmg_y, sysarg_t *dmg_width, sysarg_t *dmg_height)996 sysarg_t *dmg_x, sysarg_t *dmg_y, sysarg_t *dmg_width, sysarg_t *dmg_height) 1145 997 { 1146 998 /* window_list_mtx locked by caller */ 1147 /* pointer_list_mtx locked by caller */1148 999 1149 1000 int dx = pointer->accum.x; … … 1169 1020 } 1170 1021 1171 if ( (scale || resize) && (win->angle != 0)) {1022 if (scale || resize) { 1172 1023 transform_t rotate; 1173 1024 transform_identity(&rotate); … … 1186 1037 double _dx = dx; 1187 1038 double _dy = dy; 1188 if (win->angle != 0) { 1189 transform_t unrotate; 1190 transform_identity(&unrotate); 1191 transform_rotate(&unrotate, -win->angle); 1192 transform_apply_linear(&unrotate, &_dx, &_dy); 1193 } 1039 transform_t unrotate; 1040 transform_identity(&unrotate); 1041 transform_rotate(&unrotate, -win->angle); 1042 transform_apply_linear(&unrotate, &_dx, &_dy); 1194 1043 _dx = (pointer->grab_flags & GF_MOVE_X) ? -_dx : _dx; 1195 1044 _dy = (pointer->grab_flags & GF_MOVE_Y) ? -_dy : _dy; 1196 1045 1197 1046 if ((pointer->grab_flags & GF_SCALE_X) || (pointer->grab_flags & GF_RESIZE_X)) { 1198 double fx = 1.0 + (_dx / ( (width - 1)* win->fx));1047 double fx = 1.0 + (_dx / (width * win->fx)); 1199 1048 if (fx > 0) { 1200 #if ANIMATE_WINDOW_TRANSFORMS == 01201 if (scale) win->fx *= fx;1202 #endif1203 #if ANIMATE_WINDOW_TRANSFORMS == 11204 1049 win->fx *= fx; 1205 #endif1206 1050 scale_back_x *= fx; 1207 1051 } … … 1209 1053 1210 1054 if ((pointer->grab_flags & GF_SCALE_Y) || (pointer->grab_flags & GF_RESIZE_Y)) { 1211 double fy = 1.0 + (_dy / ( (height - 1)* win->fy));1055 double fy = 1.0 + (_dy / (height * win->fy)); 1212 1056 if (fy > 0) { 1213 #if ANIMATE_WINDOW_TRANSFORMS == 01214 if (scale) win->fy *= fy;1215 #endif1216 #if ANIMATE_WINDOW_TRANSFORMS == 11217 1057 win->fy *= fy; 1218 #endif1219 1058 scale_back_y *= fy; 1220 1059 } … … 1232 1071 dmg_x, dmg_y, dmg_width, dmg_height); 1233 1072 } 1234 1235 #if ANIMATE_WINDOW_TRANSFORMS == 01236 static void comp_ghost_animate(pointer_t *pointer,1237 desktop_rect_t *rect1, desktop_rect_t *rect2, desktop_rect_t *rect3, desktop_rect_t *rect4)1238 {1239 /* window_list_mtx locked by caller */1240 /* pointer_list_mtx locked by caller */1241 1242 int dx = pointer->accum_ghost.x;1243 int dy = pointer->accum_ghost.y;1244 pointer->accum_ghost.x = 0;1245 pointer->accum_ghost.y = 0;1246 1247 bool move = (pointer->grab_flags & GF_MOVE_X) || (pointer->grab_flags & GF_MOVE_Y);1248 bool scale = (pointer->grab_flags & GF_SCALE_X) || (pointer->grab_flags & GF_SCALE_Y);1249 bool resize = (pointer->grab_flags & GF_RESIZE_X) || (pointer->grab_flags & GF_RESIZE_Y);1250 1251 sysarg_t width, height;1252 surface_get_resolution(pointer->ghost.surface, &width, &height);1253 1254 if (move) {1255 double cx = 0;1256 double cy = 0;1257 if (pointer->grab_flags & GF_MOVE_X) {1258 cx = 1;1259 }1260 if (pointer->grab_flags & GF_MOVE_Y) {1261 cy = 1;1262 }1263 1264 if (scale || resize) {1265 transform_t rotate;1266 transform_identity(&rotate);1267 transform_rotate(&rotate, pointer->ghost.angle);1268 transform_apply_linear(&rotate, &cx, &cy);1269 }1270 1271 cx = (cx < 0) ? (-1 * cx) : cx;1272 cy = (cy < 0) ? (-1 * cy) : cy;1273 1274 pointer->ghost.dx += (cx * dx);1275 pointer->ghost.dy += (cy * dy);1276 }1277 1278 if (scale || resize) {1279 double _dx = dx;1280 double _dy = dy;1281 transform_t unrotate;1282 transform_identity(&unrotate);1283 transform_rotate(&unrotate, -pointer->ghost.angle);1284 transform_apply_linear(&unrotate, &_dx, &_dy);1285 _dx = (pointer->grab_flags & GF_MOVE_X) ? -_dx : _dx;1286 _dy = (pointer->grab_flags & GF_MOVE_Y) ? -_dy : _dy;1287 1288 if ((pointer->grab_flags & GF_SCALE_X) || (pointer->grab_flags & GF_RESIZE_X)) {1289 double fx = 1.0 + (_dx / ((width - 1) * pointer->ghost.fx));1290 pointer->ghost.fx *= fx;1291 }1292 1293 if ((pointer->grab_flags & GF_SCALE_Y) || (pointer->grab_flags & GF_RESIZE_Y)) {1294 double fy = 1.0 + (_dy / ((height - 1) * pointer->ghost.fy));1295 pointer->ghost.fy *= fy;1296 }1297 }1298 1299 sysarg_t x1, y1, width1, height1;1300 sysarg_t x2, y2, width2, height2;1301 comp_coord_bounding_rect(0, 0, width, height, pointer->ghost.transform,1302 &x1, &y1, &width1, &height1);1303 comp_recalc_transform(&pointer->ghost);1304 comp_coord_bounding_rect(0, 0, width, height, pointer->ghost.transform,1305 &x2, &y2, &width2, &height2);1306 1307 sysarg_t x_u, y_u, w_u, h_u;1308 rectangle_union(x1, y1, width1, height1, x2, y2, width2, height2,1309 &x_u, &y_u, &w_u, &h_u);1310 1311 sysarg_t x_i, y_i, w_i, h_i;1312 rectangle_intersect(x1, y1, width1, height1, x2, y2, width2, height2,1313 &x_i, &y_i, &w_i, &h_i);1314 1315 if (w_i == 0 || h_i == 0) {1316 rect1->x = x_u; rect2->x = 0; rect3->x = 0; rect4->x = 0;1317 rect1->y = y_u; rect2->y = 0; rect3->y = 0; rect4->y = 0;1318 rect1->w = w_u; rect2->w = 0; rect3->w = 0; rect4->w = 0;1319 rect1->h = h_u; rect2->h = 0; rect3->h = 0; rect4->h = 0;1320 } else {1321 rect1->x = x_u;1322 rect1->y = y_u;1323 rect1->w = x_i - x_u + 1;1324 rect1->h = h_u;1325 1326 rect2->x = x_u;1327 rect2->y = y_u;1328 rect2->w = w_u;1329 rect2->h = y_i - y_u + 1;1330 1331 rect3->x = x_i + w_i - 1;1332 rect3->y = y_u;1333 rect3->w = w_u - w_i - x_i + x_u + 1;1334 rect3->h = h_u;1335 1336 rect4->x = x_u;1337 rect4->y = y_i + h_i - 1;1338 rect4->w = w_u;1339 rect4->h = h_u - h_i - y_i + y_u + 1;1340 }1341 }1342 #endif1343 1073 1344 1074 static int comp_abs_move(input_t *input, unsigned x , unsigned y, … … 1395 1125 1396 1126 fibril_mutex_lock(&window_list_mtx); 1397 fibril_mutex_lock(&pointer_list_mtx);1398 1127 window_t *top = (window_t *) list_first(&window_list); 1399 1128 if (top && top->surface) { … … 1407 1136 within_client = comp_coord_to_client(pointer->pos.x, pointer->pos.y, 1408 1137 top->transform, width, height, &point_x, &point_y); 1409 1410 window_event_t *event = NULL; 1138 fibril_mutex_unlock(&window_list_mtx); 1139 1411 1140 if (within_client) { 1412 event = (window_event_t *) malloc(sizeof(window_event_t));1141 window_event_t *event = (window_event_t *) malloc(sizeof(window_event_t)); 1413 1142 if (event) { 1414 1143 link_initialize(&event->link); … … 1419 1148 event->data.pos.hpos = point_x; 1420 1149 event->data.pos.vpos = point_y; 1150 comp_post_event(event); 1421 1151 } 1422 1152 } 1423 1424 fibril_mutex_unlock(&pointer_list_mtx);1425 fibril_mutex_unlock(&window_list_mtx);1426 1427 if (event) {1428 comp_post_event_top(event);1429 }1430 1431 1153 } else { 1432 1154 /* Pointer is grabbed by top-level window action. */ 1433 1155 pointer->accum.x += dx; 1434 1156 pointer->accum.y += dy; 1435 pointer->accum_ghost.x += dx;1436 pointer->accum_ghost.y += dy;1437 #if ANIMATE_WINDOW_TRANSFORMS == 01438 if (pointer->ghost.surface == NULL) {1439 pointer->ghost.surface = top->surface;1440 pointer->ghost.dx = top->dx;1441 pointer->ghost.dy = top->dy;1442 pointer->ghost.fx = top->fx;1443 pointer->ghost.fy = top->fy;1444 pointer->ghost.angle = top->angle;1445 pointer->ghost.transform = top->transform;1446 }1447 desktop_rect_t dmg_rect1, dmg_rect2, dmg_rect3, dmg_rect4;1448 comp_ghost_animate(pointer, &dmg_rect1, &dmg_rect2, &dmg_rect3, &dmg_rect4);1449 #endif1450 1157 #if ANIMATE_WINDOW_TRANSFORMS == 1 1451 1158 sysarg_t x, y, width, height; 1452 1159 comp_window_animate(pointer, top, &x, &y, &width, &height); 1453 1160 #endif 1454 fibril_mutex_unlock(&pointer_list_mtx);1455 1161 fibril_mutex_unlock(&window_list_mtx); 1456 #if ANIMATE_WINDOW_TRANSFORMS == 01457 comp_damage(dmg_rect1.x, dmg_rect1.y, dmg_rect1.w, dmg_rect1.h);1458 comp_damage(dmg_rect2.x, dmg_rect2.y, dmg_rect2.w, dmg_rect2.h);1459 comp_damage(dmg_rect3.x, dmg_rect3.y, dmg_rect3.w, dmg_rect3.h);1460 comp_damage(dmg_rect4.x, dmg_rect4.y, dmg_rect4.w, dmg_rect4.h);1461 #endif1462 1162 #if ANIMATE_WINDOW_TRANSFORMS == 1 1463 1163 comp_damage(x, y, width, height); … … 1465 1165 } 1466 1166 } else { 1467 fibril_mutex_unlock(&pointer_list_mtx);1468 1167 fibril_mutex_unlock(&window_list_mtx); 1469 1168 } … … 1475 1174 { 1476 1175 pointer_t *pointer = input_pointer(input); 1477 1478 fibril_mutex_lock(&window_list_mtx);1479 fibril_mutex_lock(&pointer_list_mtx);1480 window_t *win = NULL;1481 sysarg_t point_x = 0;1482 sysarg_t point_y = 0;1483 sysarg_t width, height;1484 bool within_client = false;1485 1486 /* Determine the window which the mouse click belongs to. */1487 list_foreach(window_list, link) {1488 win = list_get_instance(link, window_t, link);1489 if (win->surface) {1490 surface_get_resolution(win->surface, &width, &height);1491 within_client = comp_coord_to_client(pointer->pos.x, pointer->pos.y,1492 win->transform, width, height, &point_x, &point_y);1493 }1494 if (within_client) {1495 break;1496 }1497 }1498 1499 /* Check whether the window is top-level window. */1500 window_t *top = (window_t *) list_first(&window_list);1501 if (!win || !top) {1502 fibril_mutex_unlock(&pointer_list_mtx);1503 fibril_mutex_unlock(&window_list_mtx);1504 return EOK;1505 }1506 1507 window_event_t *event_top = NULL;1508 window_event_t *event_unfocus = NULL;1509 window_t *win_unfocus = NULL;1510 sysarg_t dmg_x, dmg_y;1511 sysarg_t dmg_width = 0;1512 sysarg_t dmg_height = 0;1513 1514 #if ANIMATE_WINDOW_TRANSFORMS == 01515 desktop_rect_t dmg_rect1, dmg_rect2, dmg_rect3, dmg_rect4;1516 #endif1517 1176 1518 1177 if (bpress) { … … 1521 1180 pointer->pressed = true; 1522 1181 1523 /* Bring the window to the foreground. */ 1524 if ((win != top) && within_client) { 1525 win_unfocus = (window_t *) list_first(&window_list); 1526 list_remove(&win->link); 1527 list_prepend(&win->link, &window_list); 1528 event_unfocus = (window_event_t *) malloc(sizeof(window_event_t)); 1529 if (event_unfocus) { 1530 link_initialize(&event_unfocus->link); 1531 event_unfocus->type = ET_WINDOW_UNFOCUS; 1532 } 1533 comp_coord_bounding_rect(0, 0, width, height, win->transform, 1534 &dmg_x, &dmg_y, &dmg_width, &dmg_height); 1535 } 1536 1537 /* Notify top-level window about mouse press. */ 1182 /* Check whether mouse press belongs to the top-level window. */ 1183 fibril_mutex_lock(&window_list_mtx); 1184 window_t *win = (window_t *) list_first(&window_list); 1185 if (!win || !win->surface) { 1186 fibril_mutex_unlock(&window_list_mtx); 1187 return EOK; 1188 } 1189 sysarg_t x, y, width, height; 1190 surface_get_resolution(win->surface, &width, &height); 1191 bool within_client = comp_coord_to_client(pointer->pos.x, pointer->pos.y, 1192 win->transform, width, height, &x, &y); 1193 fibril_mutex_unlock(&window_list_mtx); 1194 1195 /* Send mouse press to the top-level window. */ 1538 1196 if (within_client) { 1539 event_top = (window_event_t *) malloc(sizeof(window_event_t)); 1540 if (event_top) { 1541 link_initialize(&event_top->link); 1542 event_top->type = ET_POSITION_EVENT; 1543 event_top->data.pos.pos_id = pointer->id; 1544 event_top->data.pos.type = POS_PRESS; 1545 event_top->data.pos.btn_num = bnum; 1546 event_top->data.pos.hpos = point_x; 1547 event_top->data.pos.vpos = point_y; 1548 } 1549 pointer->grab_flags = GF_EMPTY; 1550 } 1551 1197 window_event_t *event = (window_event_t *) malloc(sizeof(window_event_t)); 1198 if (event) { 1199 link_initialize(&event->link); 1200 event->type = ET_POSITION_EVENT; 1201 event->data.pos.pos_id = pointer->id; 1202 event->data.pos.type = POS_PRESS; 1203 event->data.pos.btn_num = bnum; 1204 event->data.pos.hpos = x; 1205 event->data.pos.vpos = y; 1206 comp_post_event(event); 1207 } else { 1208 return ENOMEM; 1209 } 1210 } 1552 1211 } else if (pointer->pressed && pointer->btn_num == (unsigned)bnum) { 1553 1212 pointer->pressed = false; 1554 1213 1555 #if ANIMATE_WINDOW_TRANSFORMS == 0 1214 fibril_mutex_lock(&window_list_mtx); 1215 window_t *win = NULL; 1216 sysarg_t point_x = 0; 1217 sysarg_t point_y = 0; 1218 sysarg_t width, height; 1219 bool within_client = false; 1220 1221 /* Determine the window which the mouse release belongs to. */ 1222 list_foreach(window_list, link) { 1223 win = list_get_instance(link, window_t, link); 1224 if (win->surface) { 1225 surface_get_resolution(win->surface, &width, &height); 1226 within_client = comp_coord_to_client(pointer->pos.x, pointer->pos.y, 1227 win->transform, width, height, &point_x, &point_y); 1228 } 1229 if (within_client) { 1230 break; 1231 } 1232 } 1233 1234 /* Check whether the window is top-level window. */ 1235 window_t *top = (window_t *) list_first(&window_list); 1236 if (!win || !top) { 1237 pointer->grab_flags = GF_EMPTY; 1238 fibril_mutex_unlock(&window_list_mtx); 1239 return EOK; 1240 } 1241 1242 window_event_t *event = NULL; 1243 sysarg_t dmg_x, dmg_y; 1244 sysarg_t dmg_width = 0; 1245 sysarg_t dmg_height = 0; 1246 1556 1247 sysarg_t pre_x = 0; 1557 1248 sysarg_t pre_y = 0; … … 1559 1250 sysarg_t pre_height = 0; 1560 1251 1252 #if ANIMATE_WINDOW_TRANSFORMS == 0 1561 1253 if (pointer->grab_flags != GF_EMPTY) { 1562 if (pointer->ghost.surface) {1563 comp_ghost_animate(pointer, &dmg_rect1, &dmg_rect2, &dmg_rect3, &dmg_rect4);1564 pointer->ghost.surface = NULL;1565 }1566 1254 comp_window_animate(pointer, top, &pre_x, &pre_y, &pre_width, &pre_height); 1567 1255 dmg_x = pre_x; … … 1575 1263 1576 1264 surface_get_resolution(top->surface, &width, &height); 1577 #if ANIMATE_WINDOW_TRANSFORMS == 11578 1265 top->fx *= (1.0 / scale_back_x); 1579 1266 top->fy *= (1.0 / scale_back_y); 1580 1267 comp_recalc_transform(top); 1581 #endif1582 1268 1583 1269 /* Commit proper resize action. */ 1584 event _top= (window_event_t *) malloc(sizeof(window_event_t));1585 if (event _top) {1586 link_initialize(&event _top->link);1587 event _top->type = ET_WINDOW_RESIZE;1270 event = (window_event_t *) malloc(sizeof(window_event_t)); 1271 if (event) { 1272 link_initialize(&event->link); 1273 event->type = ET_WINDOW_RESIZE; 1588 1274 1589 1275 int dx = (int) (((double) width) * (scale_back_x - 1.0)); … … 1591 1277 1592 1278 if (pointer->grab_flags & GF_RESIZE_X) { 1593 event _top->data.rsz.width =1279 event->data.rsz.width = 1594 1280 ((((int) width) + dx) >= 0) ? (width + dx) : 0; 1595 1281 } else { 1596 event _top->data.rsz.width = width;1282 event->data.rsz.width = width; 1597 1283 } 1598 1284 1599 1285 if (pointer->grab_flags & GF_RESIZE_Y) { 1600 event _top->data.rsz.height =1286 event->data.rsz.height = 1601 1287 ((((int) height) + dy) >= 0) ? (height + dy) : 0; 1602 1288 } else { 1603 event _top->data.rsz.height = height;1289 event->data.rsz.height = height; 1604 1290 } 1605 1291 } … … 1610 1296 1611 1297 /* Notify top-level window about mouse release. */ 1612 event _top= (window_event_t *) malloc(sizeof(window_event_t));1613 if (event _top) {1614 link_initialize(&event _top->link);1615 event _top->type = ET_POSITION_EVENT;1616 event _top->data.pos.pos_id = pointer->id;1617 event _top->data.pos.type = POS_RELEASE;1618 event _top->data.pos.btn_num = bnum;1619 event _top->data.pos.hpos = point_x;1620 event _top->data.pos.vpos = point_y;1298 event = (window_event_t *) malloc(sizeof(window_event_t)); 1299 if (event) { 1300 link_initialize(&event->link); 1301 event->type = ET_POSITION_EVENT; 1302 event->data.pos.pos_id = pointer->id; 1303 event->data.pos.type = POS_RELEASE; 1304 event->data.pos.btn_num = bnum; 1305 event->data.pos.hpos = point_x; 1306 event->data.pos.vpos = point_y; 1621 1307 } 1622 1308 pointer->grab_flags = GF_EMPTY; 1309 1310 } else if (within_client && (pointer->grab_flags == GF_EMPTY) && (bnum == 1)) { 1311 1312 /* Bring the window to the foreground. */ 1313 list_remove(&win->link); 1314 list_prepend(&win->link, &window_list); 1315 comp_coord_bounding_rect(0, 0, width, height, win->transform, 1316 &dmg_x, &dmg_y, &dmg_width, &dmg_height); 1623 1317 1624 1318 } else { … … 1626 1320 } 1627 1321 1628 } 1629 1630 fibril_mutex_unlock(&pointer_list_mtx); 1631 fibril_mutex_unlock(&window_list_mtx); 1632 1633 #if ANIMATE_WINDOW_TRANSFORMS == 0 1634 comp_damage(dmg_rect1.x, dmg_rect1.y, dmg_rect1.w, dmg_rect1.h); 1635 comp_damage(dmg_rect2.x, dmg_rect2.y, dmg_rect2.w, dmg_rect2.h); 1636 comp_damage(dmg_rect3.x, dmg_rect3.y, dmg_rect3.w, dmg_rect3.h); 1637 comp_damage(dmg_rect4.x, dmg_rect4.y, dmg_rect4.w, dmg_rect4.h); 1638 #endif 1639 1640 if (dmg_width > 0 && dmg_height > 0) { 1641 comp_damage(dmg_x, dmg_y, dmg_width, dmg_height); 1642 } 1643 1644 if (event_unfocus && win_unfocus) { 1645 comp_post_event_win(event_unfocus, win_unfocus); 1646 } 1647 1648 if (event_top) { 1649 comp_post_event_top(event_top); 1322 fibril_mutex_unlock(&window_list_mtx); 1323 1324 if (dmg_width > 0 && dmg_height > 0) { 1325 comp_damage(dmg_x, dmg_y, dmg_width, dmg_height); 1326 } 1327 1328 if (event) { 1329 comp_post_event(event); 1330 } 1650 1331 } 1651 1332 … … 1771 1452 1772 1453 fibril_mutex_unlock(&window_list_mtx); 1773 comp_post_event _top(event);1454 comp_post_event(event); 1774 1455 } else { 1775 1456 fibril_mutex_unlock(&window_list_mtx); … … 1813 1494 event->type = ET_WINDOW_CLOSE; 1814 1495 1815 comp_post_event _top(event);1496 comp_post_event(event); 1816 1497 } else if (win_switch) { 1817 1498 fibril_mutex_lock(&window_list_mtx); … … 1821 1502 list_append(&win1->link, &window_list); 1822 1503 window_t *win2 = (window_t *) list_first(&window_list); 1823 1824 window_event_t *event1 = (window_event_t *) malloc(sizeof(window_event_t));1825 if (event1) {1826 link_initialize(&event1->link);1827 event1->type = ET_WINDOW_UNFOCUS;1828 }1829 1830 window_event_t *event2 = (window_event_t *) malloc(sizeof(window_event_t));1831 if (event2) {1832 link_initialize(&event2->link);1833 event2->type = ET_WINDOW_FOCUS;1834 }1835 1504 1836 1505 sysarg_t x1 = 0; … … 1861 1530 1862 1531 fibril_mutex_unlock(&window_list_mtx); 1863 1864 if (event1 && win1) {1865 comp_post_event_win(event1, win1);1866 }1867 1868 if (event2 && win2) {1869 comp_post_event_win(event2, win2);1870 }1871 1872 1532 comp_damage(x, y, width, height); 1873 1533 } else { … … 1940 1600 fibril_mutex_lock(&window_list_mtx); 1941 1601 1942 window_t *red_win = window_create( 0, 0);1602 window_t *red_win = window_create(); 1943 1603 red_win->surface = surface_create(250, 150, NULL, 0); 1944 1604 pixel_t red_pix = PIXEL(255, 240, 0, 0); … … 1950 1610 list_prepend(&red_win->link, &window_list); 1951 1611 1952 window_t *blue_win = window_create( 0, 0);1612 window_t *blue_win = window_create(); 1953 1613 blue_win->surface = surface_create(200, 100, NULL, 0); 1954 1614 pixel_t blue_pix = PIXEL(255, 0, 0, 240); … … 1960 1620 list_prepend(&blue_win->link, &window_list); 1961 1621 1962 window_t *helenos_win = window_create( 0, 0);1622 window_t *helenos_win = window_create(); 1963 1623 helenos_win->surface = decode_tga((void *) helenos_tga, helenos_tga_size, 0); 1964 1624 list_prepend(&helenos_win->link, &window_list); 1965 1625 1966 window_t *nameic_win = window_create( 0, 0);1626 window_t *nameic_win = window_create(); 1967 1627 nameic_win->surface = decode_tga((void *) nameic_tga, nameic_tga_size, 0); 1968 1628 list_prepend(&nameic_win->link, &window_list); … … 1982 1642 event->data.kbd.c = c; 1983 1643 1984 comp_post_event _top(event);1644 comp_post_event(event); 1985 1645 } 1986 1646 … … 2033 1693 static void input_disconnect(void) 2034 1694 { 2035 pointer_t *pointer = input->user;1695 pointer_t *pointer = input->user; 2036 1696 input_close(input); 2037 1697 pointer_destroy(pointer); … … 2046 1706 { 2047 1707 /* Coordinates of the central pixel. */ 2048 coord_origin = UINT32_MAX / 4;1708 coord_origin = UINT32_MAX / 2; 2049 1709 2050 1710 /* Color of the viewport background. Must be opaque. */ -
uspace/srv/hid/compositor/compositor.h
r69c1995 rce60be1 43 43 typedef desktop_point_t desktop_vector_t; 44 44 45 typedef struct {46 desktop_coord_t x;47 desktop_coord_t y;48 desktop_coord_t w;49 desktop_coord_t h;50 } desktop_rect_t;51 52 45 /* TODO remove? */ 53 46 typedef struct {
Note:
See TracChangeset
for help on using the changeset viewer.