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 + -
显示快捷键?