Blame gdk/win32/gdkdisplay-win32.c

Packit Service fb6fa5
/* GDK - The GIMP Drawing Kit
Packit Service fb6fa5
 * Copyright (C) 2002,2005 Hans Breuer
Packit Service fb6fa5
 * Copyright (C) 2003 Tor Lillqvist
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
#include "gdk.h"
Packit Service fb6fa5
#include "gdkprivate-win32.h"
Packit Service fb6fa5
Packit Service fb6fa5
#define HAVE_MONITOR_INFO
Packit Service fb6fa5
Packit Service fb6fa5
#if defined(_MSC_VER) && (WINVER < 0x500) && (WINVER > 0x0400)
Packit Service fb6fa5
#include <multimon.h>
Packit Service fb6fa5
#elif defined(_MSC_VER) && (WINVER <= 0x0400)
Packit Service fb6fa5
#undef HAVE_MONITOR_INFO
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_windowing_set_default_display (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_assert (display == NULL || _gdk_display == display);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gulong
Packit Service fb6fa5
_gdk_windowing_window_get_next_serial (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
	return 0;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef HAVE_MONITOR_INFO
Packit Service fb6fa5
static BOOL CALLBACK
Packit Service fb6fa5
count_monitor (HMONITOR hmonitor,
Packit Service fb6fa5
	       HDC      hdc,
Packit Service fb6fa5
	       LPRECT   rect,
Packit Service fb6fa5
	       LPARAM   data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint *n = (gint *) data;
Packit Service fb6fa5
Packit Service fb6fa5
  (*n)++;
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static BOOL CALLBACK
Packit Service fb6fa5
enum_monitor (HMONITOR hmonitor,
Packit Service fb6fa5
	      HDC      hdc,
Packit Service fb6fa5
	      LPRECT   rect,
Packit Service fb6fa5
	      LPARAM   data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* The struct MONITORINFOEX definition is for some reason different
Packit Service fb6fa5
   * in the winuser.h bundled with mingw64 from that in MSDN and the
Packit Service fb6fa5
   * official 32-bit mingw (the MONITORINFO part is in a separate "mi"
Packit Service fb6fa5
   * member). So to keep this easily compileable with either, repeat
Packit Service fb6fa5
   * the MSDN definition it here.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  typedef struct tagMONITORINFOEXA2 {
Packit Service fb6fa5
    DWORD cbSize;
Packit Service fb6fa5
    RECT  rcMonitor;
Packit Service fb6fa5
    RECT  rcWork;
Packit Service fb6fa5
    DWORD dwFlags;
Packit Service fb6fa5
    CHAR szDevice[CCHDEVICENAME];
Packit Service fb6fa5
  } MONITORINFOEXA2;
Packit Service fb6fa5
Packit Service fb6fa5
  MONITORINFOEXA2 monitor_info;
Packit Service fb6fa5
  HDC hDC;
Packit Service fb6fa5
Packit Service fb6fa5
  gint *index = (gint *) data;
Packit Service fb6fa5
  GdkWin32Monitor *monitor;
Packit Service fb6fa5
Packit Service fb6fa5
  g_assert (*index < _gdk_num_monitors);
Packit Service fb6fa5
Packit Service fb6fa5
  monitor = _gdk_monitors + *index;
Packit Service fb6fa5
Packit Service fb6fa5
  monitor_info.cbSize = sizeof (MONITORINFOEX);
Packit Service fb6fa5
  GetMonitorInfoA (hmonitor, (MONITORINFO *) &monitor_info);
Packit Service fb6fa5
Packit Service fb6fa5
#ifndef MONITORINFOF_PRIMARY
Packit Service fb6fa5
#define MONITORINFOF_PRIMARY 1
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
  monitor->name = g_strdup (monitor_info.szDevice);
Packit Service fb6fa5
  hDC = CreateDCA ("DISPLAY", monitor_info.szDevice, NULL, NULL);
Packit Service fb6fa5
  monitor->width_mm = GetDeviceCaps (hDC, HORZSIZE);
Packit Service fb6fa5
  monitor->height_mm = GetDeviceCaps (hDC, VERTSIZE);
Packit Service fb6fa5
  DeleteDC (hDC);
Packit Service fb6fa5
  monitor->rect.x = monitor_info.rcMonitor.left;
Packit Service fb6fa5
  monitor->rect.y = monitor_info.rcMonitor.top;
Packit Service fb6fa5
  monitor->rect.width = monitor_info.rcMonitor.right - monitor_info.rcMonitor.left;
Packit Service fb6fa5
  monitor->rect.height = monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top;
Packit Service fb6fa5
Packit Service fb6fa5
  if (monitor_info.dwFlags & MONITORINFOF_PRIMARY &&
Packit Service fb6fa5
      *index != 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Put primary monitor at index 0, just in case somebody needs
Packit Service fb6fa5
       * to know which one is the primary.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      GdkWin32Monitor temp = *monitor;
Packit Service fb6fa5
      *monitor = _gdk_monitors[0];
Packit Service fb6fa5
      _gdk_monitors[0] = temp;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  (*index)++;
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
#endif /* HAVE_MONITOR_INFO */
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_monitor_init (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
#ifdef HAVE_MONITOR_INFO
Packit Service fb6fa5
  gint i, index;
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_num_monitors = 0;
Packit Service fb6fa5
Packit Service fb6fa5
  EnumDisplayMonitors (NULL, NULL, count_monitor, (LPARAM) &_gdk_num_monitors);
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_monitors = g_renew (GdkWin32Monitor, _gdk_monitors, _gdk_num_monitors);
Packit Service fb6fa5
Packit Service fb6fa5
  index = 0;
Packit Service fb6fa5
  EnumDisplayMonitors (NULL, NULL, enum_monitor, (LPARAM) &index);
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_offset_x = G_MININT;
Packit Service fb6fa5
  _gdk_offset_y = G_MININT;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Calculate offset */
Packit Service fb6fa5
  for (i = 0; i < _gdk_num_monitors; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      _gdk_offset_x = MAX (_gdk_offset_x, -_gdk_monitors[i].rect.x);
Packit Service fb6fa5
      _gdk_offset_y = MAX (_gdk_offset_y, -_gdk_monitors[i].rect.y);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  GDK_NOTE (MISC, g_print ("Multi-monitor offset: (%d,%d)\n",
Packit Service fb6fa5
			   _gdk_offset_x, _gdk_offset_y));
Packit Service fb6fa5
Packit Service fb6fa5
  /* Translate monitor coords into GDK coordinate space */
Packit Service fb6fa5
  for (i = 0; i < _gdk_num_monitors; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      _gdk_monitors[i].rect.x += _gdk_offset_x;
Packit Service fb6fa5
      _gdk_monitors[i].rect.y += _gdk_offset_y;
Packit Service fb6fa5
      GDK_NOTE (MISC, g_print ("Monitor %d: %dx%d@%+d%+d\n",
Packit Service fb6fa5
			       i, _gdk_monitors[i].rect.width,
Packit Service fb6fa5
			       _gdk_monitors[i].rect.height,
Packit Service fb6fa5
			       _gdk_monitors[i].rect.x,
Packit Service fb6fa5
			       _gdk_monitors[i].rect.y));
Packit Service fb6fa5
    }
Packit Service fb6fa5
#else
Packit Service fb6fa5
  HDC hDC;
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_num_monitors = 1;
Packit Service fb6fa5
  _gdk_monitors = g_renew (GdkWin32Monitor, _gdk_monitors, 1);
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_monitors[0].name = g_strdup ("DISPLAY");
Packit Service fb6fa5
  hDC = GetDC (NULL);
Packit Service fb6fa5
  _gdk_monitors[0].width_mm = GetDeviceCaps (hDC, HORZSIZE);
Packit Service fb6fa5
  _gdk_monitors[0].height_mm = GetDeviceCaps (hDC, VERTSIZE);
Packit Service fb6fa5
  ReleaseDC (NULL, hDC);
Packit Service fb6fa5
  _gdk_monitors[0].rect.x = 0;
Packit Service fb6fa5
  _gdk_monitors[0].rect.y = 0;
Packit Service fb6fa5
  _gdk_monitors[0].rect.width = GetSystemMetrics (SM_CXSCREEN);
Packit Service fb6fa5
  _gdk_monitors[0].rect.height = GetSystemMetrics (SM_CYSCREEN);
Packit Service fb6fa5
  _gdk_offset_x = 0;
Packit Service fb6fa5
  _gdk_offset_y = 0;
Packit Service fb6fa5
#endif
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GdkDisplay *
Packit Service fb6fa5
gdk_display_open (const gchar *display_name)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GDK_NOTE (MISC, g_print ("gdk_display_open: %s\n", (display_name ? display_name : "NULL")));
Packit Service fb6fa5
Packit Service fb6fa5
  if (display_name == NULL ||
Packit Service fb6fa5
      g_ascii_strcasecmp (display_name,
Packit Service fb6fa5
			  gdk_display_get_name (_gdk_display)) == 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (_gdk_display != NULL)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  GDK_NOTE (MISC, g_print ("... return _gdk_display\n"));
Packit Service fb6fa5
	  return _gdk_display;
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GDK_NOTE (MISC, g_print ("... return NULL\n"));
Packit Service fb6fa5
      return NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_display = g_object_new (GDK_TYPE_DISPLAY, NULL);
Packit Service fb6fa5
  _gdk_screen = g_object_new (GDK_TYPE_SCREEN, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_monitor_init ();
Packit Service fb6fa5
  _gdk_visual_init ();
Packit Service fb6fa5
  gdk_screen_set_default_colormap (_gdk_screen,
Packit Service fb6fa5
                                   gdk_screen_get_system_colormap (_gdk_screen));
Packit Service fb6fa5
  _gdk_windowing_window_init (_gdk_screen);
Packit Service fb6fa5
  _gdk_windowing_image_init ();
Packit Service fb6fa5
  _gdk_events_init ();
Packit Service fb6fa5
  _gdk_input_init (_gdk_display);
Packit Service fb6fa5
  _gdk_dnd_init ();
Packit Service fb6fa5
Packit Service fb6fa5
  /* Precalculate display name */
Packit Service fb6fa5
  (void) gdk_display_get_name (_gdk_display);
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_emit_by_name (gdk_display_manager_get (),
Packit Service fb6fa5
			 "display_opened", _gdk_display);
Packit Service fb6fa5
Packit Service fb6fa5
  GDK_NOTE (MISC, g_print ("... _gdk_display now set up\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  return _gdk_display;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
const gchar *
Packit Service fb6fa5
gdk_display_get_name (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  HDESK hdesk = GetThreadDesktop (GetCurrentThreadId ());
Packit Service fb6fa5
  char dummy;
Packit Service fb6fa5
  char *desktop_name;
Packit Service fb6fa5
  HWINSTA hwinsta = GetProcessWindowStation ();
Packit Service fb6fa5
  char *window_station_name;
Packit Service fb6fa5
  DWORD n;
Packit Service fb6fa5
  DWORD session_id;
Packit Service fb6fa5
  char *display_name;
Packit Service fb6fa5
  static const char *display_name_cache = NULL;
Packit Service fb6fa5
  typedef BOOL (WINAPI *PFN_ProcessIdToSessionId) (DWORD, DWORD *);
Packit Service fb6fa5
  PFN_ProcessIdToSessionId processIdToSessionId;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  if (display_name_cache != NULL)
Packit Service fb6fa5
    return display_name_cache;
Packit Service fb6fa5
Packit Service fb6fa5
  n = 0;
Packit Service fb6fa5
  GetUserObjectInformation (hdesk, UOI_NAME, &dummy, 0, &n);
Packit Service fb6fa5
  if (n == 0)
Packit Service fb6fa5
    desktop_name = "Default";
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      n++;
Packit Service fb6fa5
      desktop_name = g_alloca (n + 1);
Packit Service fb6fa5
      memset (desktop_name, 0, n + 1);
Packit Service fb6fa5
Packit Service fb6fa5
      if (!GetUserObjectInformation (hdesk, UOI_NAME, desktop_name, n, &n))
Packit Service fb6fa5
	desktop_name = "Default";
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  n = 0;
Packit Service fb6fa5
  GetUserObjectInformation (hwinsta, UOI_NAME, &dummy, 0, &n);
Packit Service fb6fa5
  if (n == 0)
Packit Service fb6fa5
    window_station_name = "WinSta0";
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      n++;
Packit Service fb6fa5
      window_station_name = g_alloca (n + 1);
Packit Service fb6fa5
      memset (window_station_name, 0, n + 1);
Packit Service fb6fa5
Packit Service fb6fa5
      if (!GetUserObjectInformation (hwinsta, UOI_NAME, window_station_name, n, &n))
Packit Service fb6fa5
	window_station_name = "WinSta0";
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  processIdToSessionId = (PFN_ProcessIdToSessionId) GetProcAddress (GetModuleHandle ("kernel32.dll"), "ProcessIdToSessionId");
Packit Service fb6fa5
  if (!processIdToSessionId || !processIdToSessionId (GetCurrentProcessId (), &session_id))
Packit Service fb6fa5
    session_id = 0;
Packit Service fb6fa5
Packit Service fb6fa5
  display_name = g_strdup_printf ("%ld\\%s\\%s",
Packit Service fb6fa5
				  session_id,
Packit Service fb6fa5
				  window_station_name,
Packit Service fb6fa5
				  desktop_name);
Packit Service fb6fa5
Packit Service fb6fa5
  GDK_NOTE (MISC, g_print ("gdk_display_get_name: %s\n", display_name));
Packit Service fb6fa5
Packit Service fb6fa5
  display_name_cache = display_name;
Packit Service fb6fa5
Packit Service fb6fa5
  return display_name_cache;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gint
Packit Service fb6fa5
gdk_display_get_n_screens (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), 0);
Packit Service fb6fa5
Packit Service fb6fa5
  return 1;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GdkScreen *
Packit Service fb6fa5
gdk_display_get_screen (GdkDisplay *display,
Packit Service fb6fa5
			gint        screen_num)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
Packit Service fb6fa5
  g_return_val_if_fail (screen_num == 0, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return _gdk_screen;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GdkScreen *
Packit Service fb6fa5
gdk_display_get_default_screen (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return _gdk_screen;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GdkWindow *
Packit Service fb6fa5
gdk_display_get_default_group (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  g_warning ("gdk_display_get_default_group not yet implemented");
Packit Service fb6fa5
Packit Service fb6fa5
  return NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_display_supports_selection_notification (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static HWND _hwnd_next_viewer = NULL;
Packit Service fb6fa5
static int debug_indent = 0;
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * maybe this should be integrated with the default message loop - or maybe not ;-)
Packit Service fb6fa5
 */
Packit Service fb6fa5
static LRESULT CALLBACK
Packit Service fb6fa5
inner_clipboard_window_procedure (HWND   hwnd,
Packit Service fb6fa5
                                  UINT   message,
Packit Service fb6fa5
                                  WPARAM wparam,
Packit Service fb6fa5
                                  LPARAM lparam)
Packit Service fb6fa5
{
Packit Service fb6fa5
  switch (message)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case WM_DESTROY: /* remove us from chain */
Packit Service fb6fa5
      {
Packit Service fb6fa5
        ChangeClipboardChain (hwnd, _hwnd_next_viewer);
Packit Service fb6fa5
        PostQuitMessage (0);
Packit Service fb6fa5
        return 0;
Packit Service fb6fa5
      }
Packit Service fb6fa5
    case WM_CHANGECBCHAIN:
Packit Service fb6fa5
      {
Packit Service fb6fa5
        HWND hwndRemove = (HWND) wparam; /* handle of window being removed */
Packit Service fb6fa5
        HWND hwndNext   = (HWND) lparam; /* handle of next window in chain */
Packit Service fb6fa5
Packit Service fb6fa5
        if (hwndRemove == _hwnd_next_viewer)
Packit Service fb6fa5
          _hwnd_next_viewer = hwndNext == hwnd ? NULL : hwndNext;
Packit Service fb6fa5
        else if (_hwnd_next_viewer != NULL)
Packit Service fb6fa5
          return SendMessage (_hwnd_next_viewer, message, wparam, lparam);
Packit Service fb6fa5
Packit Service fb6fa5
        return 0;
Packit Service fb6fa5
      }
Packit Service fb6fa5
#ifdef WM_CLIPBOARDUPDATE
Packit Service fb6fa5
    case WM_CLIPBOARDUPDATE:
Packit Service fb6fa5
#endif
Packit Service fb6fa5
    case WM_DRAWCLIPBOARD:
Packit Service fb6fa5
      {
Packit Service fb6fa5
        int success;
Packit Service fb6fa5
        HWND hwndOwner;
Packit Service fb6fa5
#ifdef G_ENABLE_DEBUG
Packit Service fb6fa5
        UINT nFormat = 0;
Packit Service fb6fa5
#endif
Packit Service fb6fa5
        GdkEvent *event;
Packit Service fb6fa5
        GdkWindow *owner;
Packit Service fb6fa5
Packit Service fb6fa5
        success = OpenClipboard (hwnd);
Packit Service fb6fa5
        g_return_val_if_fail (success, 0);
Packit Service fb6fa5
        hwndOwner = GetClipboardOwner ();
Packit Service fb6fa5
        owner = gdk_win32_window_lookup_for_display (_gdk_display, hwndOwner);
Packit Service fb6fa5
        if (owner == NULL)
Packit Service fb6fa5
          owner = gdk_win32_window_foreign_new_for_display (_gdk_display, hwndOwner);
Packit Service fb6fa5
Packit Service fb6fa5
        GDK_NOTE (DND, g_print (" drawclipboard owner: %p", hwndOwner));
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef G_ENABLE_DEBUG
Packit Service fb6fa5
        if (_gdk_debug_flags & GDK_DEBUG_DND)
Packit Service fb6fa5
          {
Packit Service fb6fa5
            while ((nFormat = EnumClipboardFormats (nFormat)) != 0)
Packit Service fb6fa5
              g_print ("%s ", _gdk_win32_cf_to_string (nFormat));
Packit Service fb6fa5
          }
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
        GDK_NOTE (DND, g_print (" \n"));
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
        event = gdk_event_new (GDK_OWNER_CHANGE);
Packit Service fb6fa5
        event->owner_change.window = _gdk_root;
Packit Service fb6fa5
        event->owner_change.owner = owner;
Packit Service fb6fa5
        event->owner_change.reason = GDK_OWNER_CHANGE_NEW_OWNER;
Packit Service fb6fa5
        event->owner_change.selection = GDK_SELECTION_CLIPBOARD;
Packit Service fb6fa5
        event->owner_change.time = _gdk_win32_get_next_tick (0);
Packit Service fb6fa5
        event->owner_change.selection_time = GDK_CURRENT_TIME;
Packit Service fb6fa5
        _gdk_win32_append_event (event);
Packit Service fb6fa5
Packit Service fb6fa5
        CloseClipboard ();
Packit Service fb6fa5
Packit Service fb6fa5
        if (_hwnd_next_viewer != NULL)
Packit Service fb6fa5
          return SendMessage (_hwnd_next_viewer, message, wparam, lparam);
Packit Service fb6fa5
Packit Service fb6fa5
        /* clear error to avoid confusing SetClipboardViewer() return */
Packit Service fb6fa5
        SetLastError (0);
Packit Service fb6fa5
        return 0;
Packit Service fb6fa5
      }
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      /* Otherwise call DefWindowProcW(). */
Packit Service fb6fa5
      GDK_NOTE (EVENTS, g_print (" DefWindowProcW"));
Packit Service fb6fa5
      return DefWindowProc (hwnd, message, wparam, lparam);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static LRESULT CALLBACK
Packit Service fb6fa5
_clipboard_window_procedure (HWND   hwnd,
Packit Service fb6fa5
                             UINT   message,
Packit Service fb6fa5
                             WPARAM wparam,
Packit Service fb6fa5
                             LPARAM lparam)
Packit Service fb6fa5
{
Packit Service fb6fa5
  LRESULT retval;
Packit Service fb6fa5
Packit Service fb6fa5
  GDK_NOTE (EVENTS, g_print ("%s%*s%s %p",
Packit Service fb6fa5
			     (debug_indent > 0 ? "\n" : ""),
Packit Service fb6fa5
			     debug_indent, "",
Packit Service fb6fa5
			     _gdk_win32_message_to_string (message), hwnd));
Packit Service fb6fa5
  debug_indent += 2;
Packit Service fb6fa5
  retval = inner_clipboard_window_procedure (hwnd, message, wparam, lparam);
Packit Service fb6fa5
  debug_indent -= 2;
Packit Service fb6fa5
Packit Service fb6fa5
  GDK_NOTE (EVENTS, g_print (" => %I64d%s", (gint64) retval, (debug_indent == 0 ? "\n" : "")));
Packit Service fb6fa5
Packit Service fb6fa5
  return retval;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Creates a hidden window and adds it to the clipboard chain
Packit Service fb6fa5
 */
Packit Service fb6fa5
static HWND
Packit Service fb6fa5
_gdk_win32_register_clipboard_notification (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  WNDCLASS wclass = { 0, };
Packit Service fb6fa5
  HWND     hwnd;
Packit Service fb6fa5
  ATOM     klass;
Packit Service fb6fa5
Packit Service fb6fa5
  wclass.lpszClassName = "GdkClipboardNotification";
Packit Service fb6fa5
  wclass.lpfnWndProc   = _clipboard_window_procedure;
Packit Service fb6fa5
  wclass.hInstance     = _gdk_app_hmodule;
Packit Service fb6fa5
Packit Service fb6fa5
  klass = RegisterClass (&wclass);
Packit Service fb6fa5
  if (!klass)
Packit Service fb6fa5
    return NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  hwnd = CreateWindow (MAKEINTRESOURCE (klass),
Packit Service fb6fa5
                       NULL, WS_POPUP,
Packit Service fb6fa5
                       0, 0, 0, 0, NULL, NULL,
Packit Service fb6fa5
                       _gdk_app_hmodule, NULL);
Packit Service fb6fa5
  if (!hwnd)
Packit Service fb6fa5
    goto failed;
Packit Service fb6fa5
Packit Service fb6fa5
  SetLastError (0);
Packit Service fb6fa5
  _hwnd_next_viewer = SetClipboardViewer (hwnd);
Packit Service fb6fa5
Packit Service fb6fa5
  if (_hwnd_next_viewer == NULL && GetLastError() != 0)
Packit Service fb6fa5
    goto failed;
Packit Service fb6fa5
Packit Service fb6fa5
  /* FIXME: http://msdn.microsoft.com/en-us/library/ms649033(v=VS.85).aspx */
Packit Service fb6fa5
  /* This is only supported by Vista, and not yet by mingw64 */
Packit Service fb6fa5
  /* if (AddClipboardFormatListener (hwnd) == FALSE) */
Packit Service fb6fa5
  /*   goto failed; */
Packit Service fb6fa5
Packit Service fb6fa5
  return hwnd;
Packit Service fb6fa5
Packit Service fb6fa5
failed:
Packit Service fb6fa5
  g_critical ("Failed to install clipboard viewer");
Packit Service fb6fa5
  UnregisterClass (MAKEINTRESOURCE (klass), _gdk_app_hmodule);
Packit Service fb6fa5
  return NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_display_request_selection_notification (GdkDisplay *display,
Packit Service fb6fa5
                                            GdkAtom     selection)
Packit Service fb6fa5
Packit Service fb6fa5
{
Packit Service fb6fa5
  static HWND hwndViewer = NULL;
Packit Service fb6fa5
  gboolean ret = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  GDK_NOTE (DND,
Packit Service fb6fa5
            g_print ("gdk_display_request_selection_notification (..., %s)",
Packit Service fb6fa5
                     gdk_atom_name (selection)));
Packit Service fb6fa5
Packit Service fb6fa5
  if (selection == GDK_SELECTION_CLIPBOARD ||
Packit Service fb6fa5
      selection == GDK_SELECTION_PRIMARY)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (!hwndViewer)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          hwndViewer = _gdk_win32_register_clipboard_notification ();
Packit Service fb6fa5
          GDK_NOTE (DND, g_print (" registered"));
Packit Service fb6fa5
        }
Packit Service fb6fa5
      ret = (hwndViewer != NULL);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GDK_NOTE (DND, g_print (" unsupported"));
Packit Service fb6fa5
      ret = FALSE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  GDK_NOTE (DND, g_print (" -> %s\n", ret ? "TRUE" : "FALSE"));
Packit Service fb6fa5
  return ret;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_display_supports_clipboard_persistence (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_display_store_clipboard (GdkDisplay    *display,
Packit Service fb6fa5
			     GdkWindow     *clipboard_window,
Packit Service fb6fa5
			     guint32        time_,
Packit Service fb6fa5
			     const GdkAtom *targets,
Packit Service fb6fa5
			     gint           n_targets)
Packit Service fb6fa5
{
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_display_supports_shapes (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_display_supports_input_shapes (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Not yet implemented. See comment in
Packit Service fb6fa5
   * gdk_window_input_shape_combine_mask().
Packit Service fb6fa5
   */
Packit Service fb6fa5
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_display_supports_composite (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}