diff --git a/panda/src/windisplay/winGraphicsWindow.cxx b/panda/src/windisplay/winGraphicsWindow.cxx index eee9d06649..e906146a01 100644 --- a/panda/src/windisplay/winGraphicsWindow.cxx +++ b/panda/src/windisplay/winGraphicsWindow.cxx @@ -82,6 +82,34 @@ WinGraphicsWindow:: ~WinGraphicsWindow() { } +//////////////////////////////////////////////////////////////////// +// Function: WinGraphicsWindow::move_pointer +// Access: Published, Virtual +// Description: Forces the pointer to the indicated position within +// the window, if possible. +// +// Returns true if successful, false on failure. This +// may fail if the mouse is not currently within the +// window, or if the API doesn't support this operation. +//////////////////////////////////////////////////////////////////// +bool WinGraphicsWindow:: +move_pointer(int device, int x, int y) { + // Note: this is not thread-safe; it should be called only from App. + // Probably not an issue. + nassertr(device == 0, false); + if (!_properties.get_foreground()) { + // If the window doesn't have focus, forget it. + return false; + } + + RECT view_rect; + get_client_rect_screen(_hWnd, &view_rect); + + SetCursorPos(view_rect.left + x, view_rect.top + y); + _input_devices[0].set_pointer_in_window(x, y); + return true; +} + //////////////////////////////////////////////////////////////////// // Function: WinGraphicsWindow::begin_flip // Access: Public, Virtual @@ -166,6 +194,25 @@ set_properties_now(WindowProperties &properties) { // The base class has already handled this case. return; } + + if (properties.has_title()) { + string title = properties.get_title(); + _properties.set_title(title); + SetWindowText(_hWnd, title.c_str()); + properties.clear_title(); + } + + if (properties.has_cursor_hidden()) { + bool hide_cursor = properties.get_cursor_hidden(); + cerr << "Setting cursor_hidden to " << hide_cursor << "\n"; + _properties.set_cursor_hidden(hide_cursor); + if (_cursor_window == this) { + cerr << "in window now\n"; + hide_or_show_cursor(hide_cursor); + } + + properties.clear_cursor_hidden(); + } } //////////////////////////////////////////////////////////////////// @@ -308,7 +355,7 @@ fullscreen_restored(WindowProperties &) { } //////////////////////////////////////////////////////////////////// -// Function: WinGraphicsWindow::open_window +// Function: WinGraphicsWindow::do_reshape_request // Access: Protected, Virtual // Description: Called from the window thread in response to a request // from within the code (via request_properties()) to @@ -1265,21 +1312,32 @@ update_cursor_window(WinGraphicsWindow *to_window) { } } + hide_or_show_cursor(hide_cursor); + + _cursor_window = to_window; +} + +//////////////////////////////////////////////////////////////////// +// Function: WinGraphicsWindow::hide_or_show_cursor +// Access: Private, Static +// Description: Hides or shows the mouse cursor according to the +// indicated parameter. This is normally called when +// the mouse wanders into or out of a window with the +// cursor_hidden properties. +//////////////////////////////////////////////////////////////////// +void WinGraphicsWindow:: +hide_or_show_cursor(bool hide_cursor) { if (hide_cursor) { - // We should hide the cursor in the new window. if (!_cursor_hidden) { ShowCursor(false); _cursor_hidden = true; } } else { - // We should reveal the cursor in the new window. if (_cursor_hidden) { ShowCursor(true); _cursor_hidden = false; } } - - _cursor_window = to_window; } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/windisplay/winGraphicsWindow.h b/panda/src/windisplay/winGraphicsWindow.h index 8c9a0a5ddc..e278ac62d7 100644 --- a/panda/src/windisplay/winGraphicsWindow.h +++ b/panda/src/windisplay/winGraphicsWindow.h @@ -45,6 +45,8 @@ public: const string &name); virtual ~WinGraphicsWindow(); + virtual bool move_pointer(int device, int x, int y); + virtual void begin_flip(); virtual void process_events(); @@ -91,6 +93,7 @@ private: void resend_lost_keypresses(); static void update_cursor_window(WinGraphicsWindow *to_window); + static void hide_or_show_cursor(bool hide_cursor); static void register_window_class(); static bool find_acceptable_display_mode(DWORD dwWidth, DWORD dwHeight,