Menus' decorations are removed on Linux. Not sure if we want the mwmborder.c a separa...
authorJ.C. Jones <jc@insufficient.coffee>
Mon, 4 Aug 2003 01:29:19 +0000 (01:29 +0000)
committerJ.C. Jones <jc@insufficient.coffee>
Mon, 4 Aug 2003 01:29:19 +0000 (01:29 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@155 7f0cb862-5218-0410-a997-914c9d46530a

src/freeglut_window.c
src/mwmborder.c [new file with mode: 0644]

index 08cb8d9..377802d 100644 (file)
@@ -33,6 +33,7 @@
 
 #include "../include/GL/freeglut.h"
 #include "freeglut_internal.h"
+#include "mwmborder.c"
 
 /*
  * TODO BEFORE THE STABLE RELEASE:
@@ -556,6 +557,15 @@ void fgOpenWindow( SFG_Window* window, const char* title, int x, int y, int w, i
     XMapWindow( fgDisplay.Display, window->Window.Handle );
 
     /*
+     * If we're a menu, then we need to ask the WM to remove decorations.
+     * This is stolen shamelessly from Brian Paul
+     * (19 Sep 1995   brianp@ssec.wisc.edu)
+     */
+    if ( window->IsMenu ) {
+      set_mwm_border(fgDisplay.Display, window->Window.Handle, 0);
+    }
+
+    /*
      * In game mode, move the viewport a bit to hide the decorations.
      * This code depends on the XFree86 video mode extensions.
      */
diff --git a/src/mwmborder.c b/src/mwmborder.c
new file mode 100644 (file)
index 0000000..0356b61
--- /dev/null
@@ -0,0 +1,89 @@
+/* mwmborder.c */
+
+
+/*
+ * This function shows how to remove the border, title bar, resize button,
+ * etc from a Motif window frame from inside an Xlib-based application.
+ *
+ * Brian Paul  19 Sep 1995   brianp@ssec.wisc.edu
+ */
+
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+
+#define HAVE_MOTIF
+#ifdef HAVE_MOTIF
+
+#include <Xm/MwmUtil.h>
+
+#else
+
+/* bit definitions for MwmHints.flags */
+#define MWM_HINTS_FUNCTIONS    (1L << 0)
+#define MWM_HINTS_DECORATIONS  (1L << 1)
+#define MWM_HINTS_INPUT_MODE   (1L << 2)
+#define MWM_HINTS_STATUS       (1L << 3)
+
+/* bit definitions for MwmHints.decorations */
+#define MWM_DECOR_ALL          (1L << 0)
+#define MWM_DECOR_BORDER       (1L << 1)
+#define MWM_DECOR_RESIZEH      (1L << 2)
+#define MWM_DECOR_TITLE                (1L << 3)
+#define MWM_DECOR_MENU         (1L << 4)
+#define MWM_DECOR_MINIMIZE     (1L << 5)
+#define MWM_DECOR_MAXIMIZE     (1L << 6)
+
+typedef struct
+{
+    unsigned long      flags;
+    unsigned long      functions;
+    unsigned long      decorations;
+    long               inputMode;
+    unsigned long      status;
+} PropMotifWmHints;
+
+#define PROP_MOTIF_WM_HINTS_ELEMENTS   5
+
+#endif
+
+
+
+/*
+ * Specify which Motif window manager border decorations to put on a
+ * top-level window.  For example, you can specify that a window is not
+ * resizabe, or omit the titlebar, or completely remove all decorations.
+ * Input:  dpy - the X display
+ *         w - the X window
+ *         flags - bitwise-OR of the MWM_DECOR_xxx symbols in X11/Xm/MwmUtil.h
+ *                 indicating what decoration elements to enable.  Zero would
+ *                 be no decoration.
+ */
+void set_mwm_border( Display *dpy, Window w, unsigned long flags )
+{
+   PropMotifWmHints motif_hints;
+   Atom prop, proptype;
+
+   /* setup the property */
+   motif_hints.flags = MWM_HINTS_DECORATIONS;
+   motif_hints.decorations = flags;
+
+   /* get the atom for the property */
+   prop = XInternAtom( dpy, "_MOTIF_WM_HINTS", True );
+   if (!prop) {
+      /* something went wrong! */
+      return;
+   }
+
+   /* not sure this is correct, seems to work, XA_WM_HINTS didn't work */
+   proptype = prop;
+
+   XChangeProperty( dpy, w,                         /* display, window */
+                    prop, proptype,                 /* property, type */
+                    32,                             /* format: 32-bit datums */
+                    PropModeReplace,                /* mode */
+                    (unsigned char *) &motif_hints, /* data */
+                    PROP_MOTIF_WM_HINTS_ELEMENTS    /* nelements */
+                  );
+}
+