Skip to content

Commit 10eca01

Browse files
committed
fullscreen, relative mouse
1 parent cc215cf commit 10eca01

File tree

5 files changed

+61
-39
lines changed

5 files changed

+61
-39
lines changed

src/studio/screens/mainmenu.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ static s32 optionFullscreenGet(void* data)
9696
static void optionFullscreenSet(void* data, s32 pos)
9797
{
9898
StudioMainMenu* main = data;
99-
tic_sys_fullscreen_set(main->options->fullscreen = (pos == 1));
99+
tic_sys_fullscreen_set(main->options->fullscreen = (pos == 1), studioUserdata(main->studio));
100100
}
101101

102102
static const char OffValue[] = "OFF";

src/studio/studio.c

+6-1
Original file line numberDiff line numberDiff line change
@@ -1716,7 +1716,7 @@ static inline bool keyWasPressedOnce(Studio* studio, s32 key)
17161716

17171717
static void gotoFullscreen(Studio* studio)
17181718
{
1719-
tic_sys_fullscreen_set(studio->config->data.options.fullscreen = !tic_sys_fullscreen_get());
1719+
tic_sys_fullscreen_set(studio->config->data.options.fullscreen = !tic_sys_fullscreen_get(), studio->userdata);
17201720
}
17211721

17221722
#if defined(CRT_SHADER_SUPPORT)
@@ -2693,6 +2693,11 @@ static bool onEnumModule(const char* name, const char* title, const char* hash,
26932693
}
26942694
#endif
26952695

2696+
void *studioUserdata(Studio* studio)
2697+
{
2698+
return studio->userdata;
2699+
}
2700+
26962701
Studio* studio_create(s32 argc, char **argv, s32 samplerate, tic80_pixel_color_format format, const char* folder, s32 maxscale, tic_layout keyboardLayout, void *userdata)
26972702
{
26982703
setbuf(stdout, NULL);

src/studio/studio.h

+1
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ void studioConfigChanged(Studio* studio);
217217
void setStudioMode(Studio* studio, EditorMode mode);
218218
EditorMode getStudioMode(Studio* studio);
219219
void exitStudio(Studio* studio);
220+
void *studioUserdata(Studio* studio);
220221

221222
void setStudioViMode(Studio* studio, ViMode mode);
222223
ViMode getStudioViMode(Studio* studio);

src/studio/system.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void tic_sys_clipboard_free(char* text);
5858
u64 tic_sys_counter_get();
5959
u64 tic_sys_freq_get();
6060
bool tic_sys_fullscreen_get();
61-
void tic_sys_fullscreen_set(bool value);
61+
void tic_sys_fullscreen_set(bool value, void *userdata);
6262
void tic_sys_message(const char* title, const char* message);
6363
void tic_sys_title(const char* title);
6464
void tic_sys_open_path(const char* path);

src/system/sokol/main.c

+52-36
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ typedef struct
4444
Studio* studio;
4545
tic80_input input;
4646

47+
struct
48+
{
49+
s32 x, y, dx, dy;
50+
} mouse;
51+
4752
struct
4853
{
4954
bool state[tic_keys_count];
@@ -92,13 +97,18 @@ u64 tic_sys_freq_get()
9297
return 1000000000;
9398
}
9499

95-
void tic_sys_fullscreen_set(bool value)
100+
void tic_sys_fullscreen_set(bool value, void *userdata)
96101
{
102+
App *app = userdata;
103+
sapp_toggle_fullscreen();
104+
105+
// reset keyboard state to prevent key repeating
106+
ZEROMEM(app->keyboard.state);
97107
}
98108

99109
bool tic_sys_fullscreen_get()
100110
{
101-
return false;
111+
return sapp_is_fullscreen();
102112
}
103113

104114
void tic_sys_message(const char* title, const char* message)
@@ -186,14 +196,39 @@ static void app_init(void *userdata)
186196
// });
187197

188198
app->audio.samples = malloc(sizeof app->audio.samples[0] * saudio_sample_rate() / TIC80_FRAMERATE * TIC80_SAMPLE_CHANNELS);
189-
app->input.mouse.x = app->input.mouse.y = -1;
199+
app->mouse.x = app->mouse.y = TIC80_FULLWIDTH;
190200
}
191201

192202
static void handleMouse(App *app)
193203
{
194-
if((bool)app->input.mouse.relative != sapp_mouse_locked())
204+
tic80_input *input = &app->input;
205+
206+
if((bool)input->mouse.relative != sapp_mouse_locked())
207+
{
208+
sapp_lock_mouse(input->mouse.relative ? true : false);
209+
}
210+
211+
sapp_show_mouse(app->mouse.x < 0
212+
|| app->mouse.y < 0
213+
|| app->mouse.x >= TIC80_FULLWIDTH
214+
|| app->mouse.y >= TIC80_FULLHEIGHT);
215+
216+
if(sapp_mouse_shown())
195217
{
196-
sapp_lock_mouse(app->input.mouse.relative ? true : false);
218+
input->mouse.x = input->mouse.y = -1;
219+
}
220+
else
221+
{
222+
if(sapp_mouse_locked())
223+
{
224+
input->mouse.rx = app->mouse.dx;
225+
input->mouse.ry = app->mouse.dy;
226+
}
227+
else
228+
{
229+
input->mouse.x = CLAMP(app->mouse.x, 0, TIC80_FULLWIDTH - 1);
230+
input->mouse.y = CLAMP(app->mouse.y, 0, TIC80_FULLHEIGHT - 1);
231+
}
197232
}
198233
}
199234

@@ -243,12 +278,9 @@ static void app_frame(void *userdata)
243278
handleKeyboard(app);
244279
studio_tick(app->studio, app->input);
245280

246-
if((app->input.mouse.relative =
247-
studio_mem(app->studio)->ram->input.mouse.relative))
248-
{
249-
input->mouse.rx = input->mouse.ry = 0;
250-
}
281+
app->input.mouse.relative = studio_mem(app->studio)->ram->input.mouse.relative;
251282

283+
app->mouse.dx = app->mouse.dy = 0;
252284
input->mouse.scrollx = input->mouse.scrolly = 0;
253285
app->keyboard.text = '\0';
254286
input->gamepads.data = 0;
@@ -484,32 +516,17 @@ static void app_event(const sapp_event* event, void *userdata)
484516
app->keyboard.text = event->char_code;
485517
}
486518
break;
519+
case SAPP_EVENTTYPE_MOUSE_LEAVE:
520+
app->mouse.x = app->mouse.y = TIC80_FULLWIDTH;
521+
break;
487522
case SAPP_EVENTTYPE_MOUSE_MOVE:
488523
{
489-
if(sapp_mouse_locked())
490-
{
491-
input->mouse.rx = event->mouse_dx;
492-
input->mouse.ry = event->mouse_dy;
493-
}
494-
else
495-
{
496-
Rect r = viewport();
497-
498-
s32 x = (event->mouse_x - r.x) * TIC80_FULLWIDTH / r.w;
499-
s32 y = (event->mouse_y - r.y) * TIC80_FULLHEIGHT / r.h;
500-
501-
sapp_show_mouse(x < 0 || y < 0 || x >= TIC80_FULLWIDTH || y >= TIC80_FULLHEIGHT);
502-
503-
if(sapp_mouse_shown())
504-
{
505-
input->mouse.x = input->mouse.y = -1;
506-
}
507-
else
508-
{
509-
input->mouse.x = CLAMP(x, 0, TIC80_FULLWIDTH - 1);
510-
input->mouse.y = CLAMP(y, 0, TIC80_FULLHEIGHT - 1);
511-
}
512-
}
524+
Rect r = viewport();
525+
526+
app->mouse.x = (event->mouse_x - r.x) * TIC80_FULLWIDTH / r.w;
527+
app->mouse.y = (event->mouse_y - r.y) * TIC80_FULLHEIGHT / r.h;
528+
app->mouse.dx = event->mouse_dx;
529+
app->mouse.dy = event->mouse_dy;
513530
}
514531
break;
515532
case SAPP_EVENTTYPE_MOUSE_DOWN:
@@ -519,8 +536,7 @@ static void app_event(const sapp_event* event, void *userdata)
519536
processMouse(app, event->mouse_button, 0); break;
520537
break;
521538
case SAPP_EVENTTYPE_MOUSE_SCROLL:
522-
input->mouse.scrollx = event->scroll_x;
523-
input->mouse.scrolly = event->scroll_y;
539+
input->mouse.scrolly = event->scroll_y > 0 ? 1 : -1;
524540
break;
525541
case SAPP_EVENTTYPE_CLIPBOARD_PASTED:
526542
sapp_get_clipboard_string();

0 commit comments

Comments
 (0)