⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.c

📁 CS架构的多平台的GUI系统
💻 C
字号:
/***************************************************************************    begin                : Mon Feb 21 2005    copyright            : (C) 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"#include "../helper/helper.h"#include "sdl.h"#if defined(SINGLE_APP)#else	#include <sys/shm.h>#endifs_video_driver_t s_video_sdl = {	"sdl",	"NULL",	s_video_sdl_kbd_init,	s_video_sdl_kbd_update,	s_video_sdl_kbd_uninit,	s_video_sdl_kbd_switch,	s_video_sdl_mouse_setxrange,	s_video_sdl_mouse_setyrange,	s_video_helper_mouse_setcursor,	s_video_helper_mouse_draw,	s_video_sdl_mouse_update,	s_video_sdl_mouse_uninit,	s_video_sdl_mouse_init,	s_video_sdl_server_init,	s_video_sdl_server_uninit,	s_video_sdl_server_goto_back,	s_video_sdl_server_comefrom_back,	NULL,	s_video_sdl_server_surface_update,	NULL,	NULL};void s_video_sdl_server_goto_back (void){}void s_video_sdl_server_comefrom_back (void){}void s_video_sdl_server_uninit (void){	s_video_sdl_data_t *priv = server->driver->driver_data;#if defined(SINGLE_APP)	s_free((void *) server->window->surface->linear_mem_base);#else	shmdt((void *) server->window->surface->linear_mem_base);#endif	priv->screen->pixels = (char *) s_malloc(1);#if defined(PLATFORM_MINGW)#else	SDL_PrivateQuit();#endif	s_thread_join(priv->event_tid, NULL);	SDL_Quit();	s_free(priv);}int s_video_sdl_server_init (s_server_conf_t *cfg){        void *addr;	s_video_sdl_data_t *priv;	s_video_helper_mode_info_t *gmode;		priv = (s_video_sdl_data_t *) s_malloc(sizeof(s_video_sdl_data_t));	server->driver->driver_data = (void *) priv;        priv->mouse_fd[0] = -1;        priv->mouse_fd[1] = -1;        priv->keybd_fd[0] = -1;        priv->keybd_fd[1] = -1;        	if (SDL_Init(SDL_INIT_VIDEO) < 0) {		debugf(DSER, "Couldn't initialize SDL: %s", SDL_GetError());		goto err0;	}	if (s_video_helper_mode_find(cfg, &gmode)) {		debugf(DSER, "Couldn't find mode: %s", cfg->general.mode);		goto err0;	}	priv->screen = SDL_SetVideoMode(gmode->xdim, gmode->ydim, gmode->bytesperpixel * 8, SDL_SWSURFACE);	if (priv->screen == NULL) {		debugf(DSER, "Couldn't set %dx%dx%d video mode: %s", gmode->xdim, gmode->ydim, gmode->bytesperpixel, SDL_GetError());		goto err1;	} else {		server->window->surface->width = priv->screen->w;		server->window->surface->height = priv->screen->h;		server->window->surface->buf.x = 0;		server->window->surface->buf.y = 0;		server->window->surface->buf.w = priv->screen->w;		server->window->surface->buf.h = priv->screen->h;		server->window->surface->bytesperpixel = priv->screen->format->BytesPerPixel;		server->window->surface->bitsperpixel = priv->screen->format->BitsPerPixel;                server->window->surface->blueoffset = 0;                server->window->surface->greenoffset = 0;                server->window->surface->redoffset = 0;                server->window->surface->bluelength = 0;                server->window->surface->greenlength = 0;                server->window->surface->redlength = 0;                server->window->surface->colors = 0;                switch (server->window->surface->bitsperpixel) {			case 8:				server->window->surface->colors = 256;				server->window->surface->bitsperpixel = 8;				server->window->surface->blueoffset = 0;				server->window->surface->greenoffset = 3;				server->window->surface->redoffset = 6;				server->window->surface->bluelength = 3;				server->window->surface->greenlength = 3;				server->window->surface->redlength = 2;				break;			case 15:				server->window->surface->colors = 32768;				server->window->surface->bitsperpixel = 15;				server->window->surface->blueoffset = 0;				server->window->surface->greenoffset = 5;				server->window->surface->redoffset = 10;				server->window->surface->bluelength = 5;				server->window->surface->greenlength = 5;				server->window->surface->redlength = 5;				break;			case 16:				server->window->surface->colors = 65536;				server->window->surface->bitsperpixel = 16;				server->window->surface->blueoffset = 0;				server->window->surface->greenoffset = 5;				server->window->surface->redoffset = 11;				server->window->surface->bluelength = 5;				server->window->surface->greenlength = 6;				server->window->surface->redlength = 5;				break;			case 24:			case 32:				server->window->surface->colors = 256 * 65536;				server->window->surface->bitsperpixel = server->window->surface->bytesperpixel * 8;				server->window->surface->blueoffset = 0;				server->window->surface->greenoffset = 8;				server->window->surface->redoffset = 16;				server->window->surface->bluelength = 8;				server->window->surface->greenlength = 8;				server->window->surface->redlength = 8;				break;		}#if defined(SINGLE_APP)		addr = (void *) s_malloc(sizeof(char) * server->window->surface->width * server->window->surface->height * server->window->surface->bytesperpixel);#else		if ((priv->screen_shm_mid = shmget(IPC_PRIVATE, sizeof(char) * server->window->surface->width * server->window->surface->height * server->window->surface->bytesperpixel, IPC_CREAT | 0644)) < 0) {			debugf(DSER | DSYS, "Can not get id for shared memory");			goto err1;		}		if ((addr = (void *) shmat(priv->screen_shm_mid, NULL, 0)) < 0) {			debugf(DSER | DSYS, "Can not attach the shared memory");			goto err1;		}		server->window->surface->shm_sid = priv->screen_shm_mid;                shmctl(priv->screen_shm_mid, IPC_RMID, 0);#endif		server->window->surface->linear_mem_base = (unsigned int) addr;		server->window->surface->linear_mem_size = (unsigned int) (sizeof(char) * server->window->surface->width * server->window->surface->height * server->window->surface->bytesperpixel);		priv->screen->pixels = (char *) addr;		server->window->surface->vbuf = (char *) addr;		server->window->surface->linear_buf = (char *) addr;		server->window->surface->need_expose = SURFACE_NEEDEXPOSE;		SDL_WM_SetCaption("Xynth Windowing system (video driver = sdl)", NULL);		priv->event_tid = s_thread_create(&s_video_sdl_event_parse, (void *) NULL);		return gmode->number;	}err1:	SDL_Quit();err0:	s_free(priv);	return -1;}void s_video_sdl_server_surface_update (s_rect_t *coor){	s_rect_t inter;	s_rect_t clip = {0, 0, server->window->surface->width, server->window->surface->height};	s_video_sdl_data_t *priv = server->driver->driver_data;	if (s_rect_intersect(&clip, coor, &inter)) {		return;	}	SDL_UpdateRect(priv->screen, inter.x, inter.y, inter.w, inter.h);}

⌨️ 快捷键说明

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