diff options
Diffstat (limited to 'src/window')
-rw-r--r-- | src/window/window.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/src/window/window.c b/src/window/window.c index 17066a0..8681db9 100644 --- a/src/window/window.c +++ b/src/window/window.c @@ -76,6 +76,7 @@ typedef struct { Atom net_wm_window_type_atom; Atom net_wm_window_type_normal_atom; Atom net_wm_window_type_dialog_atom; + Atom motif_wm_hints_atom; Cursor default_cursor; Cursor invisible_cursor; unsigned int prev_keycode_pressed; @@ -156,6 +157,7 @@ static int x11_context_init(x11_context *self, bool alpha) { self->glx_context = NULL; self->xim = NULL; self->xic = NULL; + /* TODO: Create all of these with one XInternAtoms call instead */ self->clipboard_atom = XInternAtom(context->connection, "CLIPBOARD", False); self->targets_atom = XInternAtom(context->connection, "TARGETS", False); self->text_atom = XInternAtom(context->connection, "TEXT", False); @@ -172,6 +174,7 @@ static int x11_context_init(x11_context *self, bool alpha) { self->net_wm_window_type_atom = XInternAtom(context->connection, "_NET_WM_WINDOW_TYPE", False); self->net_wm_window_type_normal_atom = XInternAtom(context->connection, "_NET_WM_WINDOW_TYPE_NORMAL", False); self->net_wm_window_type_dialog_atom = XInternAtom(context->connection, "_NET_WM_WINDOW_TYPE_DIALOG", False); + self->motif_wm_hints_atom = XInternAtom(context->connection, "_MOTIF_WM_HINTS", False); self->default_cursor = None; self->invisible_cursor = None; @@ -501,6 +504,30 @@ static void mgl_set_window_type(mgl_window *self, mgl_window_type window_type) { } } +typedef struct { + unsigned long flags; + unsigned long functions; + unsigned long decorations; + long input_mode; + unsigned long status; +} MotifHints; + +#define MWM_HINTS_DECORATIONS 2 + +#define MWM_DECOR_NONE 0 +#define MWM_DECOR_ALL 1 + +static void mgl_window_set_decorations_visible(mgl_window *self, bool visible) { + mgl_context *context = mgl_get_context(); + x11_context *x11_context = self->context; + + MotifHints motif_hints = {0}; + motif_hints.flags = MWM_HINTS_DECORATIONS; + motif_hints.decorations = visible ? MWM_DECOR_ALL : MWM_DECOR_NONE; + + XChangeProperty(context->connection, self->window, x11_context->motif_wm_hints_atom, x11_context->motif_wm_hints_atom, 32, PropModeReplace, (unsigned char*)&motif_hints, sizeof(motif_hints) / sizeof(long)); +} + static int mgl_window_init(mgl_window *self, const char *title, const mgl_window_create_params *params, Window existing_window) { self->window = 0; self->context = NULL; @@ -588,6 +615,11 @@ static int mgl_window_init(mgl_window *self, const char *title, const mgl_window } self->window = existing_window; + + if(params && params->hide_decorations) { + mgl_window_set_decorations_visible(self, false); + } + if(hide_window) XUnmapWindow(context->connection, existing_window); } else { @@ -601,6 +633,10 @@ static int mgl_window_init(mgl_window *self, const char *title, const mgl_window return -1; } + if(params && params->hide_decorations) { + mgl_window_set_decorations_visible(self, false); + } + mgl_window_set_title(self, title); if(!hide_window) XMapWindow(context->connection, self->window); @@ -625,7 +661,7 @@ static int mgl_window_init(mgl_window *self, const char *title, const mgl_window char host_name[HOST_NAME_MAX]; if(gethostname(host_name, sizeof(host_name)) == 0) { XTextProperty txt_prop; - txt_prop.value = host_name; + txt_prop.value = (unsigned char*)host_name; txt_prop.encoding = XA_STRING; txt_prop.format = 8; txt_prop.nitems = strlen(host_name); @@ -641,6 +677,7 @@ static int mgl_window_init(mgl_window *self, const char *title, const mgl_window XSetTransientForHint(context->connection, self->window, params->transient_for_window); } + /* TODO: Move this to above XMapWindow? */ mgl_window_type window_type = params ? params->window_type : MGL_WINDOW_TYPE_NORMAL; mgl_set_window_type(self, window_type); |