mouse.c
来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 304 行
C
304 行
/*************************************************************************** begin : Fri Jan 31 2003 copyright : (C) 2003 - 2005 by Alper Akcan email : distchx@yahoo.com ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 2.1 of the * * License, or (at your option) any later version. * * * ***************************************************************************/#include "../lib/xynth_.h"#include "server.h"void s_server_cursor_uninit (void){ int i; if (server->cursor.sw == 0) { return; } for (i = 0; i < MOUSE_CURSOR_MAX; i++) { s_free(server->cursor.images[i].mat); s_free(server->cursor.images[i].buf); } server->cursor.sw = 0;}void s_server_cursor_init (void){ int i; if (server->cursor.sw == 1) { return; } server->cursor.x = 0; server->cursor.y = 0; for (i = 0; i < MOUSE_CURSOR_MAX; i++) { server->cursor.images[i].mat = NULL; server->cursor.images[i].buf = NULL; } server->cursor.sw = 1;}void s_server_cursor_image_set (int which, int c0, int c1, unsigned int *c){ int x; int y; s_surface_t s; unsigned char *mat; unsigned int *cur = c; if (server->cursor.sw == 0) { return; } server->cursor.images[which].w = 32; server->cursor.images[which].h = 32; if (server->cursor.images[which].mat != NULL) { s_free(server->cursor.images[which].mat); server->cursor.images[which].mat = NULL; } if (server->cursor.images[which].buf != NULL) { s_free(server->cursor.images[which].buf); server->cursor.images[which].buf = NULL; } server->cursor.images[which].mat = (unsigned char *) s_malloc(sizeof(char) * 32 * 32); server->cursor.images[which].buf = (char *) s_malloc(server->window->surface->bytesperpixel * 32 * 32); mat = server->cursor.images[which].mat; for (y = 0; y < 32; y++) { for (x = 0; x < 32; x++) { if ((*(cur + 32) << x) & (1 << 31)) { *mat = 1; } else { *mat = 0; } mat++; } cur++; } s_getsurfacevirtual(&s, server->cursor.images[which].w, server->cursor.images[which].h, server->window->surface->bitsperpixel, server->cursor.images[which].buf); cur = c; for (y = 0; y < 32; y++) { for (x = 0; x < 32; x++) { if ((*cur << x) & (1 << 31)) { s_setpixel(&s, x, y, c1); } else if ((*(cur + 32) << x) & (1 << 31)) { s_setpixel(&s, x, y, c0); } } cur++; }}void s_server_cursor_matrix_add (void){ s_rect_t mcoor; if (server->cursor.sw == 0) { return; } mcoor.x = server->cursor.x; mcoor.y = server->cursor.y; mcoor.w = server->cursor.img->w; mcoor.h = server->cursor.img->h; server->cursor.xyid = *(server->window->surface->matrix + (server->window->event->mouse->y * server->window->surface->width) + server->window->event->mouse->x); s_server_surface_matrix_add_this(S_MATRIX_SWMOUSE, &mcoor, &mcoor, server->cursor.img->mat);}void s_server_cursor_matrix_del (void){ s_rect_t mcoor; if (server->cursor.sw == 0) { return; } mcoor.x = server->cursor.x; mcoor.y = server->cursor.y; mcoor.w = server->cursor.img->w; mcoor.h = server->cursor.img->h; s_server_surface_matrix_del_this(S_MATRIX_SWMOUSE, &mcoor, server->cursor.img->mat);}void s_server_cursor_draw (void){ s_rect_t mcoor; if (server->cursor.sw == 0) { return; } mcoor.x = server->cursor.x; mcoor.y = server->cursor.y; mcoor.w = server->cursor.img->w; mcoor.h = server->cursor.img->h; s_server_putbox(server->window, S_MATRIX_SWMOUSE, &mcoor, server->cursor.x, server->cursor.y, server->cursor.img);}void s_server_cursor_select (S_MOUSE_CURSOR c){ if (server->cursor.sw == 0) { return; } switch (c) { case MOUSE_CURSOR_WAIT: server->cursor.img = &server->cursor.images[MOUSE_CURSOR_WAIT]; break; case MOUSE_CURSOR_ARROW: server->cursor.img = &server->cursor.images[MOUSE_CURSOR_ARROW]; break; case MOUSE_CURSOR_POINT: server->cursor.img = &server->cursor.images[MOUSE_CURSOR_POINT]; break; case MOUSE_CURSOR_CROSS: server->cursor.img = &server->cursor.images[MOUSE_CURSOR_CROSS]; break; case MOUSE_CURSOR_IBEAM: server->cursor.img = &server->cursor.images[MOUSE_CURSOR_IBEAM]; break; case MOUSE_CURSOR_SIZES: server->cursor.img = &server->cursor.images[MOUSE_CURSOR_SIZES]; break; case MOUSE_CURSOR_SIZEB: server->cursor.img = &server->cursor.images[MOUSE_CURSOR_SIZEB]; break; case MOUSE_CURSOR_SIZEV: server->cursor.img = &server->cursor.images[MOUSE_CURSOR_SIZEV]; break; case MOUSE_CURSOR_SIZEH: server->cursor.img = &server->cursor.images[MOUSE_CURSOR_SIZEH]; break; case MOUSE_CURSOR_SIZEA: server->cursor.img = &server->cursor.images[MOUSE_CURSOR_SIZEA]; break; case MOUSE_CURSOR_FORBID: server->cursor.img = &server->cursor.images[MOUSE_CURSOR_FORBID]; break; case MOUSE_CURSOR_SPLITH: server->cursor.img = &server->cursor.images[MOUSE_CURSOR_SPLITH]; break; case MOUSE_CURSOR_SPLITV: server->cursor.img = &server->cursor.images[MOUSE_CURSOR_SPLITV]; break; case MOUSE_CURSOR_UPARROW:server->cursor.img = &server->cursor.images[MOUSE_CURSOR_UPARROW];break; default: break; }}void s_server_cursor_position (int x, int y){ s_rect_t coor; s_rect_t clip; if (server->cursor.sw == 0) { return; } coor.x = MIN(x, server->cursor.x); coor.y = MIN(y, server->cursor.y); coor.w = MAX(x + server->cursor.img->w, server->cursor.x + server->cursor.img->w) - coor.x; coor.h = MAX(y + server->cursor.img->h, server->cursor.y + server->cursor.img->h) - coor.y; if (s_rect_clip_virtual(server->window->surface, coor.x, coor.y, coor.w, coor.h, &clip)) { return; } s_server_cursor_matrix_del(); server->cursor.x = x; server->cursor.y = y; s_server_pri_set(SURFACE_REDRAW, &clip);}int s_mouse_getx (void){ return server->window->event->mouse->x;}int s_mouse_gety (void){ return server->window->event->mouse->y;}void s_mouse_setxrange (s_window_t *window, int a, int b){ int x0 = a; int x1 = b; if (x0 < 0) { x0 = 0; } if (x1 >= window->surface->width) { x1 = window->surface->width - 1; } if (server->driver->mouse_setxrange != NULL) { server->driver->mouse_setxrange(x0, x1); }}void s_mouse_setyrange (s_window_t *window, int a, int b){ int y0 = a; int y1 = b; if (y0 < 0) { y0 = 0; } if (y1 >= window->surface->height) { y1 = window->surface->height - 1; } if (server->driver->mouse_setyrange != NULL) { server->driver->mouse_setyrange(y0, y1); }}void s_server_mouse_setcursor (S_MOUSE_CURSOR c){ if (server->driver->mouse_setcursor != NULL) { server->driver->mouse_setcursor(c); }}void s_server_mouse_draw (void){ if (server->driver->mouse_draw != NULL) { server->driver->mouse_draw(); }}int s_server_mouse_update (s_mouse_driver_t *mouse){ if (server->driver->mouse_update != NULL) { return server->driver->mouse_update(mouse); } return -1;}int s_server_mouse_uninit (s_window_t *window, int fd){ if (server->driver->mouse_uninit != NULL) { server->driver->mouse_uninit(); } return 0;}int s_server_mouse_in_f (s_window_t *window, int s){ s_server_event_parse(MOUSE_EVENT); return 0;}void s_server_mouse_init (s_server_conf_t *cfg){ int fd = -1; s_pollfd_t *pfd; if (server->driver->mouse_init != NULL) { if (strcasecmp(cfg->mouse.type, "MOUSE_NONE") != 0) { fd = server->driver->mouse_init(cfg); if (fd < 0) { debugf(DSER, "server->driver->mouse_init(cfg) failed"); } } } if (fd < 0) { debugf(DSER, "mouse support disabled"); } else { s_pollfd_init(&pfd); pfd->fd = fd; pfd->pf_in = s_server_mouse_in_f; pfd->pf_close = s_server_mouse_uninit; s_pollfd_add(server->window, pfd); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?