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 + -
显示快捷键?