forked from AuroraMiddleware/gtk
55d7d50e13
2008-10-04 Tor Lillqvist <tml@novell.com> Bug 132501 - Make utility window translate to tool window in win32 Implement the utility window type hint. Such windows are kept on top of other windows. Makes GIMP's toolbox and dock windows behave more like in GNOME under metacity. Apply the same logic also to windows marked with the dialog window type hint, and windows that are transient for some other window. I'll call such windows "transient-type" below. * gdk/win32/gdkevents-win32.c (doesnt_want_key): Drop unused variables. (ensure_stacking_on_unminimize) (ensure_stacking_on_window_pos_changing) (ensure_stacking_on_activate_app): New functions to implement the desired stacking order. Make sure that a window that is not transient-type stays below any transient-type windows of the application. When activating a non-transient-type window make sure it rises as high as possible. (gdk_event_translate): Call above functions on WM_WINDOWPOSCHANGING, WM_ACTIVATEAPP and on WM_SIZE when unminimizing. Improve debugging printout. * gdk/win32/gdkwindow-win32.c (get_effective_window_decorations): Handle utility windows like toolbar windows. (gdk_window_new_internal) (update_style_bits): Give utility windows the WS_EX_TOOLWINDOW extended style. (gdk_window_set_title): If debugging "misc" or "events", make the handle of top-level windows show up in their title bars. Very useful when looking at debugging output. (gdk_window_set_keep_above) (gdk_window_set_keep_below) (gdk_window_set_modal_hint) (gdk_window_set_skip_taskbar_hint) (gdk_window_set_skip_pager_hint): Add and improve debugging printout. (gdk_window_set_type_hint): Print hint symbolically in GDK_NOTE(). 2008-10-04 Tor Lillqvist <tml@novell.com> * gdk/win32/gdkmain-win32.c (_gdk_win32_window_exstyle_to_string) (_gdk_win32_window_pos_bits_to_string): New debugging printout functions. Decode the WS_EX_* and SWP_* bits. * gdk/win32/gdkprivate-win32.h: Declare them. Define GDK_DEBUG_MISC_OR_EVENTS for use in GDK_NOTE() to match either "misc" or "events". svn path=/trunk/; revision=21587
1138 lines
27 KiB
C
1138 lines
27 KiB
C
/* GDK - The GIMP Drawing Kit
|
|
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
|
* Copyright (C) 1998-2002 Tor Lillqvist
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
* Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
/*
|
|
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
|
|
* file for a list of people on the GTK+ Team. See the ChangeLog
|
|
* files for a list of changes. These files are distributed with
|
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include <glib/gprintf.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <limits.h>
|
|
#include <io.h>
|
|
|
|
#include "gdk.h"
|
|
#include "gdkregion-generic.h"
|
|
#include "gdkkeysyms.h"
|
|
#include "gdkinternals.h"
|
|
#include "gdkintl.h"
|
|
#include "gdkprivate-win32.h"
|
|
#include "gdkinput-win32.h"
|
|
|
|
#include <objbase.h>
|
|
|
|
#include <imm.h>
|
|
|
|
static gboolean gdk_synchronize = FALSE;
|
|
|
|
static gboolean dummy;
|
|
|
|
const GOptionEntry _gdk_windowing_args[] = {
|
|
{ "sync", 0, 0, G_OPTION_ARG_NONE, &gdk_synchronize,
|
|
/* Description of --sync in --help output */ N_("Don't batch GDI requests"), NULL },
|
|
{ "no-wintab", 0, 0, G_OPTION_ARG_NONE, &_gdk_input_ignore_wintab,
|
|
/* Description of --no-wintab in --help output */ N_("Don't use the Wintab API for tablet support"), NULL },
|
|
{ "ignore-wintab", 0, 0, G_OPTION_ARG_NONE, &_gdk_input_ignore_wintab,
|
|
/* Description of --ignore-wintab in --help output */ N_("Same as --no-wintab"), NULL },
|
|
{ "use-wintab", 0, 0, G_OPTION_ARG_NONE, &dummy,
|
|
/* Description of --use-wintab in --help output */ N_("Do use the Wintab API [default]"), NULL },
|
|
{ "max-colors", 0, 0, G_OPTION_ARG_INT, &_gdk_max_colors,
|
|
/* Description of --max-colors=COLORS in --help output */ N_("Size of the palette in 8 bit mode"),
|
|
/* Placeholder in --max-colors=COLORS in --help output */ N_("COLORS") },
|
|
{ NULL }
|
|
};
|
|
|
|
int __stdcall
|
|
DllMain (HINSTANCE hinstDLL,
|
|
DWORD dwReason,
|
|
LPVOID reserved)
|
|
{
|
|
_gdk_dll_hinstance = hinstDLL;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
_gdk_windowing_init (void)
|
|
{
|
|
gchar buf[10];
|
|
|
|
if (getenv ("GDK_IGNORE_WINTAB") != NULL)
|
|
_gdk_input_ignore_wintab = TRUE;
|
|
else if (getenv ("GDK_USE_WINTAB") != NULL)
|
|
_gdk_input_ignore_wintab = FALSE;
|
|
|
|
if (gdk_synchronize)
|
|
GdiSetBatchLimit (1);
|
|
|
|
_gdk_app_hmodule = GetModuleHandle (NULL);
|
|
_gdk_display_hdc = CreateDC ("DISPLAY", NULL, NULL, NULL);
|
|
_gdk_input_locale = GetKeyboardLayout (0);
|
|
_gdk_input_locale_is_ime = ImmIsIME (_gdk_input_locale);
|
|
GetLocaleInfo (MAKELCID (LOWORD (_gdk_input_locale), SORT_DEFAULT),
|
|
LOCALE_IDEFAULTANSICODEPAGE,
|
|
buf, sizeof (buf));
|
|
_gdk_input_codepage = atoi (buf);
|
|
GDK_NOTE (EVENTS, g_print ("input_locale:%p, codepage:%d\n",
|
|
_gdk_input_locale, _gdk_input_codepage));
|
|
|
|
CoInitialize (NULL);
|
|
|
|
_cf_utf8_string = RegisterClipboardFormat ("UTF8_STRING");
|
|
_cf_image_bmp = RegisterClipboardFormat ("image/bmp");
|
|
|
|
_gdk_selection_property = gdk_atom_intern ("GDK_SELECTION", FALSE);
|
|
_wm_transient_for = gdk_atom_intern ("WM_TRANSIENT_FOR", FALSE);
|
|
_targets = gdk_atom_intern ("TARGETS", FALSE);
|
|
_save_targets = gdk_atom_intern ("SAVE_TARGETS", FALSE);
|
|
_utf8_string = gdk_atom_intern ("UTF8_STRING", FALSE);
|
|
_text = gdk_atom_intern ("TEXT", FALSE);
|
|
_compound_text = gdk_atom_intern ("COMPOUND_TEXT", FALSE);
|
|
_text_uri_list = gdk_atom_intern ("text/uri-list", FALSE);
|
|
_image_bmp = gdk_atom_intern ("image/bmp", FALSE);
|
|
|
|
_local_dnd = gdk_atom_intern ("LocalDndSelection", FALSE);
|
|
_gdk_win32_dropfiles = gdk_atom_intern ("DROPFILES_DND", FALSE);
|
|
_gdk_ole2_dnd = gdk_atom_intern ("OLE2_DND", FALSE);
|
|
|
|
_gdk_win32_selection_init ();
|
|
}
|
|
|
|
void
|
|
_gdk_win32_api_failed (const gchar *where,
|
|
gint line,
|
|
const gchar *api)
|
|
{
|
|
gchar *msg = g_win32_error_message (GetLastError ());
|
|
g_warning ("%s:%d: %s failed: %s", where, line, api, msg);
|
|
g_free (msg);
|
|
}
|
|
|
|
void
|
|
_gdk_other_api_failed (const gchar *where,
|
|
gint line,
|
|
const gchar *api)
|
|
{
|
|
g_warning ("%s:%d: %s failed", where, line, api);
|
|
}
|
|
|
|
void
|
|
gdk_set_use_xshm (gboolean use_xshm)
|
|
{
|
|
/* Always on */
|
|
}
|
|
|
|
gboolean
|
|
gdk_get_use_xshm (void)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
gint
|
|
gdk_screen_get_width (GdkScreen *screen)
|
|
{
|
|
return GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (_gdk_root)->impl)->width;
|
|
}
|
|
|
|
gint
|
|
gdk_screen_get_height (GdkScreen *screen)
|
|
{
|
|
return GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (_gdk_root)->impl)->height;
|
|
}
|
|
gint
|
|
gdk_screen_get_width_mm (GdkScreen *screen)
|
|
{
|
|
return (double) gdk_screen_get_width (screen) / GetDeviceCaps (_gdk_display_hdc, LOGPIXELSX) * 25.4;
|
|
}
|
|
|
|
gint
|
|
gdk_screen_get_height_mm (GdkScreen *screen)
|
|
{
|
|
return (double) gdk_screen_get_height (screen) / GetDeviceCaps (_gdk_display_hdc, LOGPIXELSY) * 25.4;
|
|
}
|
|
|
|
void
|
|
_gdk_windowing_display_set_sm_client_id (GdkDisplay *display,
|
|
const gchar *sm_client_id)
|
|
{
|
|
g_warning("gdk_set_sm_client_id %s", sm_client_id ? sm_client_id : "NULL");
|
|
}
|
|
|
|
void
|
|
gdk_display_beep (GdkDisplay *display)
|
|
{
|
|
g_return_if_fail (display == gdk_display_get_default());
|
|
Beep(1000, 50);
|
|
}
|
|
|
|
void
|
|
_gdk_windowing_exit (void)
|
|
{
|
|
_gdk_win32_dnd_exit ();
|
|
CoUninitialize ();
|
|
DeleteDC (_gdk_display_hdc);
|
|
_gdk_display_hdc = NULL;
|
|
}
|
|
|
|
gchar *
|
|
gdk_get_display (void)
|
|
{
|
|
return g_strdup (gdk_display_get_name (gdk_display_get_default ()));
|
|
}
|
|
|
|
void
|
|
gdk_error_trap_push (void)
|
|
{
|
|
}
|
|
|
|
gint
|
|
gdk_error_trap_pop (void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
gdk_notify_startup_complete (void)
|
|
{
|
|
}
|
|
|
|
void
|
|
gdk_notify_startup_complete_with_id (const gchar* startup_id)
|
|
{
|
|
}
|
|
|
|
void
|
|
gdk_window_set_startup_id (GdkWindow *window,
|
|
const gchar *startup_id)
|
|
{
|
|
}
|
|
|
|
#ifdef G_ENABLE_DEBUG
|
|
|
|
/*
|
|
* Like g_strdup_printf, but to a static buffer. Return value does not
|
|
* have to be g_free()d. The buffer is of bounded size and reused
|
|
* cyclically. Thus the return value is valid only until that part of
|
|
* the buffer happens to get reused. This doesn't matter as this
|
|
* function's return value is used in debugging output right after the call,
|
|
* and the return value isn't used after that.
|
|
*/
|
|
static gchar *
|
|
static_printf (const gchar *format,
|
|
...)
|
|
{
|
|
static gchar buf[10000];
|
|
gchar *msg;
|
|
static gchar *bufp = buf;
|
|
gchar *retval;
|
|
va_list args;
|
|
|
|
va_start (args, format);
|
|
msg = g_strdup_vprintf (format, args);
|
|
va_end (args);
|
|
|
|
g_assert (strlen (msg) < sizeof (buf));
|
|
|
|
if (bufp + strlen (msg) + 1 > buf + sizeof (buf))
|
|
bufp = buf;
|
|
retval = bufp;
|
|
|
|
strcpy (bufp, msg);
|
|
bufp += strlen (msg) + 1;
|
|
g_free (msg);
|
|
|
|
return retval;
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_color_to_string (const GdkColor *color)
|
|
{
|
|
return static_printf ("(%.04x,%.04x,%.04x):%.06x",
|
|
color->red, color->green,
|
|
color->blue, color->pixel);
|
|
}
|
|
|
|
void
|
|
_gdk_win32_print_paletteentries (const PALETTEENTRY *pep,
|
|
const int nentries)
|
|
{
|
|
char buf[20];
|
|
int i;
|
|
|
|
for (i = 0; i < nentries; i++)
|
|
g_print (" %3d %02x: %02x %02x %02x%s\n",
|
|
i, i,
|
|
pep[i].peRed, pep[i].peGreen, pep[i].peBlue,
|
|
(pep[i].peFlags == 0 ? "" :
|
|
(pep[i].peFlags == PC_EXPLICIT ? " PC_EXPLICIT" :
|
|
(pep[i].peFlags == PC_NOCOLLAPSE ? " PC_NOCOLLAPSE" :
|
|
(pep[i].peFlags == PC_RESERVED ? " PC_RESERVED" :
|
|
(g_sprintf (buf, " %d", pep[i].peFlags), buf))))));
|
|
}
|
|
|
|
void
|
|
_gdk_win32_print_system_palette (void)
|
|
{
|
|
PALETTEENTRY *pe;
|
|
int k;
|
|
|
|
k = GetSystemPaletteEntries (_gdk_display_hdc, 0, 0, NULL);
|
|
pe = g_new (PALETTEENTRY, k);
|
|
k = GetSystemPaletteEntries (_gdk_display_hdc, 0, k, pe);
|
|
|
|
if (!k)
|
|
g_print ("GetSystemPaletteEntries failed: %s\n",
|
|
g_win32_error_message (GetLastError ()));
|
|
else
|
|
{
|
|
g_print ("System palette: %d entries\n", k);
|
|
_gdk_win32_print_paletteentries (pe, k);
|
|
}
|
|
g_free (pe);
|
|
}
|
|
|
|
static gint
|
|
palette_size (HPALETTE hpal)
|
|
{
|
|
WORD npal = 0;
|
|
|
|
if (!GetObject (hpal, sizeof (npal), &npal))
|
|
WIN32_GDI_FAILED ("GetObject (HPALETTE)");
|
|
|
|
return npal;
|
|
}
|
|
|
|
void
|
|
_gdk_win32_print_hpalette (HPALETTE hpal)
|
|
{
|
|
PALETTEENTRY *pe;
|
|
gint n, npal;
|
|
|
|
npal = palette_size (hpal);
|
|
pe = g_new (PALETTEENTRY, npal);
|
|
n = GetPaletteEntries (hpal, 0, npal, pe);
|
|
|
|
if (!n)
|
|
g_print ("HPALETTE %p: GetPaletteEntries failed: %s\n",
|
|
hpal, g_win32_error_message (GetLastError ()));
|
|
else
|
|
{
|
|
g_print ("HPALETTE %p: %d (%d) entries\n", hpal, n, npal);
|
|
_gdk_win32_print_paletteentries (pe, n);
|
|
}
|
|
g_free (pe);
|
|
}
|
|
|
|
void
|
|
_gdk_win32_print_dc (HDC hdc)
|
|
{
|
|
HGDIOBJ obj;
|
|
LOGBRUSH logbrush;
|
|
EXTLOGPEN extlogpen;
|
|
HRGN hrgn;
|
|
RECT rect;
|
|
int flag;
|
|
|
|
g_print ("%p:\n", hdc);
|
|
obj = GetCurrentObject (hdc, OBJ_BRUSH);
|
|
GetObject (obj, sizeof (LOGBRUSH), &logbrush);
|
|
g_print ("brush: %s color=%06lx hatch=%p\n",
|
|
_gdk_win32_lbstyle_to_string (logbrush.lbStyle),
|
|
logbrush.lbColor, (gpointer) logbrush.lbHatch);
|
|
obj = GetCurrentObject (hdc, OBJ_PEN);
|
|
GetObject (obj, sizeof (EXTLOGPEN), &extlogpen);
|
|
g_print ("pen: %s %s %s %s w=%d %s\n",
|
|
_gdk_win32_pstype_to_string (extlogpen.elpPenStyle),
|
|
_gdk_win32_psstyle_to_string (extlogpen.elpPenStyle),
|
|
_gdk_win32_psendcap_to_string (extlogpen.elpPenStyle),
|
|
_gdk_win32_psjoin_to_string (extlogpen.elpPenStyle),
|
|
(int) extlogpen.elpWidth,
|
|
_gdk_win32_lbstyle_to_string (extlogpen.elpBrushStyle));
|
|
g_print ("rop2: %s textcolor=%06lx\n",
|
|
_gdk_win32_rop2_to_string (GetROP2 (hdc)),
|
|
GetTextColor (hdc));
|
|
hrgn = CreateRectRgn (0, 0, 0, 0);
|
|
if ((flag = GetClipRgn (hdc, hrgn)) == -1)
|
|
WIN32_API_FAILED ("GetClipRgn");
|
|
else if (flag == 0)
|
|
g_print ("no clip region\n");
|
|
else if (flag == 1)
|
|
{
|
|
GetRgnBox (hrgn, &rect);
|
|
g_print ("clip region: %p bbox: %s\n",
|
|
hrgn, _gdk_win32_rect_to_string (&rect));
|
|
}
|
|
DeleteObject (hrgn);
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_cap_style_to_string (GdkCapStyle cap_style)
|
|
{
|
|
switch (cap_style)
|
|
{
|
|
#define CASE(x) case GDK_CAP_##x: return #x
|
|
CASE (NOT_LAST);
|
|
CASE (BUTT);
|
|
CASE (ROUND);
|
|
CASE (PROJECTING);
|
|
#undef CASE
|
|
default: return static_printf ("illegal_%d", cap_style);
|
|
}
|
|
/* NOTREACHED */
|
|
return NULL;
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_fill_style_to_string (GdkFill fill)
|
|
{
|
|
switch (fill)
|
|
{
|
|
#define CASE(x) case GDK_##x: return #x
|
|
CASE (SOLID);
|
|
CASE (TILED);
|
|
CASE (STIPPLED);
|
|
CASE (OPAQUE_STIPPLED);
|
|
#undef CASE
|
|
default: return static_printf ("illegal_%d", fill);
|
|
}
|
|
/* NOTREACHED */
|
|
return NULL;
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_function_to_string (GdkFunction function)
|
|
{
|
|
switch (function)
|
|
{
|
|
#define CASE(x) case GDK_##x: return #x
|
|
CASE (COPY);
|
|
CASE (INVERT);
|
|
CASE (XOR);
|
|
CASE (CLEAR);
|
|
CASE (AND);
|
|
CASE (AND_REVERSE);
|
|
CASE (AND_INVERT);
|
|
CASE (NOOP);
|
|
CASE (OR);
|
|
CASE (EQUIV);
|
|
CASE (OR_REVERSE);
|
|
CASE (COPY_INVERT);
|
|
CASE (OR_INVERT);
|
|
CASE (NAND);
|
|
CASE (SET);
|
|
#undef CASE
|
|
default: return static_printf ("illegal_%d", function);
|
|
}
|
|
/* NOTREACHED */
|
|
return NULL;
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_join_style_to_string (GdkJoinStyle join_style)
|
|
{
|
|
switch (join_style)
|
|
{
|
|
#define CASE(x) case GDK_JOIN_##x: return #x
|
|
CASE (MITER);
|
|
CASE (ROUND);
|
|
CASE (BEVEL);
|
|
#undef CASE
|
|
default: return static_printf ("illegal_%d", join_style);
|
|
}
|
|
/* NOTREACHED */
|
|
return NULL;
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_line_style_to_string (GdkLineStyle line_style)
|
|
{
|
|
switch (line_style)
|
|
{
|
|
#define CASE(x) case GDK_LINE_##x: return #x
|
|
CASE(SOLID);
|
|
CASE(ON_OFF_DASH);
|
|
CASE(DOUBLE_DASH);
|
|
#undef CASE
|
|
default: return static_printf ("illegal_%d", line_style);
|
|
}
|
|
/* NOTREACHED */
|
|
return NULL;
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_gcvalues_mask_to_string (GdkGCValuesMask mask)
|
|
{
|
|
gchar buf[400];
|
|
gchar *bufp = buf;
|
|
gchar *s = "";
|
|
|
|
buf[0] = '\0';
|
|
|
|
#define BIT(x) \
|
|
if (mask & GDK_GC_##x) \
|
|
(bufp += g_sprintf (bufp, "%s" #x, s), s = "|")
|
|
|
|
BIT (FOREGROUND);
|
|
BIT (BACKGROUND);
|
|
BIT (FONT);
|
|
BIT (FUNCTION);
|
|
BIT (FILL);
|
|
BIT (TILE);
|
|
BIT (STIPPLE);
|
|
BIT (CLIP_MASK);
|
|
BIT (SUBWINDOW);
|
|
BIT (TS_X_ORIGIN);
|
|
BIT (TS_Y_ORIGIN);
|
|
BIT (CLIP_X_ORIGIN);
|
|
BIT (CLIP_Y_ORIGIN);
|
|
BIT (EXPOSURES);
|
|
BIT (LINE_WIDTH);
|
|
BIT (LINE_STYLE);
|
|
BIT (CAP_STYLE);
|
|
BIT (JOIN_STYLE);
|
|
#undef BIT
|
|
|
|
return static_printf ("%s", buf);
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_window_state_to_string (GdkWindowState state)
|
|
{
|
|
gchar buf[100];
|
|
gchar *bufp = buf;
|
|
gchar *s = "";
|
|
|
|
buf[0] = '\0';
|
|
|
|
#define BIT(x) \
|
|
if (state & GDK_WINDOW_STATE_ ## x) \
|
|
(bufp += sprintf (bufp, "%s" #x, s), s = "|")
|
|
|
|
/* For clarity, also show the complement of WITHDRAWN, i.e. "MAPPED" */
|
|
if (!(state & GDK_WINDOW_STATE_WITHDRAWN))
|
|
(bufp += sprintf (bufp, "MAPPED"), s = "|");
|
|
|
|
BIT (WITHDRAWN);
|
|
BIT (ICONIFIED);
|
|
BIT (MAXIMIZED);
|
|
BIT (STICKY);
|
|
#undef BIT
|
|
|
|
return static_printf ("%s", buf);
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_window_style_to_string (LONG style)
|
|
{
|
|
gchar buf[1000];
|
|
gchar *bufp = buf;
|
|
gchar *s = "";
|
|
|
|
buf[0] = '\0';
|
|
|
|
#define BIT(x) \
|
|
if (style & WS_ ## x) \
|
|
(bufp += sprintf (bufp, "%s" #x, s), s = "|")
|
|
|
|
/* Note that many of the WS_* macros are in face several bits.
|
|
* Handle just the individual bits here. Sort as in w32api's
|
|
* winuser.h.
|
|
*/
|
|
BIT (BORDER);
|
|
BIT (CHILD);
|
|
BIT (CLIPCHILDREN);
|
|
BIT (CLIPSIBLINGS);
|
|
BIT (DISABLED);
|
|
BIT (DLGFRAME);
|
|
BIT (GROUP);
|
|
BIT (HSCROLL);
|
|
BIT (ICONIC);
|
|
BIT (MAXIMIZE);
|
|
BIT (MAXIMIZEBOX);
|
|
BIT (MINIMIZE);
|
|
BIT (MINIMIZEBOX);
|
|
BIT (POPUP);
|
|
BIT (SIZEBOX);
|
|
BIT (SYSMENU);
|
|
BIT (TABSTOP);
|
|
BIT (THICKFRAME);
|
|
BIT (VISIBLE);
|
|
BIT (VSCROLL);
|
|
#undef BIT
|
|
|
|
return static_printf ("%s", buf);
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_window_exstyle_to_string (LONG style)
|
|
{
|
|
gchar buf[1000];
|
|
gchar *bufp = buf;
|
|
gchar *s = "";
|
|
|
|
buf[0] = '\0';
|
|
|
|
#define BIT(x) \
|
|
if (style & WS_EX_ ## x) \
|
|
(bufp += sprintf (bufp, "%s" #x, s), s = "|")
|
|
|
|
/* Note that many of the WS_EX_* macros are in face several bits.
|
|
* Handle just the individual bits here. Sort as in w32api's
|
|
* winuser.h.
|
|
*/
|
|
BIT (ACCEPTFILES);
|
|
BIT (APPWINDOW);
|
|
BIT (CLIENTEDGE);
|
|
BIT (COMPOSITED);
|
|
BIT (CONTEXTHELP);
|
|
BIT (CONTROLPARENT);
|
|
BIT (DLGMODALFRAME);
|
|
BIT (LAYERED);
|
|
BIT (LAYOUTRTL);
|
|
BIT (LEFTSCROLLBAR);
|
|
BIT (MDICHILD);
|
|
BIT (NOACTIVATE);
|
|
BIT (NOINHERITLAYOUT);
|
|
BIT (NOPARENTNOTIFY);
|
|
BIT (RIGHT);
|
|
BIT (RTLREADING);
|
|
BIT (STATICEDGE);
|
|
BIT (TOOLWINDOW);
|
|
BIT (TOPMOST);
|
|
BIT (TRANSPARENT);
|
|
BIT (WINDOWEDGE);
|
|
#undef BIT
|
|
|
|
return static_printf ("%s", buf);
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_window_pos_bits_to_string (UINT flags)
|
|
{
|
|
gchar buf[1000];
|
|
gchar *bufp = buf;
|
|
gchar *s = "";
|
|
|
|
buf[0] = '\0';
|
|
|
|
#define BIT(x) \
|
|
if (flags & SWP_ ## x) \
|
|
(bufp += sprintf (bufp, "%s" #x, s), s = "|")
|
|
|
|
BIT (DRAWFRAME);
|
|
BIT (FRAMECHANGED);
|
|
BIT (HIDEWINDOW);
|
|
BIT (NOACTIVATE);
|
|
BIT (NOCOPYBITS);
|
|
BIT (NOMOVE);
|
|
BIT (NOSIZE);
|
|
BIT (NOREDRAW);
|
|
BIT (NOZORDER);
|
|
BIT (SHOWWINDOW);
|
|
BIT (NOOWNERZORDER);
|
|
BIT (NOSENDCHANGING);
|
|
BIT (DEFERERASE);
|
|
BIT (ASYNCWINDOWPOS);
|
|
#undef BIT
|
|
|
|
return static_printf ("%s", buf);
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_rop2_to_string (int rop2)
|
|
{
|
|
switch (rop2)
|
|
{
|
|
#define CASE(x) case R2_##x: return #x
|
|
CASE (BLACK);
|
|
CASE (COPYPEN);
|
|
CASE (MASKNOTPEN);
|
|
CASE (MASKPEN);
|
|
CASE (MASKPENNOT);
|
|
CASE (MERGENOTPEN);
|
|
CASE (MERGEPEN);
|
|
CASE (MERGEPENNOT);
|
|
CASE (NOP);
|
|
CASE (NOT);
|
|
CASE (NOTCOPYPEN);
|
|
CASE (NOTMASKPEN);
|
|
CASE (NOTMERGEPEN);
|
|
CASE (NOTXORPEN);
|
|
CASE (WHITE);
|
|
CASE (XORPEN);
|
|
#undef CASE
|
|
default: return static_printf ("illegal_%x", rop2);
|
|
}
|
|
/* NOTREACHED */
|
|
return NULL;
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_lbstyle_to_string (UINT brush_style)
|
|
{
|
|
switch (brush_style)
|
|
{
|
|
#define CASE(x) case BS_##x: return #x
|
|
CASE (DIBPATTERN);
|
|
CASE (DIBPATTERNPT);
|
|
CASE (HATCHED);
|
|
CASE (HOLLOW);
|
|
CASE (PATTERN);
|
|
CASE (SOLID);
|
|
#undef CASE
|
|
default: return static_printf ("illegal_%d", brush_style);
|
|
}
|
|
/* NOTREACHED */
|
|
return NULL;
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_pstype_to_string (DWORD pen_style)
|
|
{
|
|
switch (pen_style & PS_TYPE_MASK)
|
|
{
|
|
case PS_GEOMETRIC: return "GEOMETRIC";
|
|
case PS_COSMETIC: return "COSMETIC";
|
|
default: return static_printf ("illegal_%d", pen_style & PS_TYPE_MASK);
|
|
}
|
|
/* NOTREACHED */
|
|
return NULL;
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_psstyle_to_string (DWORD pen_style)
|
|
{
|
|
switch (pen_style & PS_STYLE_MASK)
|
|
{
|
|
#define CASE(x) case PS_##x: return #x
|
|
CASE (ALTERNATE);
|
|
CASE (SOLID);
|
|
CASE (DASH);
|
|
CASE (DOT);
|
|
CASE (DASHDOT);
|
|
CASE (DASHDOTDOT);
|
|
CASE (NULL);
|
|
CASE (USERSTYLE);
|
|
CASE (INSIDEFRAME);
|
|
#undef CASE
|
|
default: return static_printf ("illegal_%d", pen_style & PS_STYLE_MASK);
|
|
}
|
|
/* NOTREACHED */
|
|
return NULL;
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_psendcap_to_string (DWORD pen_style)
|
|
{
|
|
switch (pen_style & PS_ENDCAP_MASK)
|
|
{
|
|
#define CASE(x) case PS_ENDCAP_##x: return #x
|
|
CASE (ROUND);
|
|
CASE (SQUARE);
|
|
CASE (FLAT);
|
|
#undef CASE
|
|
default: return static_printf ("illegal_%d", pen_style & PS_ENDCAP_MASK);
|
|
}
|
|
/* NOTREACHED */
|
|
return NULL;
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_psjoin_to_string (DWORD pen_style)
|
|
{
|
|
switch (pen_style & PS_JOIN_MASK)
|
|
{
|
|
#define CASE(x) case PS_JOIN_##x: return #x
|
|
CASE (ROUND);
|
|
CASE (BEVEL);
|
|
CASE (MITER);
|
|
#undef CASE
|
|
default: return static_printf ("illegal_%d", pen_style & PS_JOIN_MASK);
|
|
}
|
|
/* NOTREACHED */
|
|
return NULL;
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_message_to_string (UINT msg)
|
|
{
|
|
switch (msg)
|
|
{
|
|
#define CASE(x) case x: return #x
|
|
CASE (WM_NULL);
|
|
CASE (WM_CREATE);
|
|
CASE (WM_DESTROY);
|
|
CASE (WM_MOVE);
|
|
CASE (WM_SIZE);
|
|
CASE (WM_ACTIVATE);
|
|
CASE (WM_SETFOCUS);
|
|
CASE (WM_KILLFOCUS);
|
|
CASE (WM_ENABLE);
|
|
CASE (WM_SETREDRAW);
|
|
CASE (WM_SETTEXT);
|
|
CASE (WM_GETTEXT);
|
|
CASE (WM_GETTEXTLENGTH);
|
|
CASE (WM_PAINT);
|
|
CASE (WM_CLOSE);
|
|
CASE (WM_QUERYENDSESSION);
|
|
CASE (WM_QUERYOPEN);
|
|
CASE (WM_ENDSESSION);
|
|
CASE (WM_QUIT);
|
|
CASE (WM_ERASEBKGND);
|
|
CASE (WM_SYSCOLORCHANGE);
|
|
CASE (WM_SHOWWINDOW);
|
|
CASE (WM_WININICHANGE);
|
|
CASE (WM_DEVMODECHANGE);
|
|
CASE (WM_ACTIVATEAPP);
|
|
CASE (WM_FONTCHANGE);
|
|
CASE (WM_TIMECHANGE);
|
|
CASE (WM_CANCELMODE);
|
|
CASE (WM_SETCURSOR);
|
|
CASE (WM_MOUSEACTIVATE);
|
|
CASE (WM_CHILDACTIVATE);
|
|
CASE (WM_QUEUESYNC);
|
|
CASE (WM_GETMINMAXINFO);
|
|
CASE (WM_PAINTICON);
|
|
CASE (WM_ICONERASEBKGND);
|
|
CASE (WM_NEXTDLGCTL);
|
|
CASE (WM_SPOOLERSTATUS);
|
|
CASE (WM_DRAWITEM);
|
|
CASE (WM_MEASUREITEM);
|
|
CASE (WM_DELETEITEM);
|
|
CASE (WM_VKEYTOITEM);
|
|
CASE (WM_CHARTOITEM);
|
|
CASE (WM_SETFONT);
|
|
CASE (WM_GETFONT);
|
|
CASE (WM_SETHOTKEY);
|
|
CASE (WM_GETHOTKEY);
|
|
CASE (WM_QUERYDRAGICON);
|
|
CASE (WM_COMPAREITEM);
|
|
CASE (WM_GETOBJECT);
|
|
CASE (WM_COMPACTING);
|
|
CASE (WM_WINDOWPOSCHANGING);
|
|
CASE (WM_WINDOWPOSCHANGED);
|
|
CASE (WM_POWER);
|
|
CASE (WM_COPYDATA);
|
|
CASE (WM_CANCELJOURNAL);
|
|
CASE (WM_NOTIFY);
|
|
CASE (WM_INPUTLANGCHANGEREQUEST);
|
|
CASE (WM_INPUTLANGCHANGE);
|
|
CASE (WM_TCARD);
|
|
CASE (WM_HELP);
|
|
CASE (WM_USERCHANGED);
|
|
CASE (WM_NOTIFYFORMAT);
|
|
CASE (WM_CONTEXTMENU);
|
|
CASE (WM_STYLECHANGING);
|
|
CASE (WM_STYLECHANGED);
|
|
CASE (WM_DISPLAYCHANGE);
|
|
CASE (WM_GETICON);
|
|
CASE (WM_SETICON);
|
|
CASE (WM_NCCREATE);
|
|
CASE (WM_NCDESTROY);
|
|
CASE (WM_NCCALCSIZE);
|
|
CASE (WM_NCHITTEST);
|
|
CASE (WM_NCPAINT);
|
|
CASE (WM_NCACTIVATE);
|
|
CASE (WM_GETDLGCODE);
|
|
CASE (WM_SYNCPAINT);
|
|
CASE (WM_NCMOUSEMOVE);
|
|
CASE (WM_NCLBUTTONDOWN);
|
|
CASE (WM_NCLBUTTONUP);
|
|
CASE (WM_NCLBUTTONDBLCLK);
|
|
CASE (WM_NCRBUTTONDOWN);
|
|
CASE (WM_NCRBUTTONUP);
|
|
CASE (WM_NCRBUTTONDBLCLK);
|
|
CASE (WM_NCMBUTTONDOWN);
|
|
CASE (WM_NCMBUTTONUP);
|
|
CASE (WM_NCMBUTTONDBLCLK);
|
|
CASE (WM_NCXBUTTONDOWN);
|
|
CASE (WM_NCXBUTTONUP);
|
|
CASE (WM_NCXBUTTONDBLCLK);
|
|
CASE (WM_KEYDOWN);
|
|
CASE (WM_KEYUP);
|
|
CASE (WM_CHAR);
|
|
CASE (WM_DEADCHAR);
|
|
CASE (WM_SYSKEYDOWN);
|
|
CASE (WM_SYSKEYUP);
|
|
CASE (WM_SYSCHAR);
|
|
CASE (WM_SYSDEADCHAR);
|
|
CASE (WM_KEYLAST);
|
|
CASE (WM_IME_STARTCOMPOSITION);
|
|
CASE (WM_IME_ENDCOMPOSITION);
|
|
CASE (WM_IME_COMPOSITION);
|
|
CASE (WM_INITDIALOG);
|
|
CASE (WM_COMMAND);
|
|
CASE (WM_SYSCOMMAND);
|
|
CASE (WM_TIMER);
|
|
CASE (WM_HSCROLL);
|
|
CASE (WM_VSCROLL);
|
|
CASE (WM_INITMENU);
|
|
CASE (WM_INITMENUPOPUP);
|
|
CASE (WM_MENUSELECT);
|
|
CASE (WM_MENUCHAR);
|
|
CASE (WM_ENTERIDLE);
|
|
CASE (WM_MENURBUTTONUP);
|
|
CASE (WM_MENUDRAG);
|
|
CASE (WM_MENUGETOBJECT);
|
|
CASE (WM_UNINITMENUPOPUP);
|
|
CASE (WM_MENUCOMMAND);
|
|
CASE (WM_CHANGEUISTATE);
|
|
CASE (WM_UPDATEUISTATE);
|
|
CASE (WM_QUERYUISTATE);
|
|
CASE (WM_CTLCOLORMSGBOX);
|
|
CASE (WM_CTLCOLOREDIT);
|
|
CASE (WM_CTLCOLORLISTBOX);
|
|
CASE (WM_CTLCOLORBTN);
|
|
CASE (WM_CTLCOLORDLG);
|
|
CASE (WM_CTLCOLORSCROLLBAR);
|
|
CASE (WM_CTLCOLORSTATIC);
|
|
CASE (WM_MOUSEMOVE);
|
|
CASE (WM_LBUTTONDOWN);
|
|
CASE (WM_LBUTTONUP);
|
|
CASE (WM_LBUTTONDBLCLK);
|
|
CASE (WM_RBUTTONDOWN);
|
|
CASE (WM_RBUTTONUP);
|
|
CASE (WM_RBUTTONDBLCLK);
|
|
CASE (WM_MBUTTONDOWN);
|
|
CASE (WM_MBUTTONUP);
|
|
CASE (WM_MBUTTONDBLCLK);
|
|
CASE (WM_MOUSEWHEEL);
|
|
CASE (WM_XBUTTONDOWN);
|
|
CASE (WM_XBUTTONUP);
|
|
CASE (WM_XBUTTONDBLCLK);
|
|
CASE (WM_PARENTNOTIFY);
|
|
CASE (WM_ENTERMENULOOP);
|
|
CASE (WM_EXITMENULOOP);
|
|
CASE (WM_NEXTMENU);
|
|
CASE (WM_SIZING);
|
|
CASE (WM_CAPTURECHANGED);
|
|
CASE (WM_MOVING);
|
|
CASE (WM_POWERBROADCAST);
|
|
CASE (WM_DEVICECHANGE);
|
|
CASE (WM_MDICREATE);
|
|
CASE (WM_MDIDESTROY);
|
|
CASE (WM_MDIACTIVATE);
|
|
CASE (WM_MDIRESTORE);
|
|
CASE (WM_MDINEXT);
|
|
CASE (WM_MDIMAXIMIZE);
|
|
CASE (WM_MDITILE);
|
|
CASE (WM_MDICASCADE);
|
|
CASE (WM_MDIICONARRANGE);
|
|
CASE (WM_MDIGETACTIVE);
|
|
CASE (WM_MDISETMENU);
|
|
CASE (WM_ENTERSIZEMOVE);
|
|
CASE (WM_EXITSIZEMOVE);
|
|
CASE (WM_DROPFILES);
|
|
CASE (WM_MDIREFRESHMENU);
|
|
CASE (WM_IME_SETCONTEXT);
|
|
CASE (WM_IME_NOTIFY);
|
|
CASE (WM_IME_CONTROL);
|
|
CASE (WM_IME_COMPOSITIONFULL);
|
|
CASE (WM_IME_SELECT);
|
|
CASE (WM_IME_CHAR);
|
|
CASE (WM_IME_REQUEST);
|
|
CASE (WM_IME_KEYDOWN);
|
|
CASE (WM_IME_KEYUP);
|
|
CASE (WM_MOUSEHOVER);
|
|
CASE (WM_MOUSELEAVE);
|
|
CASE (WM_NCMOUSEHOVER);
|
|
CASE (WM_NCMOUSELEAVE);
|
|
CASE (WM_CUT);
|
|
CASE (WM_COPY);
|
|
CASE (WM_PASTE);
|
|
CASE (WM_CLEAR);
|
|
CASE (WM_UNDO);
|
|
CASE (WM_RENDERFORMAT);
|
|
CASE (WM_RENDERALLFORMATS);
|
|
CASE (WM_DESTROYCLIPBOARD);
|
|
CASE (WM_DRAWCLIPBOARD);
|
|
CASE (WM_PAINTCLIPBOARD);
|
|
CASE (WM_VSCROLLCLIPBOARD);
|
|
CASE (WM_SIZECLIPBOARD);
|
|
CASE (WM_ASKCBFORMATNAME);
|
|
CASE (WM_CHANGECBCHAIN);
|
|
CASE (WM_HSCROLLCLIPBOARD);
|
|
CASE (WM_QUERYNEWPALETTE);
|
|
CASE (WM_PALETTEISCHANGING);
|
|
CASE (WM_PALETTECHANGED);
|
|
CASE (WM_HOTKEY);
|
|
CASE (WM_PRINT);
|
|
CASE (WM_PRINTCLIENT);
|
|
CASE (WM_APPCOMMAND);
|
|
CASE (WM_HANDHELDFIRST);
|
|
CASE (WM_HANDHELDLAST);
|
|
CASE (WM_AFXFIRST);
|
|
CASE (WM_AFXLAST);
|
|
CASE (WM_PENWINFIRST);
|
|
CASE (WM_PENWINLAST);
|
|
CASE (WM_APP);
|
|
CASE (WT_PACKET);
|
|
CASE (WT_CSRCHANGE);
|
|
CASE (WT_PROXIMITY);
|
|
#undef CASE
|
|
default:
|
|
if (msg >= WM_HANDHELDFIRST && msg <= WM_HANDHELDLAST)
|
|
return static_printf ("WM_HANDHELDFIRST+%d", msg - WM_HANDHELDFIRST);
|
|
else if (msg >= WM_AFXFIRST && msg <= WM_AFXLAST)
|
|
return static_printf ("WM_AFXFIRST+%d", msg - WM_AFXFIRST);
|
|
else if (msg >= WM_PENWINFIRST && msg <= WM_PENWINLAST)
|
|
return static_printf ("WM_PENWINFIRST+%d", msg - WM_PENWINFIRST);
|
|
else if (msg >= WM_USER && msg <= 0x7FFF)
|
|
return static_printf ("WM_USER+%d", msg - WM_USER);
|
|
else if (msg >= 0xC000 && msg <= 0xFFFF)
|
|
return static_printf ("reg-%#x", msg);
|
|
else
|
|
return static_printf ("unk-%#x", msg);
|
|
}
|
|
/* NOTREACHED */
|
|
return NULL;
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_key_to_string (LONG lParam)
|
|
{
|
|
char buf[100];
|
|
gchar *keyname_utf8;
|
|
|
|
if (GetKeyNameText (lParam, buf, sizeof (buf)) &&
|
|
(keyname_utf8 = g_locale_to_utf8 (buf, -1, NULL, NULL, NULL)) != NULL)
|
|
{
|
|
gchar *retval = static_printf ("%s", keyname_utf8);
|
|
|
|
g_free (keyname_utf8);
|
|
|
|
return retval;
|
|
}
|
|
|
|
return static_printf ("unk-%#lx", lParam);
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_cf_to_string (UINT format)
|
|
{
|
|
char buf[100];
|
|
|
|
switch (format)
|
|
{
|
|
#define CASE(x) case CF_##x: return "CF_" #x
|
|
CASE (BITMAP);
|
|
CASE (DIB);
|
|
#ifdef CF_DIBV5
|
|
CASE (DIBV5);
|
|
#endif
|
|
CASE (DIF);
|
|
CASE (DSPBITMAP);
|
|
CASE (DSPENHMETAFILE);
|
|
CASE (DSPMETAFILEPICT);
|
|
CASE (DSPTEXT);
|
|
CASE (ENHMETAFILE);
|
|
CASE (HDROP);
|
|
CASE (LOCALE);
|
|
CASE (METAFILEPICT);
|
|
CASE (OEMTEXT);
|
|
CASE (OWNERDISPLAY);
|
|
CASE (PALETTE);
|
|
CASE (PENDATA);
|
|
CASE (RIFF);
|
|
CASE (SYLK);
|
|
CASE (TEXT);
|
|
CASE (WAVE);
|
|
CASE (TIFF);
|
|
CASE (UNICODETEXT);
|
|
default:
|
|
if (format >= CF_GDIOBJFIRST &&
|
|
format <= CF_GDIOBJLAST)
|
|
return static_printf ("CF_GDIOBJ%d", format - CF_GDIOBJFIRST);
|
|
if (format >= CF_PRIVATEFIRST &&
|
|
format <= CF_PRIVATELAST)
|
|
return static_printf ("CF_PRIVATE%d", format - CF_PRIVATEFIRST);
|
|
if (GetClipboardFormatName (format, buf, sizeof (buf)))
|
|
return static_printf ("'%s'", buf);
|
|
else
|
|
return static_printf ("unk-%#lx", format);
|
|
}
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_data_to_string (const guchar *data,
|
|
int nbytes)
|
|
{
|
|
GString *s = g_string_new ("");
|
|
int i;
|
|
gchar *retval;
|
|
|
|
for (i = 0; i < nbytes; i++)
|
|
if (data[i] >=' ' && data[i] <= '~')
|
|
g_string_append_printf (s, "%c ", data[i]);
|
|
else
|
|
g_string_append_printf (s, "%02X ", data[i]);
|
|
|
|
retval = static_printf ("%s", s->str);
|
|
g_string_free (s, TRUE);
|
|
|
|
return retval;
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_rect_to_string (const RECT *rect)
|
|
{
|
|
return static_printf ("%ldx%ld@%+ld%+ld",
|
|
(rect->right - rect->left), (rect->bottom - rect->top),
|
|
rect->left, rect->top);
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_gdkrectangle_to_string (const GdkRectangle *rect)
|
|
{
|
|
return static_printf ("%dx%d@%+d%+d",
|
|
rect->width, rect->height,
|
|
rect->x, rect->y);
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_gdkregion_to_string (const GdkRegion *rgn)
|
|
{
|
|
return static_printf ("%dx%d@%+d%+d",
|
|
(rgn->extents.x2 - rgn->extents.x1),
|
|
(rgn->extents.y2 - rgn->extents.y1),
|
|
rgn->extents.x1, rgn->extents.y1);
|
|
}
|
|
|
|
gchar *
|
|
_gdk_win32_drawable_description (GdkDrawable *d)
|
|
{
|
|
gint width, height, depth;
|
|
|
|
gdk_drawable_get_size (d, &width, &height);
|
|
depth = gdk_drawable_get_depth (d);
|
|
|
|
return static_printf ("%s:%p:%dx%dx%d",
|
|
G_OBJECT_TYPE_NAME (d),
|
|
GDK_DRAWABLE_HANDLE (d),
|
|
width, height, depth);
|
|
}
|
|
|
|
#endif /* G_ENABLE_DEBUG */
|