aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mgl/window/event.h2
-rw-r--r--include/mgl/window/window.h2
-rw-r--r--src/window/window.c18
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;
}