Browse Source

A window position of (-1, -1) will mean to let the WM choose a default position, and with (-2, -2) the window will be centered on screen.

rdb 16 years ago
parent
commit
eb16fccbf5

+ 8 - 5
direct/src/plugin/p3dOsxSplashWindow.cxx

@@ -80,11 +80,14 @@ set_wparams(const P3DWindowParams &wparams) {
       Rect r;
       r.top = _wparams.get_win_y();
       r.left = _wparams.get_win_x();
-      if (r.top == 0 && r.left == 0) {
-        // These are the same defaults used by Panda's osxGraphicsWindow.
-        r.top = 50;
-        r.left = 10;
-      }
+      
+      // These are the same defaults used by Panda's osxGraphicsWindow.
+      if (r.left == -1) r.left == 10;
+      if (r.top == -1) r.top == 50;
+      // A coordinate of -2 means to center the window on the screen.
+      CGRect display_bounds = CGDisplayBounds(kCGDirectMainDisplay);
+      if (r.left == -2) r.left == 0.5 * (CGRectGetWidth(display_bounds) - _win_width);
+      if (r.top == -2) r.top == 0.5 * (CGRectGetHeight(display_bounds) - _win_height);
 
       r.right = r.left + _win_width;
       r.bottom = r.top + _win_height;

+ 14 - 7
direct/src/plugin/p3dWinSplashWindow.cxx

@@ -434,6 +434,20 @@ make_window() {
   register_window_class();
   HINSTANCE application = GetModuleHandle(NULL);
   
+  int width = 320;
+  int height = 240;
+  if (_wparams.get_win_width() != 0 && _wparams.get_win_height() != 0) {
+    width = _wparams.get_win_width();
+    height = _wparams.get_win_height();
+  }
+  
+  int x = _wparams.get_win_x();
+  int y = _wparams.get_win_y();
+  if (x == -1) x = CW_USEDEFAULT;
+  if (y == -1) y = CW_USEDEFAULT;
+  if (x == -2) x = 0.5 * (GetSystemMetrics(SM_CXBORDER) - width);
+  if (y == -2) y = 0.5 * (GetSystemMetrics(SM_CYBORDER) - height);
+  GetSystemMetrics(SM_CXBORDER);
   int x = CW_USEDEFAULT;
   int y = CW_USEDEFAULT;
   if (_wparams.get_win_x() != 0 && _wparams.get_win_y() != 0) {
@@ -441,13 +455,6 @@ make_window() {
     y = _wparams.get_win_y();
   }
   
-  int width = 320;
-  int height = 240;
-  if (_wparams.get_win_width() != 0 && _wparams.get_win_height() != 0) {
-    width = _wparams.get_win_width();
-    height = _wparams.get_win_height();
-  }
-
   if (_wparams.get_window_type() == P3D_WT_embedded) {
     // Create an embedded window.
     DWORD window_style = 

+ 1 - 1
direct/src/plugin/p3dWindowParams.cxx

@@ -22,7 +22,7 @@
 P3DWindowParams::
 P3DWindowParams() :
   _window_type(P3D_WT_hidden),
-  _win_x(0), _win_y(0),
+  _win_x(-1), _win_y(-1),
   _win_width(0), _win_height(0)
 {
 }

+ 25 - 7
direct/src/plugin/p3dX11SplashWindow.cxx

@@ -25,9 +25,6 @@
 #include <signal.h>
 #include <stdint.h>
 
-// Clamps a value to two boundaries.
-#define clamp(x, lb, hb) (x < lb ? lb : (x > hb ? hb : x))
-
 ////////////////////////////////////////////////////////////////////
 //     Function: P3DX11SplashWindow::Constructor
 //       Access: Public
@@ -830,9 +827,6 @@ redraw() {
 ////////////////////////////////////////////////////////////////////
 void P3DX11SplashWindow::
 make_window() {
-  int x = _wparams.get_win_x();
-  int y = _wparams.get_win_y();
-  
   _win_width = 320;
   _win_height = 240;
   if (_wparams.get_win_width() != 0 && _wparams.get_win_height() != 0) {
@@ -853,8 +847,16 @@ make_window() {
     _display = XOpenDisplay(NULL);
     _own_display = true;
   //}
+  assert(_display != NULL);
   _screen = DefaultScreen(_display);
 
+  int x = _wparams.get_win_x();
+  int y = _wparams.get_win_y();
+  if (x == -1) x = 0;
+  if (y == -1) y = 0;
+  if (x == -2) x = 0.5 * (DisplayWidth(_display, _screen) - _win_width);
+  if (y == -2) y = 0.5 * (DisplayHeight(_display, _screen) - _win_height);
+
   if (_wparams.get_window_type() == P3D_WT_embedded) {
     // Create an embedded window.
     const P3D_window_handle &handle = _wparams.get_parent_window();
@@ -865,7 +867,6 @@ make_window() {
     parent = XRootWindow(_display, _screen);
   }
   
-  assert(_display != NULL);
   assert(parent != None);
 
   int depth = DefaultDepth(_display, _screen);
@@ -913,6 +914,23 @@ make_window() {
     (_display, parent, x, y, _win_width, _win_height,
      0, depth, InputOutput, dvisual, attrib_mask, &wa);
 
+  // Now hint the window manager about the window origin and size.
+  // This is necessary because window managers are free to ignore
+  // the window origin specified in the XCreateWindow call.
+  XSizeHints *size_hints_p = XAllocSizeHints();
+  if (_wparams.get_win_x() != -1 || _wparams.get_win_y() != -1) {
+    // If the user requested (-1, -1), the default position, we let
+    // the window manager choose a position by omitting the pos hint.
+    size_hints_p->x = x;
+    size_hints_p->y = y;
+    size_hints_p->flags |= USPosition;
+  }
+  size_hints_p->width = _win_width;
+  size_hints_p->height = _win_height;
+  size_hints_p->flags |= USSize;
+  XSetWMNormalHints(_display, _window, size_hints_p);
+  XFree(size_hints_p);
+
   if (_visible) {
     XMapWindow(_display, _window);
   }

+ 3 - 1
direct/src/plugin_standalone/panda3d.cxx

@@ -742,7 +742,9 @@ usage() {
 
     << "  -o x,y\n"
     << "    Specify the position (origin) of the graphic window on the\n"
-    << "    screen, or on the parent window.\n\n"
+    << "    screen, or on the parent window.  If you specify -1,-1\n"
+    << "    the default position will be used, and a value of -2,-2\n"
+    << "    means that the window will be centered on the screen.\n\n"
 
     << "  -l log_dirname\n"
     << "    Specify the full path to the directory in which log files are\n"

+ 6 - 2
direct/src/plugin_standalone/panda3dBase.cxx

@@ -50,8 +50,8 @@ Panda3DBase(bool console_environment) {
 
   _window_type = P3D_WT_toplevel;
 
-  _win_x = 0;
-  _win_y = 0;
+  _win_x = -1;
+  _win_y = -1;
   _win_width = 640;
   _win_height = 480;
 
@@ -73,6 +73,10 @@ Panda3DBase(bool console_environment) {
 ////////////////////////////////////////////////////////////////////
 int Panda3DBase::
 run_embedded(int read_offset, int argc, char *argv[]) {
+  // Make sure the splash window will be put in the center of the screen
+  _win_x = -2;
+  _win_y = -2;
+  
   // Read out some parameters from the binary
   pifstream read;
   Filename f = ExecutionEnvironment::get_binary_name();