event.c

来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 249 行

C
249
字号
/***************************************************************************    begin                : Wed Feb 19 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_event_parse_keyboard (void){	s_keybd_driver_t keybd;	S_KEYCODE_FLAG keycode_flag;	        memset(&keybd, 0, sizeof(s_keybd_driver_t));        	s_server_kbd_update(&keybd);        keycode_flag = server->window->event->keybd->flag;        	if (keybd.state == KEYBD_PRESSED) {		switch (keybd.keycode) {			case S_KEYCODE_NUM_LOCK:				keycode_flag ^= KEYCODE_NMLCKF;				break;			case S_KEYCODE_CAPS_LOCK:				keycode_flag ^= KEYCODE_CPLCKF;				break;			case S_KEYCODE_LEFTCONTROL:				keycode_flag |= KEYCODE_LCTRLF;				break;			case S_KEYCODE_RIGHTCONTROL:				keycode_flag |= KEYCODE_RCTRLF;				break;			case S_KEYCODE_LEFTSHIFT:				keycode_flag |= KEYCODE_LSHIFTF;				break;			case S_KEYCODE_RIGHTSHIFT:				keycode_flag |= KEYCODE_RSHIFTF;				break;			case S_KEYCODE_ALT:				keycode_flag |= KEYCODE_LALTF;				break;			case S_KEYCODE_ALTGR:				keycode_flag |= KEYCODE_RALTF;				break;		}	} else {		switch (keybd.keycode) {			case S_KEYCODE_NUM_LOCK:			case S_KEYCODE_CAPS_LOCK:				break;			case S_KEYCODE_LEFTCONTROL:				keycode_flag &= ~KEYCODE_LCTRLF;				break;			case S_KEYCODE_RIGHTCONTROL:				keycode_flag &= ~KEYCODE_RCTRLF;				break;			case S_KEYCODE_LEFTSHIFT:				keycode_flag &= ~KEYCODE_LSHIFTF;				break;			case S_KEYCODE_RIGHTSHIFT:				keycode_flag &= ~KEYCODE_RSHIFTF;				break;			case S_KEYCODE_ALT:				keycode_flag &= ~KEYCODE_LALTF;				break;			case S_KEYCODE_ALTGR:				keycode_flag &= ~KEYCODE_RALTF;				break;		}	}	server->window->event->type |= (KEYBD_EVENT | keybd.state);	server->window->event->keybd->flag = keycode_flag;	server->window->event->keybd->scancode = keybd.scancode;	server->window->event->keybd->button = keybd.button;	server->window->event->keybd->keycode = keybd.keycode;	server->window->event->keybd->ascii = keybd.ascii;	server->window->event->keybd->state[keybd.keycode] = keybd.state;}int s_server_event_parse_mouse (void){	long long time;	s_mouse_driver_t mouse;	memset(&mouse, 0, sizeof(s_mouse_driver_t));	if (s_server_mouse_update(&mouse)) {		return 1;	}	time = s_gettimeofday();	server->window->event->type |= MOUSE_EVENT;	if ((server->window->event->mouse->x != mouse.x) ||	    (server->window->event->mouse->y != mouse.y)) {		server->window->event->mouse->x = mouse.x;		server->window->event->mouse->y = mouse.y;		s_server_mouse_draw();	}	server->window->event->mouse->pbuttons = server->window->event->mouse->buttons;	server->window->event->mouse->buttons = mouse.buttons;        if (server->window->event->mouse->buttons > server->window->event->mouse->pbuttons) {		server->window->event->type |= MOUSE_PRESSED;		server->window->event->mouse->b = (server->window->event->mouse->buttons & ~(server->window->event->mouse->pbuttons));		server->window->event->mouse->pb = server->window->event->mouse->b;		server->window->event->mouse->px = server->window->event->mouse->x;		server->window->event->mouse->py = server->window->event->mouse->y;	} else if (server->window->event->mouse->buttons < server->window->event->mouse->pbuttons) {		server->window->event->mouse->b = (~(server->window->event->mouse->buttons) & server->window->event->mouse->pbuttons);		if ((server->window->event->mouse->buttons == 0) &&		    (server->window->event->mouse->b == server->window->event->mouse->pb) &&		    (server->window->event->mouse->x == server->window->event->mouse->px) &&		    (server->window->event->mouse->y == server->window->event->mouse->py) &&		    (time - server->window->event->mouse->time <= (unsigned int) 250)) {			server->window->event->type |= (MOUSE_CLICKED | MOUSE_RELEASED);			if (time - server->window->event->mouse->ctime <= (unsigned int) 500) {				server->window->event->mouse->clicks++;			} else {				server->window->event->mouse->clicks = 1;			}			server->window->event->mouse->ctime = time;		} else {			server->window->event->type |= MOUSE_RELEASED;			server->window->event->mouse->clicks = 0;		}	} else {		if (server->window->event->mouse->buttons == 0) {			server->window->event->type |= MOUSE_OVER;			server->window->event->mouse->b = 0;		} else {			server->window->event->type |= (MOUSE_OVER | MOUSE_HINT);			server->window->event->mouse->b = 0;		}	}	/* this is a pre-patch for wheel buttons */	server->window->event->mouse->buttons &= ~MOUSE_MASL;	server->window->event->mouse->time = time;	return 0;}int s_event_changed_ (s_window_t *window){	int r = 1;	s_event_t *event;		if (server->ph > 0) {		/* do not parse || send any mouse or keybd event until buttons released		 */		if (window->event->mouse->buttons == 0) {			server->ph = 0;		}//		return 0;	}		if (window->event->type & MOUSE_EVENT) {		if (!s_event_init(&event)) {			event->type = window->event->type;			memcpy(event->mouse, window->event->mouse, sizeof(s_mouse_t));			s_event_parse_mouse(window, event);			s_event_uninit(event);		}	}	if (window->event->type & KEYBD_EVENT) {		if (!s_event_init(&event)) {			event->type = window->event->type;			memcpy(event->keybd, window->event->keybd, sizeof(s_keybd_t));			r = s_event_parse_keybd(window, event);			s_event_uninit(event);		}	}	return r;}void s_server_event_changed (void){	int id;	id = server->cursor.xyid;	if (server->window->event->type & MOUSE_EVENT) {		server->window->event->type &= MOUSE_MASK;		if (server->window->event->type & MOUSE_PRESSED) {			if ((id != s_server_pri_id(0)) && (id < S_CLIENTS_MAX) && (!server->mh)) {				if (server->window->event->mouse->b == server->window->event->mouse->buttons) {					server->ph = 1;					s_server_pri_set(SURFACE_FOCUS, id);//					return;				}			}		}	} else if (server->window->event->type & KEYBD_EVENT) {		server->window->event->type &= KEYBD_MASK;		if (server->window->event->mouse->buttons > 0) {			return;		}	} else {		return;	}	if (s_event_changed_(server->window)) {		if (server->window->event->type & MOUSE_EVENT) {			if (server->window->event->type & MOUSE_PRESSED) {				if ((server->window->event->mouse->b == 4) &&				    (server->window->event->keybd->flag == KEYCODE_LALTF)) {					s_server_window_move(server->window);					return;				}			}		}		s_server_socket_request(SOC_DATA_EVENT, s_server_pri_id(0));	}}void s_server_event_parse (S_EVENT event){	server->window->event->type = 0;	switch (event) {		case KEYBD_EVENT:			s_server_event_parse_keyboard();			break;		case MOUSE_EVENT:			if (s_server_event_parse_mouse()) {				return;			}			break;		default:			break;	}	s_server_event_changed();}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?