window.c
来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 609 行 · 第 1/2 页
C
609 行
int i; int v = 0; int title_len; int btns_w; s_server_window_form_mat_prepare(); title_len = server->client[id].title.img[v].w; btns_w = server->theme.button[v][HIDE].w + server->theme.button[v][CLOSE].w; if (server->client[id].resizeable == 1) { btns_w += server->theme.button[v][MAXIMIZE].w; } server->client[id].win.x = server->client[id].buf.x - server->theme.form[v][LEFT].w; server->client[id].win.y = server->client[id].buf.y - server->theme.form[v][TOP_1].h; if ((server->client[id].win.w = server->client[id].buf.w + server->theme.form[v][LEFT].w + server->theme.form[v][RIGHT].w) < server->theme.form_min.w_) { server->client[id].buf.w += server->theme.form_min.w_ - server->client[id].win.w; server->client[id].win.w += server->theme.form_min.w_ - server->client[id].win.w; } if ((server->client[id].win.h = server->client[id].buf.h + server->theme.form[v][TOP_1].h + server->theme.form[v][BTM].h) < server->theme.form_min.h) { server->client[id].buf.h += server->theme.form_min.h - server->client[id].win.h; server->client[id].win.h += server->theme.form_min.h - server->client[id].win.h; } /* window form */ /* top */ server->client[id].form[TOP_L].x = server->client[id].win.x; server->client[id].form[TOP_L].y = server->client[id].win.y; server->client[id].form[TOP_L].w = server->theme.form[v][TOP_L].w; server->client[id].form[TOP_L].h = server->theme.form[v][TOP_L].h; server->client[id].form[TOP_R].x = server->client[id].win.x + server->client[id].win.w - server->theme.form[v][TOP_R].w; server->client[id].form[TOP_R].y = server->client[id].win.y; server->client[id].form[TOP_R].w = server->theme.form[v][TOP_R].w; server->client[id].form[TOP_R].h = server->theme.form[v][TOP_R].h; server->client[id].form[TOP_1].x = server->client[id].win.x + server->theme.form[v][TOP_L].w; server->client[id].form[TOP_1].y = server->client[id].win.y; server->client[id].form[TOP_1].w = server->theme.button[v][MENU].w; server->client[id].form[TOP_1].h = server->theme.form[v][TOP_1].h; server->client[id].form[TOP_2].x = server->client[id].form[TOP_1].x + server->client[id].form[TOP_1].w; server->client[id].form[TOP_2].y = server->client[id].win.y; server->client[id].form[TOP_2].w = server->theme.form[v][TOP_2].w; server->client[id].form[TOP_2].h = server->theme.form[v][TOP_2].h; server->client[id].form[TOP_3].x = server->client[id].form[TOP_2].x + server->client[id].form[TOP_2].w; server->client[id].form[TOP_3].y = server->client[id].win.y; i = server->client[id].win.w - server->client[id].form[TOP_L].w - server->client[id].form[TOP_R].w - server->client[id].form[TOP_1].w - server->client[id].form[TOP_2].w - server->theme.form[v][TOP_4].w - btns_w; if (server->theme.title_full) { server->client[id].form[TOP_3].w = i; } else { server->client[id].form[TOP_3].w = (i < title_len) ? i : title_len; } server->client[id].form[TOP_3].h = server->theme.form[v][TOP_3].h; if (server->theme.title_full) { server->client[id].form[TOP_4].x = server->client[id].win.x + server->client[id].win.w - server->theme.form[v][TOP_4].w - btns_w - server->client[id].form[TOP_R].w; } else { server->client[id].form[TOP_4].x = server->client[id].form[TOP_3].x + server->client[id].form[TOP_3].w; } server->client[id].form[TOP_4].y = server->client[id].win.y; server->client[id].form[TOP_4].w = server->theme.form[v][TOP_4].w; server->client[id].form[TOP_4].h = server->theme.form[v][TOP_4].h; if (server->client[id].win.w < server->theme.form_min.w) { server->client[id].form[TOP_5].x = server->client[id].form[TOP_2].x; } else { server->client[id].form[TOP_5].x = server->client[id].form[TOP_4].x + server->client[id].form[TOP_4].w; } server->client[id].form[TOP_5].y = server->client[id].win.y; server->client[id].form[TOP_5].w = server->client[id].form[TOP_R].x - server->client[id].form[TOP_5].x; server->client[id].form[TOP_5].h = server->theme.form[v][TOP_5].h; /* left */ server->client[id].form[LEFT].x = server->client[id].win.x; server->client[id].form[LEFT].y = server->client[id].win.y + server->theme.form[v][TOP_L].h; server->client[id].form[LEFT].w = server->theme.form[v][LEFT].w; server->client[id].form[LEFT].h = server->client[id].win.h - server->theme.form[v][TOP_L].h - server->theme.form[v][BTM_L].h; /* right */ server->client[id].form[RIGHT].x = server->client[id].win.x + server->client[id].win.w - server->theme.form[v][RIGHT].w; server->client[id].form[RIGHT].y = server->client[id].win.y + server->theme.form[v][TOP_R].h; server->client[id].form[RIGHT].w = server->theme.form[v][RIGHT].w; server->client[id].form[RIGHT].h = server->client[id].win.h - server->theme.form[v][TOP_R].h - server->theme.form[v][BTM_R].h; /* bottom */ server->client[id].form[BTM_L].x = server->client[id].win.x; server->client[id].form[BTM_L].y = server->client[id].win.y + server->client[id].win.h - server->theme.form[v][BTM_L].h; server->client[id].form[BTM_L].w = server->theme.form[v][BTM_L].w; server->client[id].form[BTM_L].h = server->theme.form[v][BTM_L].h; server->client[id].form[BTM].x = server->client[id].win.x + server->client[id].form[BTM_L].w; server->client[id].form[BTM].y = server->client[id].win.y + server->client[id].win.h - server->theme.form[v][BTM].h; server->client[id].form[BTM].w = server->client[id].win.w - server->client[id].form[BTM_L].w - server->theme.form[v][BTM_R].w; server->client[id].form[BTM].h = server->theme.form[v][BTM].h; server->client[id].form[BTM_R].x = server->client[id].win.x + server->client[id].win.w - server->theme.form[v][BTM_R].w; server->client[id].form[BTM_R].y = server->client[id].win.y + server->client[id].win.h - server->theme.form[v][BTM_R].h; server->client[id].form[BTM_R].w = server->theme.form[v][BTM_R].w; server->client[id].form[BTM_R].h = server->theme.form[v][BTM_R].h; /* buttons */ /* menu */ server->client[id].button[MENU].x = server->client[id].form[TOP_1].x; server->client[id].button[MENU].y = server->client[id].form[TOP_1].y; server->client[id].button[MENU].w = server->theme.button[v][MENU].w; server->client[id].button[MENU].h = server->theme.button[v][MENU].h; /* close */ server->client[id].button[CLOSE].x = server->client[id].form[TOP_R].x - server->theme.button[v][CLOSE].w; server->client[id].button[CLOSE].y = server->client[id].form[TOP_5].y; server->client[id].button[CLOSE].w = server->theme.button[v][CLOSE].w; server->client[id].button[CLOSE].h = server->theme.button[v][CLOSE].h; /* maximize */ server->client[id].button[MAXIMIZE].x = server->client[id].button[CLOSE].x - server->theme.button[v][MAXIMIZE].w; server->client[id].button[MAXIMIZE].y = server->client[id].form[TOP_5].y; server->client[id].button[MAXIMIZE].w = server->theme.button[v][MAXIMIZE].w; server->client[id].button[MAXIMIZE].h = server->theme.button[v][MAXIMIZE].h; /* hide */ if (server->client[id].resizeable == 1) { server->client[id].button[HIDE].x = server->client[id].button[MAXIMIZE].x - server->theme.button[v][HIDE].w; } else { server->client[id].button[HIDE].x = server->client[id].button[CLOSE].x - server->theme.button[v][HIDE].w; } server->client[id].button[HIDE].y = server->client[id].form[TOP_5].y; server->client[id].button[HIDE].w = server->theme.button[v][HIDE].w; server->client[id].button[HIDE].h = server->theme.button[v][HIDE].h;}int s_server_window_is_parent_temp (int pid, int cid){ int i = cid; while (i >= 0) { if (server->client[i].type & (WINDOW_MAIN | WINDOW_CHILD)) { return 0; } i = server->client[i].pid; if (i < 0) { return 0; } if (i == pid) { return 1; } } return 0;}int s_server_window_temp_parent (int cid){ int i = cid; while (i >= 0) { if (server->client[i].type & (WINDOW_MAIN | WINDOW_CHILD)) { return i; } i = server->client[i].pid; if (i < 0) { return -1; } } return -1;}void s_server_window_close_temps (int id){ int i; if (id < 0) { return; } for (i = 0; i < S_CLIENTS_MAX; i++) { if ((server->client[i].pid == id) && (server->client[i].type & WINDOW_TEMP)) { s_server_window_close_id(i); } }}void s_server_window_close_id (int id){ if (id < 0) { return; } s_server_socket_request(SOC_DATA_CLOSE, id);}void s_server_window_hide_id (int id){ int i; int p; s_rect_t c; if (id < 0) { return; } p = s_server_id_pri(id); if (p < 0) { return; } 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; } c = server->client[id].win; if (p >= 0) { for (i = p; i < (S_CLIENTS_MAX - 1); i++) { server->pri[i] = server->pri[i + 1]; } server->pri[S_CLIENTS_MAX - 1] = -1; } s_server_pri_set(SURFACE_CLOSE, &c); { s_rect_t coor = {0, 0, 0, 0}; s_server_socket_request(SOC_DATA_EXPOSE, id, &coor); }}void s_server_window_close (s_window_t *window){ int id = s_server_pri_id(0); if (id < 0) { return; } s_server_window_close_id(id);}void s_server_window_move_resize (int id, s_rect_t *new){ int mw; int mh; s_rect_t old = server->client[id].win; int w = server->client[id].win.w - server->client[id].buf.w; int h = server->client[id].win.h - server->client[id].buf.h; if (server->client[id].type & NO_FORM) { mw = 0; mh = 0; } else { mw = server->theme.form_min.w_ - w; mh = server->theme.form_min.h - h; } if ((new->x < 0) && (new->y < 0) && (s_server_id_pri(id) < 0)) { new->x += w; new->y += h; } if (new->w < (mw + w)) { new->w = mw + w; } if (new->h < (mh + h)) { new->h = mh + h; } if ((new->x + new->w) <= 5) { new->x = 5 - new->w; } if ((new->y + new->h) <= 5) { new->y = 5 - new->h; } if (new->x >= (server->window->surface->width - 5)) { new->x = server->window->surface->width - 5; } if (new->y >= (server->window->surface->height - 5)) { new->y = server->window->surface->height - 5; } server->client[id].buf.x += new->x - old.x; server->client[id].buf.y += new->y - old.y; server->client[id].buf.w += new->w - old.w; server->client[id].buf.h += new->h - old.h; server->client[id].win = *new; s_server_pri_set(SURFACE_CHANGED, id, &old, new);}void s_server_window_maximize (s_window_t *window){ int id; s_rect_t new; new.x = 0; new.y = 0; new.w = window->surface->width; new.h = window->surface->height; id = s_server_pri_id(0); if (id < 0) { return; } s_server_window_move_resize(id, &new);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?