socket.c
来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 612 行 · 第 1/2 页
C
612 行
/*************************************************************************** begin : Sun Feb 2 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 <sys/stat.h>#include "../lib/xynth_.h"#include "server.h"#if !defined(IPC_UDS) && !defined(IPC_TCP) && !defined(IPC_PIPE) #error "You must select at least one of IPC_UDS, IPC_TCP, IPC_PIPE"#endif#define s_socket_recv(a, b, c) if (s_socket_api_recv(a, b, c) != c) { return -1; }#define s_socket_send(a, b, c) if (s_socket_api_send(a, b, c) != c) { return -1; }int s_server_socket_listen_new (int id){ int i; int j; s_pollfd_t *ip; s_pollfd_t *jp; s_socket_recv(server->client[id].soc, &server->client[id].type, sizeof(S_WINDOW)); s_socket_recv(server->client[id].soc, &server->client[id].pid, sizeof(int)); s_socket_recv(server->client[id].soc, &server->client[id].buf, sizeof(s_rect_t)); /* just to close childs before their parent, socket listen order is in pollfds list order. */ if (server->client[id].pid >= 0) { ip = s_pollfd_find(server->window, server->client[id].soc); jp = s_pollfd_find(server->window, server->client[server->client[id].pid].soc); if ((ip != NULL) && (jp != NULL)) { i = s_list_get_pos(server->window->pollfds->list, ip); j = s_list_get_pos(server->window->pollfds->list, jp); if (j < i) { s_list_remove(server->window->pollfds->list, i); s_list_add(server->window->pollfds->list, ip, j); } } } s_server_window_new(id); s_socket_send(server->client[id].soc, &server->client[id].buf, sizeof(s_rect_t)); s_socket_send(server->client[id].soc, &server->client[id].win, sizeof(s_rect_t)); return 0;}int s_server_socket_listen_show (int id){ s_server_pri_set(SURFACE_FOCUS, id); return 0;}int s_server_socket_listen_title (int id){ int i; s_socket_recv(server->client[id].soc, &i, sizeof(int)); s_free(server->client[id].title.str); server->client[id].title.str = (char *) s_malloc(sizeof(char) * (i + 1)); s_socket_recv(server->client[id].soc, server->client[id].title.str, sizeof(char) * (i + 1)); s_server_window_title(id, server->client[id].title.str); if (s_server_id_pri(id) >= 0) { s_rect_t *rtmp; s_list_t *diff; if (server->mh) { server->mh = 0; } s_server_window_calculate(id); diff = (s_list_t *) s_malloc(sizeof(s_list_t)); s_list_init(diff); s_rect_difference(&(server->client[id].win), &(server->client[id].buf), diff); while (!s_list_eol(diff, 0)) { rtmp = (s_rect_t *) s_list_get(diff, 0); s_server_pri_set(SURFACE_REDRAW, rtmp); s_list_remove(diff, 0); s_free(rtmp); } s_free(diff); if (!(server->client[id].type & WINDOW_TEMP)) { for (i = 0; i < S_CLIENTS_MAX; i++) { if (server->client[i].type & WINDOW_DESKTOP) { s_server_socket_request(SOC_DATA_DESKTOP, i); } } } } return 0;}int s_server_socket_listen_display (int id){ int len; unsigned int addr; s_socket_send(server->client[id].soc, &server->window->surface->bytesperpixel, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->bitsperpixel, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->colors, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->blueoffset, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->greenoffset, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->redoffset, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->bluelength, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->greenlength, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->redlength, sizeof(int)); addr = (unsigned int) server->window->surface->linear_buf; s_socket_send(server->client[id].soc, &addr, sizeof(unsigned int)); addr = (unsigned int) server->window->surface->matrix; s_socket_send(server->client[id].soc, &addr, sizeof(unsigned int)); s_socket_send(server->client[id].soc, &server->window->surface->linear_mem_size, sizeof(unsigned int)); s_socket_send(server->client[id].soc, &server->window->surface->linear_mem_base, sizeof(unsigned int)); s_socket_send(server->client[id].soc, &server->window->surface->linear_buf_width, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->linear_buf_pitch, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->linear_buf_height, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->shm_mid, sizeof(int)); s_socket_send(server->client[id].soc, &id, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->shm_sid, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->need_expose, sizeof(int)); len = strlen(server->driver->device); s_socket_send(server->client[id].soc, &len, sizeof(int)); s_socket_send(server->client[id].soc, server->driver->device, sizeof(char) * (len + 1)); len = strlen(server->driver->driver); s_socket_send(server->client[id].soc, &len, sizeof(int)); s_socket_send(server->client[id].soc, server->driver->driver, sizeof(char) * (len + 1)); return 0;}int s_server_socket_listen_configure (int id){ int pri; s_rect_t new; S_WINDOW form; pri = s_server_id_pri(id); s_socket_recv(server->client[id].soc, &form, sizeof(S_WINDOW)); s_socket_recv(server->client[id].soc, &new, sizeof(s_rect_t)); s_socket_recv(server->client[id].soc, &server->client[id].resizeable, sizeof(int)); s_socket_recv(server->client[id].soc, &server->client[id].alwaysontop, sizeof(int)); if (form & NO_FORM) { new.x += (server->client[id].win.x - server->client[id].buf.x); new.y += (server->client[id].win.y - server->client[id].buf.y); new.w += (server->client[id].win.w - server->client[id].buf.w); new.h += (server->client[id].win.h - server->client[id].buf.h); } s_server_window_move_resize(id, &new); return 0;}int s_server_socket_listen_desktop (int id){ int id_; s_socket_recv(server->client[id].soc, &id_, sizeof(int)); if (s_server_id_pri(id_) > 0) { s_server_pri_set(SURFACE_FOCUS, id_); } return 0;}int s_server_socket_listen_expose (int id){ s_rect_t coor; s_socket_recv(server->client[id].soc, &coor, sizeof(s_rect_t)); s_server_surface_update(&coor); return 0;}int s_server_socket_listen_stream (int id){ s_stream_t stream; s_socket_recv(server->client[id].soc, &stream, sizeof(s_stream_t)); stream.buf = (char *) s_malloc(stream.blen); s_socket_recv(server->client[id].soc, stream.buf, stream.blen); bpp_putbox_o(server->window->surface, id, stream.rect.x, stream.rect.y, stream.rect.w, stream.rect.h, stream.buf, stream.rect.w); s_free(stream.buf); s_server_surface_update(&stream.rect); return 0;}int s_server_socket_listen_close (int id){ if (server->client[id].type & WINDOW_DESKTOP) { s_server_quit(server->window); } return 0;}int s_server_socket_listen_hide (int id){ s_server_window_hide_id(id); return 0;}int s_server_socket_listen_window_close (int soc){ s_pollfd_t *pfd; int id = s_server_id_find(soc); s_socket_api_close(soc); if (id >= 0) { if ((pfd = s_pollfd_find(server->window, soc)) == NULL) { debugf(DSER | DFAT, "Could not find any pollfd entry for Client[%d].soc[%d]", id, soc); } s_pollfd_del(server->window, pfd); s_pollfd_uninit(pfd); debugf(DSER, "Client[%d] closed the connection", id); s_server_id_del(id); s_server_pri_del(id); } return 0;}int s_server_socket_listen_parse (int soc){ S_SOC_DATA soc_data; struct pollfd pollfd; int id = s_server_id_find(soc); if (id == -1) { return -1; } pollfd.fd = soc; pollfd.events = POLLIN; pollfd.revents = 0; if ((s_socket_api_poll(&pollfd, 1, 0) <= 0) || (pollfd.revents != POLLIN)) { goto end; } s_socket_recv(soc, &soc_data, sizeof(soc_data)); switch (soc_data) { case SOC_DATA_NEW: return s_server_socket_listen_new(id); case SOC_DATA_SHOW: return s_server_socket_listen_show(id); case SOC_DATA_TITLE: return s_server_socket_listen_title(id); case SOC_DATA_DISPLAY: return s_server_socket_listen_display(id); case SOC_DATA_FORMDRAW: s_server_window_form(id, &server->client[id].win); return 0; case SOC_DATA_CONFIGURE: case SOC_DATA_CONFIGURE_NOFORM: return s_server_socket_listen_configure(id); case SOC_DATA_DESKTOP: return s_server_socket_listen_desktop(id); case SOC_DATA_EXPOSE: return s_server_socket_listen_expose(id); case SOC_DATA_HIDE: return s_server_socket_listen_hide(id); case SOC_DATA_STREAM: return s_server_socket_listen_stream(id); case SOC_DATA_CLOSE: return s_server_socket_listen_close(id); case SOC_DATA_EVENT: case SOC_DATA_NOTHING: break; }end: return 0;}int s_server_socket_client_in_f (s_window_t *window, int soc){ return s_server_socket_listen_parse(soc);}int s_server_socket_client_ierr_f (s_window_t *window, int soc){ return s_server_socket_listen_window_close(soc);}int s_server_socket_listen_accept (int soc){ int s; int id; s_pollfd_t *pfd;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?