diff options
-rw-r--r-- | include/mgl/window/event.h | 2 | ||||
-rw-r--r-- | include/mgl/window/window.h | 2 | ||||
-rw-r--r-- | src/window/window.c | 18 |
3 files changed, 22 insertions, 0 deletions
diff --git a/include/mgl/window/event.h b/include/mgl/window/event.h index a47568b..f6bf7fd 100644 --- a/include/mgl/window/event.h +++ b/include/mgl/window/event.h @@ -50,6 +50,8 @@ typedef enum { MGL_EVENT_UNKNOWN, MGL_EVENT_CLOSED, /* Window closed */ MGL_EVENT_RESIZED, /* Window resized */ + MGL_EVENT_LOST_FOCUS, + MGL_EVENT_GAINED_FOCUS, MGL_EVENT_TEXT_ENTERED, MGL_EVENT_KEY_PRESSED, MGL_EVENT_KEY_RELEASED, diff --git a/include/mgl/window/window.h b/include/mgl/window/window.h index aa516a8..4bbb46d 100644 --- a/include/mgl/window/window.h +++ b/include/mgl/window/window.h @@ -28,6 +28,7 @@ struct mgl_window { mgl_vec2i cursor_position; mgl_view view; bool open; + bool focused; double frame_time_limit; mgl_clock frame_timer; }; @@ -52,6 +53,7 @@ void mgl_window_set_view(mgl_window *self, mgl_view *new_view); void mgl_window_get_view(mgl_window *self, mgl_view *view); bool mgl_window_is_open(const mgl_window *self); +bool mgl_window_has_focus(const mgl_window *self); bool mgl_window_is_key_pressed(const mgl_window *self, mgl_key key); void mgl_window_close(mgl_window *self); diff --git a/src/window/window.c b/src/window/window.c index f743ef0..440eecb 100644 --- a/src/window/window.c +++ b/src/window/window.c @@ -197,6 +197,7 @@ static int mgl_window_init(mgl_window *self, const char *title, int width, int h self->window = 0; self->context = NULL; self->open = false; + self->focused = false; self->frame_time_limit = 0.0; mgl_clock_init(&self->frame_timer); @@ -313,6 +314,7 @@ static int mgl_window_init(mgl_window *self, const char *title, int width, int h XSetICFocus(x11_context->xic); self->open = true; + self->focused = false; /* TODO: Check if we need to call XGetInputFocus for this, or just wait for focus event */ return 0; } @@ -481,6 +483,16 @@ static void mgl_window_on_receive_event(mgl_window *self, XEvent *xev, mgl_event event->mouse_button.y = xev->xbutton.y; return; } + case FocusIn: { + event->type = MGL_EVENT_GAINED_FOCUS; + self->focused = true; + break; + } + case FocusOut: { + event->type = MGL_EVENT_LOST_FOCUS; + self->focused = false; + break; + } case ConfigureNotify: { while(XCheckTypedWindowEvent(context->connection, self->window, ConfigureNotify, xev)) {} if(xev->xconfigure.width != self->size.x || xev->xconfigure.height != self->size.x) { @@ -577,6 +589,10 @@ bool mgl_window_is_open(const mgl_window *self) { return self->open; } +bool mgl_window_has_focus(const mgl_window *self) { + return self->focused; +} + bool mgl_window_is_key_pressed(const mgl_window *self, mgl_key key) { if(key < 0 || key >= __MGL_NUM_KEYS__) return false; @@ -585,7 +601,9 @@ bool mgl_window_is_key_pressed(const mgl_window *self, mgl_key key) { void mgl_window_close(mgl_window *self) { mgl_context *context = mgl_get_context(); + XUnmapWindow(context->connection, self->window); XDestroyWindow(context->connection, self->window); + XSync(context->connection, False); self->open = false; } |