client.c

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

C
188
字号
/***************************************************************************    begin                : Thu Jan 30 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_client_init (s_window_t **window){	s_window_t *w;	w = (s_window_t *) s_calloc(1, sizeof(s_window_t));        w->client = (s_client_t *) s_calloc(1, sizeof(s_client_t));	if (s_surface_init(w))       { goto err1; }	if (s_pollfds_init(w))       { goto err2; }	if (s_timers_init(w))        { goto err3; }	if (s_socket_init(w))        { goto err4; }        if (s_handlers_init(w))      { goto err4; }	if (s_childs_init(w))        { goto err5; }	if (s_eventq_init(w))        { goto err6; }	if (s_event_init(&w->event)) { goto err7; }	w->running = 1;        w->client->id = -1;        w->client->pri = -1;        w->client->resizeable = 1;	*window = w;        if (s_socket_request(w, SOC_DATA_DISPLAY)) { goto err8; }	return 0;err8:	s_event_uninit(w->event);err7:	s_eventq_uninit(w);err6:	s_childs_uninit(w);err5:	s_handlers_uninit(w);err4:	s_timers_uninit(w);err3:	s_pollfds_uninit(w);err2:	s_free(w->surface);err1:	s_free(w->client);	s_free(w);	debugf(DCLI | DFAT, "Cannot connect to server");	return -1;}void s_client_uninit (s_window_t *window){	if (window == NULL) {		return;	}	s_childs_uninit(window);        window->event->type = QUIT_EVENT;        s_event_changed(window);	s_thread_join(window->eventq->tid, NULL);        if (window->type & (WINDOW_TEMP | WINDOW_CHILD)) {		s_child_del(window->parent, window);	}	debugf(DCLI, "[%d] Exiting (%s%s))", window->client->id, (window->type & WINDOW_MAIN) ? "WINDOW_MAIN" :	                                                          ((window->type & WINDOW_CHILD) ? "WINDOW_CHILD" :	                                                          ((window->type & WINDOW_TEMP) ? "WINDOW_TEMP" :	                                                          ((window->type & WINDOW_DESKTOP) ? "WINDOW_DESKTOP" : "WINDOW_UNKNOWN"))),	                                                         (window->type & NO_FORM) ? " | NO_FORM" : "");	s_timers_uninit(window);	s_pollfds_uninit(window);	s_handlers_uninit(window);	s_eventq_uninit(window);	if (window->client->atexit != NULL) {		window->client->atexit(window);	}	s_surface_uninit(window);	s_event_uninit(window->event);        s_free(window->client->device);        s_free(window->client->driver);	s_free(window->client->title);	s_free(window->client);	s_free(window);	window = NULL;}void s_client_exit (s_window_t *window){	if (window == NULL) {		return;	}	s_client_uninit(window);}void s_client_quit (s_window_t *window){	window->running = 0;	s_client_wakeup(window);}int s_client_wakeup (s_window_t *window){	int w = 0;	return s_pipe_api_write(window->wsoc, &w, sizeof(int));}void * s_client_loop_event (void *arg){	s_event_t *event;	s_window_t *window;	window = (s_window_t *) arg;	while (window->running > 0) {		if (s_eventq_wait(window, &event) != 0) {			continue;		}        	if (window->client->atevent != NULL) {			window->client->atevent(window, event);		}		switch (event->type & EVENT_MASK) {			case QUIT_EVENT:   window->running = 0;                break;			case MOUSE_EVENT:  s_event_parse_mouse(window, event); break;			case KEYBD_EVENT:  s_event_parse_keybd(window, event); break;			case EXPOSE_EVENT: s_event_parse_expos(window, event); break;			case DESKTOP_EVENT:				       break;			case TIMER_EVENT:  s_event_parse_timer(window, event); break;		}		s_event_uninit(event);	}	return NULL;}void * s_client_loop (void *arg){	s_window_t *window = (s_window_t *) arg;	window->eventq->tid = s_thread_create(&s_client_loop_event, (void *) window);	while (window->running > 0) {		if (s_socket_listen_wait(window, -1)) {			break;		}	}	s_client_exit(window);	return NULL;}void * s_client_main (void *arg){	s_window_t *window = (s_window_t *) arg;		switch (window->type & ~(NO_FORM | WINDOW_DESKTOP)) {		case WINDOW_MAIN:			s_client_loop(window);			break;		case WINDOW_TEMP:		case WINDOW_CHILD:			window->tid = s_thread_create(&s_client_loop, (void *) window);			s_child_add(window->parent, window);			break;	}	return NULL;}void s_client_atevent (s_window_t *window, void (*f) (s_window_t *, s_event_t *)){	window->client->atevent = f;}void s_client_atexit (s_window_t *window, void (*f) (s_window_t *)){	window->client->atexit = f;}

⌨️ 快捷键说明

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