summaryrefslogtreecommitdiff
path: root/reduced_system_layer.c
diff options
context:
space:
mode:
Diffstat (limited to 'reduced_system_layer.c')
-rwxr-xr-xreduced_system_layer.c183
1 files changed, 87 insertions, 96 deletions
diff --git a/reduced_system_layer.c b/reduced_system_layer.c
index 2b9ae9e..ae28109 100755
--- a/reduced_system_layer.c
+++ b/reduced_system_layer.c
@@ -1461,7 +1461,8 @@ static void drop_files_set_num_(i64 num) {
resize_dynamic_array_exact(&g_platform.num_drop_files, (void **) &g_platform.drop_files, sizeof *g_platform.drop_files, num);
- mem_set_(g_platform.drop_files + prev_num, 0, sizeof *g_platform.drop_files * (g_platform.num_drop_files - prev_num));
+ if (prev_num < g_platform.num_drop_files)
+ mem_set_(g_platform.drop_files + prev_num, 0, sizeof *g_platform.drop_files * (g_platform.num_drop_files - prev_num));
}
static void drop_files_set_name_(i64 index, i64 name_len, c8 *name) {
@@ -1478,7 +1479,8 @@ static void drop_files_set_name_(i64 index, i64 name_len, c8 *name) {
Drop_File *f = g_platform.drop_files + index;
resize_dynamic_array_exact(&f->name_len, (void **) &f->name, 1, name_len);
- mem_cpy_(f->name, name, f->name_len);
+ if (name != NULL)
+ mem_cpy_(f->name, name, f->name_len);
}
static void drop_files_set_data_(i64 index, i64 data_size) {
@@ -1517,7 +1519,7 @@ static i8 pixel_size_update_(i64 real_width, i64 real_height) {
resize_dynamic_array_exact(&g_platform.num_pixels, (void **) &g_platform.pixels, sizeof *g_platform.pixels, width * height);
if (g_platform.num_pixels < width * height)
LOG_ERROR("Failed to allocate %lld x %lld pixel buffer.", width, height);
- height = g_platform.num_pixels / width;
+ height = width <= 0 ? 0 : g_platform.num_pixels / width;
if (g_platform.frame_width != width || g_platform.frame_height != height) {
size_changed = 1;
@@ -1532,7 +1534,7 @@ static i8 pixel_size_update_(i64 real_width, i64 real_height) {
if (_internal_pixels_len < internal_width * internal_height)
LOG_ERROR("Failed to allocate %lld x %lld internal pixel buffer.", internal_width, internal_height);
_internal_width = real_width;
- _internal_height = min2_i32_(_internal_pixels_len / real_width, real_height);
+ _internal_height = real_width <= 0 ? 0 : min2_i32_(_internal_pixels_len / real_width, real_height);
return size_changed;
}
@@ -1673,6 +1675,18 @@ static void cleanup_pixel_buffers_(void) {
resize_dynamic_array_exact(&g_platform.num_pixels, (void **) &g_platform.pixels, sizeof *g_platform.pixels, 0);
}
+static void store_clipboard_text_(i64 size, c8 *data) {
+ if (size < 0 || data == NULL)
+ return;
+
+ resize_dynamic_array_exact(&g_platform.clipboard_text_len, (void **) &g_platform.clipboard_text, 1, size + 1);
+
+ i64 len = g_platform.clipboard_text_len - 1;
+ mem_cpy_(g_platform.clipboard_text, data, len);
+ if (len >= 0)
+ g_platform.clipboard_text[len] = '\0';
+}
+
// ================================================================
//
// Unix
@@ -3556,15 +3570,13 @@ void render_main_window_frame(void) {
}
void write_clipboard_text(i64 size, c8 *data) {
- XSetSelectionOwner(_display, _clipboard, _window, CurrentTime);
+ if (size < 0 || data == NULL)
+ return;
- resize_dynamic_array_exact(&g_platform.clipboard_text_len, (void **) &g_platform.clipboard_text, 1, size + 1);
+ store_clipboard_text_(size, data);
- i64 len = g_platform.clipboard_text_len - 1;
- if (len >= 0) {
- mem_cpy_(g_platform.clipboard_text, data, len);
- g_platform.clipboard_text[len] = '\0';
- }
+ if (g_platform.clipboard_text_len > 0)
+ XSetSelectionOwner(_display, _clipboard, _window, CurrentTime);
}
b8 x11_screenshot_(i64 max_num_pixels, i64 *width, i64 *height, vec4_f32 *pixels) {
@@ -3765,10 +3777,8 @@ __attribute__((export_name("js_num_sound_channels"))) i32 js_num_sound_channels(
#if defined(__wasm__)
-static i32 _frame_width = 0;
-static i32 _frame_height = 0;
static i32 _num_events = 0;
-static i32 _input_size = 0;
+static i32 _input_len = 0;
static i32 _cursor_dx = 0;
static i32 _cursor_dy = 0;
static f64 _wheel_dx = 0;
@@ -3779,12 +3789,9 @@ static i64 _sound_read = 0;
static b8 _files_dragged = 0;
static b8 _files_dropped = 0;
-static c8 _href [4096] = {0};
-static u32 _pixels_scaled [MAX_NUM_PIXELS] = {0};
-static u32 _internal_pixels [MAX_NUM_PIXELS] = {0};
-static b8 _key_pressed [MAX_NUM_KEYS] = {0};
-static f32 _sound_buffer [MAX_NUM_PRIMARY_SOUND_FRAMES] = {0};
-static u8 _drop_buffer [DROP_FILES_BUFFER_SIZE] = {0};
+static c8 _href [4096] = {0};
+static b8 _key_pressed [MAX_NUM_KEYS] = {0};
+static f32 _sound_buffer [MAX_NUM_PRIMARY_SOUND_FRAMES] = {0};
void shutdown_all_systems(void) {
g_platform.done = 1;
@@ -3838,10 +3845,17 @@ void init_main_window(void) {
}
i32 handle_main_window_events(void) {
- if (g_platform.files_dropped)
+ if (g_platform.files_dropped) {
+ // NOTE: We won't be able to drop files at each
+ // of 2 sequential frames.
+
drop_files_clean_();
- g_platform.input_size = _input_size;
+ _files_dragged = 0;
+ _files_dropped = 0;
+ }
+
+ g_platform.input_len = _input_len;
g_platform.cursor_dx = _cursor_dx;
g_platform.cursor_dy = _cursor_dy;
g_platform.wheel_dx = _wheel_dx;
@@ -3849,11 +3863,11 @@ i32 handle_main_window_events(void) {
g_platform.files_dragged = _files_dragged;
g_platform.files_dropped = _files_dropped;
- _input_size = 0;
- _cursor_dx = 0;
- _cursor_dy = 0;
- _wheel_dx = 0;
- _wheel_dy = 0;
+ _input_len = 0;
+ _cursor_dx = 0;
+ _cursor_dy = 0;
+ _wheel_dx = 0;
+ _wheel_dy = 0;
if (_files_dropped) {
_files_dragged = 0;
@@ -3877,36 +3891,7 @@ i32 wait_main_window_events(void) {
}
void render_main_window_frame(void) {
- if (_frame_width == g_platform.frame_width && _frame_height == g_platform.frame_height) {
- i64 size = g_platform.frame_width * g_platform.frame_height;
- if (size > g_platform.num_pixels)
- size = g_platform.num_pixels;
- if (size > _internal_pixels_len)
- size = _internal_pixels_len;
-
- for (i64 i = 0; i < size; ++i)
- _internal_pixels[i] = 0xff000000u | rgb_u32_from_f32_((vec3_f32) { g_platform.pixels[i].z, g_platform.pixels[i].y, g_platform.pixels[i].x });
- } else {
- i64 size = g_platform.frame_width * g_platform.frame_height;
- if (size > g_platform.num_pixels)
- size = g_platform.num_pixels;
- if (size > _pixels_scaled_len)
- size = _pixels_scaled_len;
-
- for (i64 i = 0; i < size; ++i)
- _pixels_scaled[i] = rgb_u32_from_f32_((vec3_f32) { g_platform.pixels[i].z, g_platform.pixels[i].y, g_platform.pixels[i].x });
-
- for (i64 j = 0; j < _frame_height; ++j) {
- i64 j0 = (j * g_platform.frame_height) / _frame_height;
- if ((j0 + 1) * _frame_width > _internal_pixels_len) break;
- for (i64 i = 0; i < _frame_width; ++i) {
- i64 i0 = (i * g_platform.frame_width) / _frame_width;
- i64 n0 = j0 * g_platform.frame_width + i0;
- if (n0 > _pixels_scaled_len) break;
- _internal_pixels[j * _frame_width + i] = 0xff000000u | _pixels_scaled[n0];
- }
- }
- }
+ convert_pixels_for_window_();
}
void write_clipboard_text_impl(i32 size, c8 *data);
@@ -3914,14 +3899,11 @@ void write_clipboard_text_impl(i32 size, c8 *data);
void write_clipboard_text(i64 size, c8 *data) {
if (size < 0 || data == NULL)
return;
- if (size > MAX_CLIPBOARD_SIZE)
- size = MAX_CLIPBOARD_SIZE;
- g_platform.clipboard_size = size;
- for (i64 i = 0; i < size; ++i)
- g_platform.clipboard[i] = data[i];
+ store_clipboard_text_(size, data);
- write_clipboard_text_impl((i32) size, data);
+ if (g_platform.clipboard_text_len > 0)
+ write_clipboard_text_impl((i32) g_platform.clipboard_text_len - 1, data);
}
void take_screenshot(i64 max_num_pixels, i64 *width, i64 *height, vec4_f32 *pixels) {
@@ -4005,12 +3987,7 @@ __attribute__((export_name("js_pixels"))) void *js_pixels(void) {
__attribute__((export_name("js_frame"))) void js_frame(i32 frame_width, i32 frame_height, i32 num_samples) {
i64 frame_time = current_utc_time_in_milliseconds();
- if (frame_width > 0 && frame_height > 0 && frame_width * frame_height <= MAX_NUM_PIXELS) {
- _frame_width = frame_width;
- _frame_height = frame_height;
- }
-
- _num_events += pixel_size_update_(_frame_width, _frame_height);
+ _num_events += pixel_size_update_(frame_width, frame_height);
g_platform.done = 0;
@@ -4026,7 +4003,7 @@ __attribute__((export_name("js_frame"))) void js_frame(i32 frame_width, i32 fram
for (i64 i = 0; i < num_samples; ++i) {
i64 n = (_sound_read + i * NUM_PRIMARY_SOUND_CHANNELS + j) % MAX_NUM_PRIMARY_SOUND_FRAMES;
_sound_buffer[j * num_samples + i] = _sound_ring[n];
- _sound_ring[n] = 0.f;
+ _sound_ring[n] = 0.f;
}
_sound_read = (_sound_read + num_samples * NUM_PRIMARY_SOUND_CHANNELS) % MAX_NUM_PRIMARY_SOUND_FRAMES;
@@ -4068,8 +4045,12 @@ __attribute__((export_name("js_keydown"))) void js_keydown(u32 key, u32 mod, u32
g_platform.key_down[MOD_SHIFT] = (mod & 2) ? 1 : 0;
g_platform.key_down[MOD_ALT] = (mod & 4) ? 1 : 0;
g_platform.key_down[MOD_META] = (mod & 8) ? 1 : 0;
- if (g_platform.input_size < MAX_INPUT_SIZE)
- g_platform.input[_input_size++] = (Input_Key) {
+
+ i64 n = g_platform.input_len;
+ resize_dynamic_array_capacity(&g_platform.input_len, &g_platform.input_capacity, (void **) &g_platform.input, sizeof *g_platform.input, n + 1);
+
+ if (n < g_platform.input_len)
+ g_platform.input[n] = (Input_Key) {
.ctrl = (mod & 1) ? 1 : 0,
.shift = (mod & 2) ? 1 : 0,
.alt = (mod & 4) ? 1 : 0,
@@ -4094,17 +4075,15 @@ __attribute__((export_name("js_wheel"))) void js_wheel(f64 delta_x, f64 delta_y)
_wheel_dy += delta_y * MOUSE_WHEEL_FACTOR;
}
-__attribute__((export_name("js_clipboard_size"))) i32 js_clipboard_size(void) {
- return g_platform.clipboard_size;
+__attribute__((export_name("js_clipboard_text_len"))) i32 js_clipboard_text_len(void) {
+ return g_platform.clipboard_text_len;
}
-__attribute__((export_name("js_clipboard_buffer"))) void *js_clipboard_buffer(i32 len) {
+__attribute__((export_name("js_clipboard_text"))) void *js_clipboard_text(i32 len) {
if (len < 0)
len = 0;
- if (len > MAX_CLIPBOARD_SIZE)
- len = MAX_CLIPBOARD_SIZE;
- g_platform.clipboard_size = len;
- return g_platform.clipboard;
+ resize_dynamic_array_exact(&g_platform.clipboard_text_len, (void **) &g_platform.clipboard_text, 1, len);
+ return g_platform.clipboard_text;
}
__attribute__((export_name("js_dragenter"))) void js_dragenter(void) {
@@ -4115,30 +4094,42 @@ __attribute__((export_name("js_dragleave"))) void js_dragleave(void) {
_files_dragged = 0;
}
-__attribute__((export_name("js_max_drop_size"))) i32 js_max_drop_size(void) {
- return sizeof _drop_buffer;
-}
-
-__attribute__((export_name("js_drop_buffer"))) void *js_drop_buffer(void) {
- return _drop_buffer;
-}
-
-__attribute__((export_name("js_drop"))) void js_drop(i32 name_len, i32 data_size) {
- if (name_len + data_size > (i32) sizeof _drop_buffer) {
- LOG_ERROR("File too big.");
- return;
- }
-
+__attribute__((export_name("js_drop"))) i32 js_drop(i32 name_len, i32 data_size) {
i64 n = g_platform.num_drop_files;
drop_files_set_num_(n + 1);
- drop_files_set_name_(n, name_len, (c8 *) _drop_buffer);
+
+ if (n >= g_platform.num_drop_files)
+ return 0;
+
+ drop_files_set_name_(n, name_len, NULL);
drop_files_set_data_(n, data_size);
- for (i64 i = 0; i < data_size; ++i)
- g_platform.drop_files[n].data[i] = _drop_buffer[name_len + i];
+ Drop_File *f = g_platform.drop_files + n;
+
+ if (f->name_len != name_len || f->data_size != data_size) {
+ drop_files_set_name_(n, 0, NULL);
+ drop_files_set_data_(n, 0);
+ drop_files_set_num_(n);
+ return 0;
+ }
+
+ mem_set_(f->name, 0, name_len);
_files_dropped = 1;
+ return 1;
+}
+
+__attribute__((export_name("js_drop_name"))) void *js_drop_name(void) {
+ if (g_platform.num_drop_files <= 0)
+ return NULL;
+ return g_platform.drop_files[g_platform.num_drop_files - 1].name;
+}
+
+__attribute__((export_name("js_drop_data"))) void *js_drop_data(void) {
+ if (g_platform.num_drop_files <= 0)
+ return NULL;
+ return g_platform.drop_files[g_platform.num_drop_files - 1].data;
}
#endif // defined(__wasm__)