server.c
来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 405 行
C
405 行
/*************************************************************************** begin : Wed Jan 29 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"#if defined(PLATFORM_LINUX) #include <fcntl.h>#endif#if !defined(SINGLE_APP) #include <sys/shm.h>#endif#if defined(VIDEO_FBDev) extern s_video_driver_t s_video_fbdev;#endif#if defined(VIDEO_VESA) extern s_video_driver_t s_video_vesa;#endif#if defined(VIDEO_SVGALib) extern s_video_driver_t s_video_svga;#endif#if defined(VIDEO_SDL) extern s_video_driver_t s_video_sdl;#endif#if defined(VIDEO_GDI) extern s_video_driver_t s_video_gdi;#endif#if defined(VIDEO_PSPDEV) extern s_video_driver_t s_video_pspdev;#endif#if defined(VIDEO_NULL) extern s_video_driver_t s_video_null;#endifstatic s_video_driver_t *video_drivers[] = {#if defined(VIDEO_FBDev) &s_video_fbdev,#endif#if defined(VIDEO_VESA) &s_video_vesa,#endif#if defined(VIDEO_SVGALib) &s_video_svga,#endif#if defined(VIDEO_SDL) &s_video_sdl,#endif#if defined(VIDEO_GDI) &s_video_gdi,#endif#if defined(VIDEO_PSPDEV) &s_video_pspdev,#endif#if defined(VIDEO_NULL) &s_video_null,#endif NULL,};int s_server_cfg_check_digit (char *ptr, char *digits){ if (ptr == NULL) { return 0; } return (strlen(ptr) == strspn(ptr, digits));}char * s_server_cfg_token (char **ptr){ char *p; p = *ptr; while(*p == ' ') { p++; } if (*p != '\0' ) { char *t = p; while ((*t != '\0') && (*t != ' ')) { t++; } if (*t == ' ') { *t = '\0'; t++; } *ptr = t; return p; } else { *ptr = NULL; return NULL; }}int s_server_cfg (s_server_conf_t *config){ int i; int j; int ret = 0; s_config_t *cfg; s_config_cat_t *cat; s_config_var_t *var; s_config_init(&cfg); if (s_config_parse(cfg, CONFDIR "xynth.conf")) { debugf(DSER, "Configuration file parsing failed (%s)", CONFDIR "xynth.conf"); s_config_uninit(cfg); return -1; } i = 0; while (!s_list_eol(cfg->category, i)) { cat = s_list_get(cfg->category, i++); j = 0; while (!s_list_eol(cat->variable, j)) { var = s_list_get(cat->variable, j++); if (strcasecmp(cat->name, "general") == 0) { if (strcasecmp(var->name, "driver") == 0) { config->general.driver = strdup(var->value); } else if (strcasecmp(var->name, "mode") == 0) { config->general.mode = strdup(var->value); } } else if (strcasecmp(cat->name, "mouse") == 0) { if (strcasecmp(var->name, "type") == 0) { config->mouse.type = strdup(var->value); } else if (strcasecmp(var->name, "device") == 0) { config->mouse.device = strdup(var->value); } else if (strcasecmp(var->name, "samplerate") == 0) { config->mouse.samplerate = atoi(var->value); } else if (strcasecmp(var->name, "scale") == 0) { config->mouse.scale = atoi(var->value); if (config->mouse.scale == 0) { config->mouse.scale = 1; } } } else if (strcasecmp(cat->name, "monitor") == 0) { char *ptr; char *nptr; char *nptr_; char digits[] = ".0123456789"; if (strcasecmp(var->name, "horizsync") == 0) { nptr = strdup(var->value); nptr_ = nptr; ptr = s_server_cfg_token(&nptr); if (s_server_cfg_check_digit(ptr, digits)) { config->monitor.horizsync_min = atof(ptr); } else { goto hs_bad; } ptr = s_server_cfg_token(&nptr); if (s_server_cfg_check_digit(ptr, digits)) { config->monitor.horizsync_max = atof(ptr); } else {hs_bad: debugf(DSER, "Illegal horizsync setting. Correct usage: horizsync min_kHz max_kHz\n"); ret = -1; } s_free(nptr_); } else if (strcasecmp(var->name, "vertrefresh") == 0) { nptr = strdup(var->value); nptr_ = nptr; ptr = s_server_cfg_token(&nptr); if (s_server_cfg_check_digit(ptr, digits)) { config->monitor.vertrefresh_min = atof(ptr); } else { goto vr_bad; } ptr = s_server_cfg_token(&nptr); if (s_server_cfg_check_digit(ptr, digits)) { config->monitor.vertrefresh_max = atof(ptr); } else {vr_bad: debugf(DSER, "Illegal vertrefresh setting. Correct usage: vertrefresh min_Hz max_Hz\n"); ret = -1; } s_free(nptr_); } } } } s_config_uninit(cfg); { s_video_driver_t **vd; for (vd = video_drivers; *vd; vd++) { if (strcmp((*vd)->driver, config->general.driver) == 0) { server->driver = *vd; } } if (server->driver == NULL) { debugf(DSER, "Unknown video driver : %s", config->general.driver); ret = -1; } } return ret;}int s_server_init (void){ int i; int mode; void *addr; s_server_conf_t config;#if defined(PLATFORM_LINUX) int fd[2]; setvbuf(stdout, (char *) NULL, _IONBF, 0); setvbuf(stderr, (char *) NULL, _IONBF, 0); fd[0] = fcntl(fileno(stdout), F_DUPFD, 0); fd[1] = fcntl(fileno(stderr), F_DUPFD, 0);#endif server = (s_server_t *) s_calloc(1, sizeof(s_server_t)); for (i = 0; i < S_CLIENTS_MAX; i++) { server->id[i] = -1; server->pri[i] = -1; server->client[i].pid = -1; server->client[i].soc = -1; server->client[i].type = 0; server->client[i].resizeable = 1; } config.general.driver = NULL; config.general.mode = NULL; config.mouse.type = NULL; config.mouse.device = NULL; server->window = (s_window_t *) s_calloc(1, sizeof(s_window_t)); server->window->surface = (s_surface_t *) s_calloc(1, sizeof(s_surface_t)); if (s_server_cfg(&config)) { debugf(DSER, "Error while loading configuration file"); goto err0; } server->window->surface->buf.w = 0; server->window->surface->buf.h = 0; server->window->surface->linear_buf_width = 0; server->window->surface->linear_buf_pitch = 0; server->window->surface->linear_buf_height = 0; if (server->driver->server_init != NULL) { mode = server->driver->server_init(&config); if (mode < 0) { debugf(DSER, "server->driver->server_init(&config) failed"); goto err0; } } else { debugf(DSER, "server->driver->server_init == NULL"); goto err0; } server->window->surface->buf.w = server->window->surface->width; server->window->surface->buf.h = server->window->surface->height; server->window->surface->linear_buf_width = server->window->surface->width; if (server->window->surface->linear_buf_pitch == 0) { server->window->surface->linear_buf_pitch = server->window->surface->width; } server->window->surface->linear_buf_height = server->window->surface->height;#if defined(PLATFORM_LINUX) close(fileno(stdout)); fcntl(fd[0], F_DUPFD, 0); close(fileno(stderr)); fcntl(fd[1], F_DUPFD, 0);#endif#if defined(SINGLE_APP) addr = (void *) s_malloc(sizeof(char) * server->window->surface->width * server->window->surface->height);#else if ((server->window->surface->shm_mid = shmget(IPC_PRIVATE, sizeof(char) * server->window->surface->width * server->window->surface->height, IPC_CREAT | 0644)) < 0) { debugf(DSER | DSYS | DFAT, "Can not get id for shared memory"); } if ((addr = (void *) shmat(server->window->surface->shm_mid, NULL, 0)) < 0) { debugf(DSER | DSYS | DFAT, "Can not attach the shared memory"); } shmctl(server->window->surface->shm_mid, IPC_RMID, 0);#endif server->window->surface->matrix = (unsigned char *) addr; server->window->surface->mode = SURFACE_REAL; server->mode = mode; s_event_init(&server->window->event); s_handlers_init(server->window); s_pollfds_init(server->window); s_timers_init(server->window); s_server_socket_init(); s_server_mouse_init(&config); s_server_kbd_init(&config); for (i = 0; i < 20; i++) { s_handler_init(&(server->whndl[i])); } s_free(config.general.driver); s_free(config.general.mode); s_free(config.mouse.type); s_free(config.mouse.device); server->window->running = 1; return 0;err0: s_free(config.general.driver); s_free(config.general.mode); s_free(config.mouse.type); s_free(config.mouse.device); s_free(server->window->surface); s_free(server->window); return 1;}void s_server_quit (s_window_t *window){ s_client_quit(window);}void s_server_uninit (void){ int i; int v; s_server_window_handlers_del_mouse(); for (i = 0; i < 20; i++) { s_handler_uninit(server->whndl[i]); } s_timers_uninit(server->window); s_pollfds_uninit(server->window); s_handlers_uninit(server->window); s_server_theme_uninit(); for (i = 0; i < S_CLIENTS_MAX; i++) { s_free(server->client[i].title.str); for (v = 0; v < 2; v++) { s_free(server->client[i].title.img[v].mat); s_free(server->client[i].title.img[v].buf); } } s_event_uninit(server->window->event); if (server->driver->server_uninit != NULL) { server->driver->server_uninit(); }#if defined(SINGLE_APP) s_free(server->window->surface->matrix);#else shmdt(server->window->surface->matrix);#endif s_free(server->window->surface); s_free(server->window);// s_free(server); s_socket_api_uninit();}void s_server_goto_back (void){ if (server->driver->server_goto_back != NULL) { server->driver->server_goto_back(); }}void s_server_comefrom_back (void){ if (server->driver->server_comefrom_back != NULL) { server->driver->server_comefrom_back(); }}void s_server_restore (void){ if (server->driver->server_restore != NULL) { server->driver->server_restore(); }}void s_server_fullscreen (void){ if (server->driver->server_fullscreen != NULL) { server->driver->server_fullscreen(); }}void s_server_surface_update (s_rect_t *coor){ s_rect_t clip; if (server->driver->server_surface_update != NULL) { if (s_rect_clip_virtual(server->window->surface, coor->x, coor->y, coor->w, coor->h, &clip)) { return; } server->driver->server_surface_update(&clip); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?