void win_fbsize(window_t *win, int x, int y) { glViewport(0, 0, x, y); fb_resize_int(win->fbtex_gui, win->fb_x, win->fb_y, x, y); win->fb_x = x; win->fb_y = y; // if(win == wld.window) fb_reconfig(win); if(sys.win_full == win) { win->offset_x = 0; win->offset_y = 0; win->frame_x = x; win->frame_y = y; } else { win->offset_x = WIN_BORDER; win->offset_y = WIN_TITLEBAR + WIN_BORDER; win->frame_x = x - WIN_BORDER * 2; win->frame_y = y - (WIN_TITLEBAR + WIN_BORDER * 2); } gui_reopen(win); if(sys.win_full != win) { win->xsize = x; win->ysize = y; } } void win_pos(window_t *win, int x, int y) { if(sys.win_full != win) { win->saved_xpos = x; win->saved_ypos = y; } } byte win_shift() { return wcf.active && ((wcf_getkey(wcf.active, KEYSYM_LEFT_SHIFT) == KEY_PRESS) || (wcf_getkey(wcf.active, KEYSYM_RIGHT_SHIFT) == KEY_PRESS)); } byte win_ctrl() { return wcf.active && ((wcf_getkey(wcf.active, KEYSYM_LEFT_CONTROL) == KEY_PRESS) || (wcf_getkey(wcf.active, KEYSYM_RIGHT_CONTROL) == KEY_PRESS)); } void win_mouse(window_t *win, int x, int y) { if(win->world) { int xoff; int yoff; if(sys.mouse_first) { win->mouse_x = x; win->mouse_y = y; sys.mouse_first = 0; } xoff = x - win->mouse_x; yoff = win->mouse_y - y; if(!(win->open)) { cam_swing(&win->world->camera, (float)xoff, (float)yoff); } } win->mouse_x = x; win->mouse_y = y; if(win->open && sys.input && win->mouse && !(win->mouse & 0xfc) && !win_ctrl()) { // if(sys.mouse_clickx != INT_MIN && sys.mouse_clicky != INT_MIN) { // logd("t1", "%d %d; %d %d", sys.mouse_x, sys.mouse_y, sys.mouse_clickx, sys.mouse_clicky); if(!win->drag_x && !win->drag_y && (win->mouse_clickx < win->offset_x || win->mouse_clicky < win->offset_y)) { if(win->mouse_clickx < win->fb_x - WIN_TITLEBAR * 3) { int wx, wy; wcf_getpos(win, &wx, &wy); wcf_setpos(win, wx + (win->mouse_x - win->mouse_clickx), wy + (win->mouse_y - win->mouse_clicky)); } return; } if(win->resizable && !win->drag_x && !win->drag_y && (win->mouse_clickx >= win->offset_x + win->frame_x || win->mouse_clicky >= win->offset_y + win->frame_y)) { win->drag_x = win->mouse_clickx >= win->offset_x + win->frame_x - 10; win->drag_y = win->mouse_clicky >= win->offset_y + win->frame_y - 10; } if(win->drag_x || win->drag_y) { int wx, wy; //, dx, dy; // wcf_getpos(sys.win, &dx, &dy); wcf_getsize(win, &wx, &wy); wcf_resize(win, win->drag_x ? (win->mouse_x < 1 ? 1 : win->mouse_x) : wx, win->drag_y ? (win->mouse_y < 1 ? 1 : win->mouse_y) : wy); // wcf_setpos(sys.win, dx, dy); return; } // } gui_drag(win, win->mouse_x, win->mouse_y); } } void win_scroll(window_t *win, int x, int y) { x *= -1; if(win->open && sys.input) { gui_scroll(win, x, y, win->mouse_x, win->mouse_y, win_ctrl(), win_shift()); } else if(win->open) { if((x != 0) || (y != 0)) gui_setkey((x < 0) ? -SCROLL_LEFT : ((x > 0) ? -SCROLL_RIGHT : ((y < 0) ? -SCROLL_DOWN : -SCROLL_UP)), 0); } else { win->scroll |= ((x < 0) ? (1 << (SCROLL_LEFT - SCROLL_UP)) : ((x > 0) ? (1 << (SCROLL_RIGHT - SCROLL_UP)) : 0)) | ((y < 0) ? (1 << (SCROLL_DOWN - SCROLL_UP)) : ((y > 0) ? (1 << (SCROLL_UP - SCROLL_UP)) : 0)); } } void win_button(window_t *win, int btn, int act) { if(btn < 0 || btn >= 8) { return; } byte press = act == KEY_PRESS; byte prev = (win->mouse >> btn) & 1; if(win->open && prev != press && sys.input && !(win->mouse)) { win->mouse_clickx = win->mouse_x; win->mouse_clicky = win->mouse_y; gui_mouse(win, btn + 1, win->mouse_x, win->mouse_y, win_ctrl(), win_shift()); } else if(win->open && press) { gui_setkey(-(MOUSE_LEFT + btn), 0); } win->mouse = (win->mouse & ~(1 << btn)) | (press << btn); if(win->open && prev != press && sys.input && !(win->mouse)) { gui_mouserel(win); win->drag_x = win->drag_y = 0; } } void win_key(window_t *win, int key, int act) { if(win->open && (act != KEY_RELEASE) && (key != -1) && sys.input) { gui_key(win, key, win_ctrl(), win_shift()); } else if(win->open && (act != KEY_REPEAT) && (key != -1)) { gui_setkey(key, act == KEY_RELEASE); } } void win_char(window_t *win, uint code) { if(win->open && sys.input) { gui_char(win, code); } } void win_drop(window_t *win, int num, const char **paths) { if(win == snd.player && win->open) { con_cmd_play(NULL, paths, num); gui_reopen(win); } } void win_focus(window_t *win, byte focus) { win->focused = focus; win->scroll = 0; gui_mouse(win, 0, -1, -1, 0, 0); gui_restyle(win); } void win_redraw(window_t *win) { gui_reopen(win); } void win_close(window_t *win) { fb_delete(&win->fb_gui, &win->fbtex_gui); if(win->world) world_delete(win); wcf_destroy(win); } void win_closed(window_t *win) { if(win == snd.player) snd.player = NULL; if(win == sys.console) sys.interrupted = 1; else win_close(win); } void win_menu(window_t *win, byte menu) { wcf_grab(win, !(win->world) || (wcf.grab_cur_window && (wcf.grab_cur_window != win)) || menu || sys.nograb); sys.mouse_first = 1; } void win_full(byte full) { if(full ? (wcf.active && wcf.active->world) : (sys.win_full != NULL)) { if(full) { wcf_fullscreen(wcf.active, sys.win_xfull, sys.win_yfull, sys.win_refresh ? sys.win_refresh : -1); } else { wcf_windowed(sys.win_full, sys.win_full->saved_xpos, sys.win_full->saved_ypos, sys.win_full->xsize, sys.win_full->ysize); } wcf_selcontext(full ? wcf.active : sys.win_full); wcf_sync(sys.win_vsync); sys.win_full = full ? wcf.active : NULL; } } void win_sync(int sync) { window_t *win; sys.win_vsync = sync == 0; sys.sync_limited = sync > 0; sys.sync_limit = sync > 0 ? sync : wcf_getmode()->refresh; for(win = wcf.window_list; win; win = win->next) { wcf_sync(sys.win_vsync); } } void win_init() { window_t *win = sys.console; int sx = cvar_int("win_pos_x"); int sy = cvar_int("win_pos_y"); int wx = cvar_int("win_width"); int wy = cvar_int("win_height"); int mx = 960; int my = 600; int x, y; const vidmode_t *mode = wcf_getmode(); mx += WIN_MINX; my += WIN_MINY; sys.win_xfull = mode->width; sys.win_yfull = mode->height; sys.win_refresh = mode->refresh; wcf_getscrpos(&x, &y); win->xsize = win->xsize > mode->width ? mode->width : mx; win->ysize = win->ysize > mode->height ? mode->height : my; win->saved_xpos = x + mode->width / 2 - win->xsize / 2; win->saved_ypos = y + mode->height / 2 - win->ysize / 2; win->xsize = win->xsize < mx ? mx : win->xsize; win->ysize = win->ysize < my ? my : win->ysize; if(sx != 0x80000000 && sy != 0x80000000) { win->saved_xpos = sx; win->saved_ypos = sy; } if(wx && wy) { win->xsize = wx; win->ysize = wy; } wcf_windowed(win, win->saved_xpos, win->saved_ypos, win->xsize, win->ysize); // wcf_fullscreen does not move while hidden ... wcf_setpos(win, win->saved_xpos, win->saved_ypos); wcf_show(win, 1); byte *icon = mem_alloc(64 * 64 * 4, MEM_IMAGE); tex_gen_triwave(icon, 64, 64, 0x00000000, 0xffff0000, 0xff00ff00, 0xff0000ff, 0xff7f00ff, 0xff000000); wcf_icon(win, icon, 64, 64); mem_free(icon); wcf_limits(win, mx, my, -1, -1); win->title = STR_TITLE_CONSOLE; win->initializer = gui_init_console; win->queue = 1; } window_t *win_open(int sx, int sy, int wx, int wy, int mx, int my, byte fixed, const char *title, gui_initfnc *initializer, byte type) { int x, y, w, h; window_t *win = wcf_create(SYS_PROGRAM, !fixed); sys_assert(win); wcf_getpos(sys.console, &x, &y); wcf_getsize(sys.console, &w, &h); mx += WIN_MINX; my += WIN_MINY; wx += WIN_MINX; wy += WIN_MINY; sx = sx < 0 ? (x - wx - (-sx - 1)) : (sx > 0 ? (x + w + (sx - 1)) : x); sy = sy < 0 ? (y - wy - (-sy - 1)) : (sy > 0 ? (y + h + (sy - 1)) : y); win->saved_xpos = sx; win->saved_ypos = sy; win->xsize = wx; win->ysize = wy; wcf_windowed(win, win->saved_xpos, win->saved_ypos, win->xsize, win->ysize); wcf_setpos(win, win->saved_xpos, win->saved_ypos); wcf_show(win, 1); byte *icon = mem_alloc(64 * 64 * 4, MEM_IMAGE); tex_gen_triwave(icon, 64, 64, 0x00000000, 0xffff0000, 0xff00ff00, 0xff0000ff, 0xff7f00ff, 0xff000000); wcf_icon(win, icon, 64, 64); mem_free(icon); wcf_limits(win, mx, my, fixed ? mx : -1, fixed ? my : -1); sys_assert(fb_init_sys(&win->fb_gui, &win->fbtex_gui)); wcf_sync(sys.win_vsync); win->title = title; win->initializer = initializer; win->queue = win->open = type; return win; } void win_end() { window_t *win; for(win = wcf.window_list; win; win = win->next) { fb_delete(&win->fb_gui, &win->fbtex_gui); if(win->world) world_delete(win); // wcf_destroy(win); if(win == sys.console) sys.console = NULL; } }