Archived
1
0
Fork 0
This repository has been archived on 2025-09-02. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
skcblitz/window.h

288 lines
8.4 KiB
C
Raw Permalink Normal View History

2025-09-02 14:43:36 +02:00
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;
}
}