|
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 |
}
|