Harbor

branch main
showing the latest snapshot on main
input_test.odin 5.8 KB · Plain text
examples/input_test.odin 0644 Raw
package main

import "core:fmt"
import win "../window"

// Store window pointer globally for the callback
g_window: ^win.Window

main :: proc() {
    loop, err := win.create_event_loop()
    if err != .None {
        fmt.println("Failed to create event loop:", err)
        return
    }
    defer win.destroy_event_loop(loop)

    window, err2 := win.create_window(loop, {
        title     = "Input Test - Press keys to test features",
        size      = {800, 600},
        resizable = true,
        visible   = true,
        decorated = true,
    })
    if err2 != .None {
        fmt.println("Failed to create window:", err2)
        return
    }
    defer win.destroy_window(window)

    g_window = window

    fmt.println("=== Input Feature Test ===")
    fmt.println("Keys:")
    fmt.println("  1-9,0: Change cursor shape")
    fmt.println("  H: Toggle hidden cursor")
    fmt.println("  C: Toggle confined cursor")
    fmt.println("  G: Toggle grabbed cursor")
    fmt.println("  R: Toggle raw mouse motion")
    fmt.println("  SPACE: Query pressed keys")
    fmt.println("  ESC: Exit")
    fmt.println()
    fmt.printfln("Raw motion supported: %v", win.supports_raw_mouse_motion(loop))
    fmt.println()

    win.run(loop, proc(event: win.Event, loop: ^win.Event_Loop) -> win.Control_Flow {
        window := g_window

        #partial switch e in event {
        case win.Window_Event_Data:
            #partial switch we in e.event {
            case win.Close_Requested:
                return nil  // Exit

            case win.Key_Input:
                if we.state == .Pressed {
                    #partial switch we.key {
                    case .Key_1: win.set_cursor_shape(window, .Arrow); fmt.println("Cursor: Arrow")
                    case .Key_2: win.set_cursor_shape(window, .IBeam); fmt.println("Cursor: IBeam")
                    case .Key_3: win.set_cursor_shape(window, .Crosshair); fmt.println("Cursor: Crosshair")
                    case .Key_4: win.set_cursor_shape(window, .Hand); fmt.println("Cursor: Hand")
                    case .Key_5: win.set_cursor_shape(window, .Resize_EW); fmt.println("Cursor: Resize_EW")
                    case .Key_6: win.set_cursor_shape(window, .Resize_NS); fmt.println("Cursor: Resize_NS")
                    case .Key_7: win.set_cursor_shape(window, .Resize_NWSE); fmt.println("Cursor: Resize_NWSE")
                    case .Key_8: win.set_cursor_shape(window, .Resize_NESW); fmt.println("Cursor: Resize_NESW")
                    case .Key_9: win.set_cursor_shape(window, .Resize_All); fmt.println("Cursor: Resize_All")
                    case .Key_0: win.set_cursor_shape(window, .Not_Allowed); fmt.println("Cursor: Not_Allowed")

                    case .H:
                        if win.get_cursor_mode(window) == .Hidden {
                            win.set_cursor_mode(window, .Normal)
                            fmt.println("Cursor mode: Normal")
                        } else {
                            win.set_cursor_mode(window, .Hidden)
                            fmt.println("Cursor mode: Hidden")
                        }

                    case .C:
                        if win.get_cursor_mode(window) == .Confined {
                            win.set_cursor_mode(window, .Normal)
                            fmt.println("Cursor mode: Normal")
                        } else {
                            win.set_cursor_mode(window, .Confined)
                            fmt.println("Cursor mode: Confined")
                        }

                    case .G:
                        if win.get_cursor_mode(window) == .Grabbed {
                            win.set_cursor_mode(window, .Normal)
                            fmt.println("Cursor mode: Normal")
                        } else {
                            win.set_cursor_mode(window, .Grabbed)
                            fmt.println("Cursor mode: Grabbed (press G again to release)")
                        }

                    case .R:
                        raw_enabled := win.is_raw_mouse_motion_enabled(window)
                        win.set_raw_mouse_motion(window, !raw_enabled)
                        if !raw_enabled {
                            fmt.println("Raw mouse motion: ENABLED")
                        } else {
                            fmt.println("Raw mouse motion: DISABLED")
                        }

                    case .Space:
                        fmt.println("--- Key State Polling ---")
                        mods := win.get_modifiers(loop)
                        fmt.printfln("Modifiers: Shift=%v Ctrl=%v Alt=%v Super=%v",
                            mods.shift, mods.ctrl, mods.alt, mods.super)

                        // Check some common keys
                        if win.is_key_pressed(loop, .W) do fmt.println("  W is pressed")
                        if win.is_key_pressed(loop, .A) do fmt.println("  A is pressed")
                        if win.is_key_pressed(loop, .S) do fmt.println("  S is pressed")
                        if win.is_key_pressed(loop, .D) do fmt.println("  D is pressed")

                        // Check mouse buttons
                        if win.is_mouse_button_pressed(loop, .Left) do fmt.println("  Left mouse button pressed")
                        if win.is_mouse_button_pressed(loop, .Right) do fmt.println("  Right mouse button pressed")
                        if win.is_mouse_button_pressed(loop, .Middle) do fmt.println("  Middle mouse button pressed")

                    case .Escape:
                        return nil  // Exit
                    }
                }
            }

        case win.Device_Event_Data:
            #partial switch de in e.event {
            case win.Pointer_Motion:
                fmt.printfln("Raw motion: dx=%.2f dy=%.2f", de.delta_x, de.delta_y)
            }

        case win.Loop_Exiting:
            fmt.println("Exiting...")
        }

        return win.Wait{}
    })
}