287 lines
8.4 KiB
C
287 lines
8.4 KiB
C
|
|
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;
|
|
}
|
|
}
|