event.c

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

C
288
字号
/***************************************************************************    begin                : Thu Feb 20 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 "xynth_.h"int s_event_mouse_state (s_window_t *window, s_event_t *event, s_handler_mouse_t *mouse, int over){        int x = mouse->x + window->surface->buf.x;        int y = mouse->y + window->surface->buf.y;        int w = mouse->w;        int h = mouse->h;        int b = mouse->button;		int overbit = MOUSE_OVER << 16;        int type = (event->type & MOUSE_CLICKED) ? event->type &= ~MOUSE_RELEASED : event->type;		if ((type & (MOUSE_PRESSED | MOUSE_CLICKED | MOUSE_RELEASED)) &&	    !(event->mouse->b & b)) {		return -1;	}	if ((event->mouse->x >= x) && (event->mouse->x <= (x + w - 1)) &&	    (event->mouse->y >= y) && (event->mouse->y <= (y + h - 1))) {		if (over != 1) {			goto end;		}		mouse->hstate |= overbit;		if (type & (MOUSE_RELEASED | MOUSE_CLICKED)) {			if (mouse->hstate & event->mouse->b) {				mouse->hstate &= ~event->mouse->b;				return (type & ~MOUSE_EVENT);			} else {				return (type & ~MOUSE_EVENT) | MOUSE_HINT;			}		}		mouse->hstate |= event->mouse->b;		return (type & ~MOUSE_EVENT);	} else {		if (over != 0) {			goto end;		}		if (type & (MOUSE_RELEASED | MOUSE_CLICKED)) {			if (mouse->hstate & event->mouse->b) {				mouse->hstate &= ~event->mouse->b;				return (type & ~MOUSE_EVENT) | MOUSE_HINT2;			}		}		if (mouse->hstate & overbit) {			mouse->hstate &= ~overbit;			return (type & ~MOUSE_EVENT) | MOUSE_HINT2;		}	}end:	return -1;}void s_event_parse_mouse (s_window_t *window, s_event_t *event){        int c;        int pos;	s_handler_t *work;	        c = 0;        pos = 0;	s_thread_mutex_lock(window->handlers->mut);	while (!s_list_eol(window->handlers->list, pos)) {		work = (s_handler_t *) s_list_get(window->handlers->list, pos++);		if (work->type != MOUSE_HANDLER) {			continue;		}		switch (s_event_mouse_state(window, event, &(work->mouse), 1)) {			case MOUSE_OVER:				if (work->mouse.o != NULL) {					s_thread_mutex_unlock(window->handlers->mut);					work->mouse.o(window, event, work);					s_thread_mutex_lock(window->handlers->mut);				}				goto not_over;			case MOUSE_PRESSED:				if (work->mouse.p != NULL) {					s_thread_mutex_unlock(window->handlers->mut);					work->mouse.p(window, event, work);					s_thread_mutex_lock(window->handlers->mut);				}				goto not_over;			case MOUSE_CLICKED:				if (work->mouse.c != NULL) {					s_thread_mutex_unlock(window->handlers->mut);					work->mouse.c(window, event, work);					s_thread_mutex_lock(window->handlers->mut);					work = (s_handler_t *) s_list_get(window->handlers->list, s_list_get_pos(window->handlers->list, work));					if (work == NULL) {						goto not_over;					}				}				/* no break */			case MOUSE_RELEASED:				if (work->mouse.r != NULL) {					s_thread_mutex_unlock(window->handlers->mut);					work->mouse.r(window, event, work);					s_thread_mutex_lock(window->handlers->mut);				}				goto not_over;			case (MOUSE_RELEASED | MOUSE_HINT):				/* mouse button released, but the prev. press was not on us */				if (work->mouse.hr != NULL) {					s_thread_mutex_unlock(window->handlers->mut);					work->mouse.hr(window, event, work);					s_thread_mutex_lock(window->handlers->mut);				}				goto not_over;			case (MOUSE_OVER | MOUSE_HINT):				/* on over, but mouse button is still pressed */				if (work->mouse.ho != NULL) {					s_thread_mutex_unlock(window->handlers->mut);					work->mouse.ho(window, event, work);					s_thread_mutex_lock(window->handlers->mut);				}				goto not_over;		}	}not_over:	pos = 0;	while (!s_list_eol(window->handlers->list, pos)) {		work = (s_handler_t *) s_list_get(window->handlers->list, pos++);		if (work->type != MOUSE_HANDLER) {			continue;		}		switch (s_event_mouse_state(window, event, &(work->mouse), 0)) {			case (MOUSE_OVER | MOUSE_HINT2):				/* not on over, but was on over */				if (work->mouse.oh != NULL) {					s_thread_mutex_unlock(window->handlers->mut);					work->mouse.oh(window, event, work);					s_thread_mutex_lock(window->handlers->mut);				}				goto end;			case (MOUSE_OVER | MOUSE_HINT | MOUSE_HINT2):				/* not on over, but was on over. and button is still pressed */				if (work->mouse.hoh != NULL) {					s_thread_mutex_unlock(window->handlers->mut);					work->mouse.hoh(window, event, work);					s_thread_mutex_lock(window->handlers->mut);				}				goto end;			case (MOUSE_RELEASED | MOUSE_HINT2):				/* mouse button released outside, but the prev. press was on us */				if (work->mouse.rh != NULL) {					s_thread_mutex_unlock(window->handlers->mut);					work->mouse.rh(window, event, work);					s_thread_mutex_lock(window->handlers->mut);				}				goto end;		}	}end:	s_thread_mutex_unlock(window->handlers->mut);	return;}int s_event_parse_keybd (s_window_t *window, s_event_t *event){        int pos;	int ret = 1;	s_handler_t *work;        pos = 0;	s_thread_mutex_lock(window->handlers->mut);	while (!s_list_eol(window->handlers->list, pos)) {		work = (s_handler_t *) s_list_get(window->handlers->list, pos++);		if (work->type != KEYBD_HANDLER) {			continue;		}		if (((work->keybd.flag & event->keybd->flag) == (event->keybd->flag & ~KEYBD_MASL)) &&		    !(work->keybd.flag & ~event->keybd->flag) &&		     (event->keybd->button == work->keybd.button)) {			if (event->type & KEYBD_PRESSED) {				if (work->keybd.p != NULL) {					s_thread_mutex_unlock(window->handlers->mut);					work->keybd.p(window, event, work);					s_thread_mutex_lock(window->handlers->mut);				}				ret = 0;				break;			}			if (event->type & KEYBD_RELEASED) {				if (work->keybd.r != NULL) {					s_thread_mutex_unlock(window->handlers->mut);					work->keybd.r(window, event, work);					s_thread_mutex_lock(window->handlers->mut);				}				ret = 0;				break;			}		}	}	s_thread_mutex_unlock(window->handlers->mut);	return ret;}int s_event_parse_expos (s_window_t *window, s_event_t *event){	s_surface_changed(window, &(event->expose->rect));		if ((event->expose->change & ~EXPOSE_CHNGF) != 0) {		s_window_form_draw(window);	}	return 0;}int s_event_parse_timer (s_window_t *window, s_event_t *event){	if (event->timer->cb != NULL) {		event->timer->cb(window, event->timer);	}	return 0;}int s_event_changed (s_window_t *window){	s_event_t *event;	if (window->event->type & EVENT_MASK) {		if (!s_event_init(&event)) {			event->type = window->event->type;			memcpy(event->mouse, window->event->mouse, sizeof(s_mouse_t));			memcpy(event->keybd, window->event->keybd, sizeof(s_keybd_t));			memcpy(event->expose, window->event->expose, sizeof(s_expose_t));			s_eventq_add(window, event);		}	}	return 0;}int s_event_init (s_event_t **event){	(*event) = (s_event_t *) s_calloc(1, sizeof(s_event_t));	(*event)->mouse = (s_mouse_t *) s_calloc(1, sizeof(s_mouse_t));	(*event)->keybd = (s_keybd_t *) s_calloc(1, sizeof(s_keybd_t));	(*event)->expose = (s_expose_t *) s_calloc(1, sizeof(s_expose_t));	(*event)->desktop = (s_desktop_t *) s_calloc(1, sizeof(s_desktop_t));	(*event)->desktop->clients = (s_list_t *) s_calloc(1, sizeof(s_list_t));	if (s_list_init((*event)->desktop->clients)) {		goto err0;	}	return 0;err0:	s_free((*event)->desktop->clients);	s_free((*event)->desktop);	s_free((*event)->expose);	s_free((*event)->keybd);	s_free((*event)->mouse);	s_free(*event);	return -1;}int s_event_uninit (s_event_t *event){	s_desktop_client_t *desktopc;	while (!s_list_eol(event->desktop->clients, 0)) {		desktopc = (s_desktop_client_t *) s_list_get(event->desktop->clients, 0);		s_list_remove(event->desktop->clients, 0);		s_free(desktopc->title);		s_free(desktopc);	}	s_free(event->desktop->clients);	s_free(event->desktop);	s_free(event->expose);        s_free(event->mouse);        s_free(event->keybd);	s_free(event);	return 0;}

⌨️ 快捷键说明

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