window.c
来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 609 行 · 第 1/2 页
C
609 行
/*************************************************************************** begin : Sun Feb 23 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"void s_server_window_new (int id){ int v = (s_server_id_pri(id) <= 0) ? 1 : 0; server->client[id].win.x = server->client[id].buf.x; server->client[id].win.y = server->client[id].buf.y; if (server->client[id].type & NO_FORM) { server->client[id].win.w = server->client[id].buf.w; server->client[id].win.h = server->client[id].buf.h; } else { server->client[id].win.w = server->client[id].buf.w + (server->theme.form[v][LEFT].w + server->theme.form[v][RIGHT].w); server->client[id].win.h = server->client[id].buf.h + (server->theme.form[v][TOP_1].h + server->theme.form[v][BTM].h); } /* if the caller does not know what he/she is doing we will correct his/her shit */ server->client[id].win.x = (server->client[id].win.x < 0) ? 0 : server->client[id].win.x; server->client[id].win.y = (server->client[id].win.y < 0) ? 0 : server->client[id].win.y; if (server->client[id].type & NO_FORM) { if (server->client[id].win.w < 0) { server->client[id].win.w = 0; } if (server->client[id].win.h < 0) { server->client[id].win.h = 0; } } else { if (server->client[id].win.w < server->theme.form_min.w_) { server->client[id].win.w = server->theme.form_min.w_; } if (server->client[id].win.h < server->theme.form_min.h) { server->client[id].win.h = server->theme.form_min.h; } } if (server->client[id].type & NO_FORM) { server->client[id].win.x = (server->client[id].win.x > server->window->surface->width) ? 0 : server->client[id].win.x; server->client[id].win.y = (server->client[id].win.y > server->window->surface->height) ? 0 : server->client[id].win.y; } else { server->client[id].win.x = (server->client[id].win.x > server->window->surface->width - server->theme.form_min.w) ? 0 : server->client[id].win.x; server->client[id].win.y = (server->client[id].win.y > server->window->surface->height - server->theme.form_min.h) ? 0 : server->client[id].win.y; } /* coor&dim correcting, done. */ if (server->client[id].type & NO_FORM) { server->client[id].buf.x = server->client[id].win.x; server->client[id].buf.y = server->client[id].win.y; server->client[id].buf.w = server->client[id].win.w; server->client[id].buf.h = server->client[id].win.h; } else { server->client[id].buf.x = server->client[id].win.x + server->theme.form[v][LEFT].w; server->client[id].buf.y = server->client[id].win.y + server->theme.form[v][TOP_1].h; server->client[id].buf.w = server->client[id].win.w - server->theme.form[v][LEFT].w - server->theme.form[v][RIGHT].w; server->client[id].buf.h = server->client[id].win.h - server->theme.form[v][TOP_1].h - server->theme.form[v][BTM].h; } server->client[id].title.str = (char *) s_malloc(sizeof(char) * 23); sprintf(server->client[id].title.str, "Xynth Windowing System"); s_server_window_title(id, server->client[id].title.str);}void s_server_window_title (int id, char *title){ int i; int v; int h; int yo; s_font_t *font; s_surface_t *srf; if ((id < 0) || (title == NULL) || (server->client[id].type & NO_FORM)) { return; } srf = (s_surface_t *) s_malloc(sizeof(s_surface_t)); for (v = 0; v < 2; v++) { font = server->theme.font[v]; s_font_set_str(font, title); s_font_get_glyph(font); s_image_get_mat(font->img); s_image_get_handler(font->img); font->img->buf = (char *) s_calloc(1, font->img->w * font->img->h * server->window->surface->bytesperpixel); s_getsurfacevirtual(srf, font->img->w, font->img->h, server->window->surface->bitsperpixel, font->img->buf); if ((i = font->img->w / server->theme.form[v][TOP_3].w) > 0) { while (i--) { yo = server->theme.text_v_off[v] - font->img->handler.y + (server->theme.form[v][TOP_3].handler.h - font->img->handler.h) / 2; if ((font->img->h + yo) > server->theme.form[v][TOP_3].h) { h = server->theme.form[v][TOP_3].h - yo; } else { h = font->img->h; } s_putboxpart(srf, i * server->theme.form[v][TOP_3].w, 0, server->theme.form[v][TOP_3].w, h, server->theme.form[v][TOP_3].w, server->theme.form[v][TOP_3].h, server->theme.form[v][TOP_3].buf, 0, yo); } } if ((i = font->img->w % server->theme.form[v][TOP_3].w) > 0) { s_putboxpart(srf, font->img->w - server->theme.form[v][TOP_3].w, 0, server->theme.form[v][TOP_3].w, font->img->h, server->theme.form[v][TOP_3].w, server->theme.form[v][TOP_3].h, server->theme.form[v][TOP_3].buf, 0, server->theme.text_v_off[v] - font->img->handler.y + (server->theme.form[v][TOP_3].handler.h - font->img->handler.h) / 2); } s_putboxrgba(srf, 0, 0, font->img->w, font->img->h, font->img->rgba); s_free(server->client[id].title.img[v].mat); s_free(server->client[id].title.img[v].buf); server->client[id].title.img[v].mat = (unsigned char *) s_malloc(font->img->w * font->img->h); server->client[id].title.img[v].buf = (char *) s_malloc(font->img->w * font->img->h * server->window->surface->bytesperpixel); server->client[id].title.img[v].w = font->img->w; server->client[id].title.img[v].h = font->img->h; server->client[id].title.hy[v] = font->img->handler.y; server->client[id].title.hh[v] = font->img->handler.h; memcpy(server->client[id].title.img[v].mat, font->img->mat, font->img->w * font->img->h); memcpy(server->client[id].title.img[v].buf, font->img->buf, font->img->w * font->img->h * server->window->surface->bytesperpixel); s_image_uninit(font->img); s_image_init(&(font->img)); } s_free(srf);}void s_server_putbox (s_window_t *window, int id, s_rect_t *coor, int x, int y, s_image_t *img){ int add; s_rect_t to; s_rect_t intr; s_rect_t icoor; icoor.x = x; icoor.y = y; icoor.w = img->w; icoor.h = img->h; if (s_rect_intersect(coor, &icoor, &intr)) { return; } if (s_rect_clip_virtual(window->surface, intr.x, intr.y, intr.w, intr.h, &to)) { return; } add = (to.y - icoor.y) * img->w + (to.x - icoor.x); bpp_putbox_mask_o(window->surface, id, to.x, to.y, to.w, to.h, img->buf + add * window->surface->bytesperpixel, img->mat + add, img->w);}void s_server_putmat (s_window_t *window, int id, s_rect_t *coor, int x, int y, s_image_t *img){ s_rect_t mcoor; mcoor.x = x; mcoor.y = y; mcoor.w = img->w; mcoor.h = img->h; s_server_surface_matrix_add_this(id, coor, &mcoor, img->mat);}#define s_server_window_form_mat_prepare()\ if ((id < 0) || (server->client[id].type & NO_FORM) || (s_server_id_pri(id) < 0)) {\ return;\ }\ if ((s_server_id_pri(id) == 0) ||\ ((server->client[s_server_pri_id(0)].type & WINDOW_TEMP) &&\ (s_server_window_is_parent_temp(id, s_server_pri_id(0))))) {\ v = 1;\ }void s_server_window_form_mat (int v, int id, int mi, s_rect_t *coor, void (*func) (s_window_t *, int, s_rect_t *, int, int, s_image_t *)){ int i; /* top */ func(server->window, mi, coor, server->client[id].form[TOP_L].x, server->client[id].form[TOP_L].y, &server->theme.form[v][TOP_L]); for (i = 0; i < server->client[id].form[TOP_1].w; i += server->theme.form[v][TOP_1].w) { func(server->window, mi, coor, server->client[id].form[TOP_1].x + i, server->client[id].form[TOP_1].y, &server->theme.form[v][TOP_1]); } if (server->client[id].win.w >= server->theme.form_min.w) { func(server->window, mi, coor, server->client[id].form[TOP_2].x, server->client[id].form[TOP_2].y, &server->theme.form[v][TOP_2]); if ((i = server->client[id].form[TOP_3].w / server->theme.form[v][TOP_3].w) > 0) { while (i--) { func(server->window, mi, coor, server->client[id].form[TOP_3].x + i * server->theme.form[v][TOP_3].w, server->client[id].form[TOP_3].y, &server->theme.form[v][TOP_3]); } } if (server->client[id].form[TOP_3].w % server->theme.form[v][TOP_3].w) { func(server->window, mi, coor, server->client[id].form[TOP_4].x - server->theme.form[v][TOP_3].w, server->client[id].form[TOP_3].y, &server->theme.form[v][TOP_3]); } func(server->window, mi, coor, server->client[id].form[TOP_4].x, server->client[id].form[TOP_4].y, &server->theme.form[v][TOP_4]); } if ((i = server->client[id].form[TOP_5].w / server->theme.form[v][TOP_5].w) > 0) { while (i--) { func(server->window, mi, coor, server->client[id].form[TOP_5].x + i * server->theme.form[v][TOP_5].w, server->client[id].form[TOP_5].y, &server->theme.form[v][TOP_5]); } } if (server->client[id].form[TOP_5].w % server->theme.form[v][TOP_5].w) { func(server->window, mi, coor, server->client[id].form[TOP_R].x - server->theme.form[v][TOP_5].w, server->client[id].form[TOP_5].y, &server->theme.form[v][TOP_5]); } func(server->window, mi, coor, server->client[id].form[TOP_R].x, server->client[id].form[TOP_R].y, &server->theme.form[v][TOP_R]); /* left */ if ((i = server->client[id].form[LEFT].h / server->theme.form[v][LEFT].h) > 0) { while (i--) { func(server->window, mi, coor, server->client[id].form[LEFT].x, server->client[id].form[LEFT].y + i * server->theme.form[v][LEFT].h, &server->theme.form[v][LEFT]); } } if (server->client[id].form[LEFT].h % server->theme.form[v][LEFT].h) { func(server->window, mi, coor, server->client[id].form[LEFT].x, server->client[id].form[BTM_L].y - server->theme.form[v][LEFT].h, &server->theme.form[v][LEFT]); } /* right */ if ((i = server->client[id].form[RIGHT].h / server->theme.form[v][RIGHT].h) > 0) { while (i--) { func(server->window, mi, coor, server->client[id].form[RIGHT].x, server->client[id].form[RIGHT].y + i * server->theme.form[v][RIGHT].h, &server->theme.form[v][RIGHT]); } } if (server->client[id].form[RIGHT].h % server->theme.form[v][RIGHT].h) { func(server->window, mi, coor, server->client[id].form[RIGHT].x, server->client[id].form[BTM_R].y - server->theme.form[v][RIGHT].h, &server->theme.form[v][RIGHT]); } /* buttom */ func(server->window, mi, coor, server->client[id].form[BTM_L].x, server->client[id].form[BTM_L].y, &server->theme.form[v][BTM_L]); if ((i = server->client[id].form[BTM].w / server->theme.form[v][BTM].w) > 0) { while (i--) { func(server->window, mi, coor, server->client[id].form[BTM].x + i * server->theme.form[v][BTM].w, server->client[id].form[BTM].y, &server->theme.form[v][BTM]); } } if (server->client[id].form[BTM].w % server->theme.form[v][BTM].w) { func(server->window, mi, coor, server->client[id].form[BTM_R].x - server->theme.form[v][BTM].w, server->client[id].form[BTM].y, &server->theme.form[v][BTM]); } func(server->window, mi, coor, server->client[id].form[BTM_R].x, server->client[id].form[BTM_R].y, &server->theme.form[v][BTM_R]);}void s_server_window_form (int id, s_rect_t *_coor_){ int v = 0; int mi = id; s_rect_t coort; s_rect_t intersect; s_rect_t coor; s_rect_t coor_ = server->client[id].win; s_server_window_form_mat_prepare(); if (s_rect_intersect(_coor_, &coor_, &coor)) { return; } coort.x = server->client[id].form[TOP_3].x; coort.y = server->client[id].form[TOP_3].y; coort.w = server->client[id].form[TOP_3].w; coort.h = server->theme.form[v][TOP_3].handler.h; s_server_window_form_mat(v, id, mi, &coor, s_server_putbox); /* buttons */ s_server_putbox(server->window, id, &coor, server->client[id].button[MENU].x, server->client[id].button[MENU].y, &server->theme.button[v][MENU]); s_server_putbox(server->window, id, &coor, server->client[id].button[HIDE].x, server->client[id].button[HIDE].y, &server->theme.button[v][HIDE]); s_server_putbox(server->window, id, &coor, server->client[id].button[CLOSE].x, server->client[id].button[CLOSE].y, &server->theme.button[v][CLOSE]); if (server->client[id].resizeable == 1) { s_server_putbox(server->window, id, &coor, server->client[id].button[MAXIMIZE].x, server->client[id].button[MAXIMIZE].y, &server->theme.button[v][MAXIMIZE]); } /* title */ if ((!s_rect_intersect(&coor, &coort, &intersect)) && (server->client[id].win.w > server->theme.form_min.w)) { s_server_putbox(server->window, id, &intersect, coort.x, coort.y + server->theme.text_v_off[v] - server->client[id].title.hy[v] + (server->theme.form[v][TOP_3].handler.h - server->client[id].title.hh[v]) / 2, &server->client[id].title.img[v]); }}void s_server_window_matrix_add (int id, s_rect_t *_coor_){ s_server_window_matrix(id, id, _coor_);}void s_server_window_matrix_del (int id, s_rect_t *_coor_){ s_server_window_matrix(id, S_MATRIX_DELETED, _coor_);}void s_server_window_matrix (int id, int mi, s_rect_t *_coor_){ int v = 0; s_rect_t coor; s_rect_t coor_ = server->client[id].win; s_server_window_form_mat_prepare(); if (s_rect_intersect(_coor_, &coor_, &coor)) { return; } s_server_window_form_mat(v, id, mi, &coor, s_server_putmat);}void s_server_window_calculate (int id){
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?