Prechádzať zdrojové kódy

Resizable flag switch on JS window

Karl Zylinski 2 mesiacov pred
rodič
commit
51906c36f2
2 zmenil súbory, kde vykonal 28 pridanie a 8 odobranie
  1. 10 2
      examples/minimal/minimal.odin
  2. 18 6
      window_js.odin

+ 10 - 2
examples/minimal/minimal.odin

@@ -13,8 +13,7 @@ _ :: mem
 tex: k2.Texture
 
 init :: proc() {
-	k2.init(1080, 1080, "Karl2D Minimal Program", {.Resizable})
-	k2.set_window_position(300, 100)
+	k2.init(1080, 1080, "Karl2D Minimal Program")
 	tex = k2.load_texture_from_bytes(#load("sixten.jpg"))
 }
 
@@ -36,6 +35,15 @@ step :: proc(dt: f32) -> bool {
 	k2.draw_circle({120, 40}, 20, k2.GREEN)
 	k2.draw_text("Hellöpe!", {10, 100}, 64, k2.WHITE)
 
+	if k2.key_went_down(.R) {
+		k2.set_window_flags({.Resizable})
+	}
+
+	if k2.key_went_down(.N) {
+		k2.set_window_flags({})
+	}
+	
+
 	k2.present()
 	free_all(context.temp_allocator)
 

+ 18 - 6
window_js.odin

@@ -45,6 +45,7 @@ js_init :: proc(
 	s = (^JS_State)(window_state)
 	s.allocator = allocator
 	s.canvas_id = "webgl-canvas"
+	s.flags = flags
 
 	// The browser window probably has some other size than what was sent in.
 	if .Resizable in flags {
@@ -63,12 +64,11 @@ js_init :: proc(
 }
 
 add_window_event_listener :: proc(evt: js.Event_Kind, callback: proc(e: js.Event)) {
-	js.add_window_event_listener(
-		evt, 
-		nil, 
-		callback,
-		true,
-	)
+	js.add_window_event_listener(evt, nil, callback, true)
+}
+
+remove_window_event_listener :: proc(evt: js.Event_Kind, callback: proc(e: js.Event)) {
+	js.remove_window_event_listener(evt, nil, callback, true)
 }
 
 add_canvas_event_listener :: proc(evt: js.Event_Kind, callback: proc(e: js.Event)) {
@@ -247,6 +247,17 @@ js_get_window_scale :: proc() -> f32 {
 }
 
 js_set_flags :: proc(flags: Window_Flags) {
+	if .Resizable in (flags ~ s.flags) {
+		if .Resizable in flags {
+			add_window_event_listener(.Resize, js_window_event_resize)
+			update_canvas_size(s.canvas_id)
+		} else {
+			remove_window_event_listener(.Resize, js_window_event_resize)
+			js_set_size(s.width, s.height)
+		}
+	}
+
+	s.flags = flags
 }
 
 js_is_gamepad_active :: proc(gamepad: int) -> bool {
@@ -287,6 +298,7 @@ JS_State :: struct {
 	height: int,
 	events: [dynamic]Window_Event,
 	gamepad_state: [MAX_GAMEPADS]js.Gamepad_State,
+	flags: Window_Flags,
 }
 
 s: ^JS_State