/**
 * PANDA 3D SOFTWARE
 * Copyright (c) Carnegie Mellon University.  All rights reserved.
 *
 * All use of this software is subject to the terms of the revised BSD
 * license.  You should have received a copy of this license along
 * with this source code in a file named "LICENSE."
 *
 * @file winGraphicsWindow.I
 * @author drose
 * @date 2002-12-20
 */

/**
 * Translates the mouse pixel coordinate (either x or y) as returned by the
 * Windows message to the signed number expected by Panda.
 */
INLINE int WinGraphicsWindow::
translate_mouse(int pos) const {
  if (pos & 0x8000) {
    pos -= 0x10000;
  }
  return pos;
}

/**
 * Called during the window thread in response to the various Windows messages
 * to indicate whether we believe the mouse is presently within the window's
 * client rectangle or not.  This in turn will determine whether we should
 * call update_cursor_window() to hide or show the cursor (or otherwise change
 * its properties) as it moves between the various GraphicsWindows that we
 * control.
 */
INLINE void WinGraphicsWindow::
set_cursor_in_window() {
  if (_cursor_window != this) {
    update_cursor_window(this);
  }
}

/**
 * Called during the window thread in response to the various Windows messages
 * to indicate whether we believe the mouse is presently within the window's
 * client rectangle or not.  This in turn will determine whether we should
 * call update_cursor_window() to hide or show the cursor (or otherwise change
 * its properties) as it moves between the various GraphicsWindows that we
 * control.
 */
INLINE void WinGraphicsWindow::
set_cursor_out_of_window() {
  if (_cursor_window == this) {
    update_cursor_window(nullptr);
  }
}

/**
 * May be called only during the servicing of a Windows message.  This returns
 * the time the message was added to the Windows message queue (as reported
 * via GetMessageTime()), converted into global clock units.
 */
INLINE double WinGraphicsWindow::
get_message_time() {
  DWORD now_ticks = GetTickCount();
  double now_time = ClockObject::get_global_clock()->get_real_time();
  DWORD elapsed_ticks = now_ticks - GetMessageTime();
  return now_time - (double)elapsed_ticks / 1000.0;
}

/**
 * Return the IME_window handle if open
 */
INLINE HWND WinGraphicsWindow::
get_ime_hwnd() {
  if (_ime_active)
    return _ime_hWnd;
  else
    return nullptr;
}

/**
 *
 */
INLINE WinGraphicsWindow::WindowClass::
WindowClass(const WindowProperties &props) :
  _icon(0)
{
  if (props.has_icon_filename()) {
    _icon = get_icon(props.get_icon_filename());
  }
}

/**
 *
 */
INLINE bool WinGraphicsWindow::WindowClass::
operator < (const WinGraphicsWindow::WindowClass &other) const {
  return _icon < other._icon;
}