1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3 * Copyright (C) 1998-2002 Tor Lillqvist
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
23 * file for a list of people on the GTK+ Team. See the ChangeLog
24 * files for a list of changes. These files are distributed with
25 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
30 #include <glib/gprintf.h>
37 #include "gdkregion-generic.h"
38 #include "gdkkeysyms.h"
39 #include "gdkinternals.h"
41 #include "gdkprivate-win32.h"
42 #include "gdkinput-win32.h"
48 static gboolean gdk_synchronize = FALSE;
50 static gboolean dummy;
52 const GOptionEntry _gdk_windowing_args[] = {
53 { "sync", 0, 0, G_OPTION_ARG_NONE, &gdk_synchronize,
54 /* Description of --sync in --help output */ N_("Don't batch GDI requests"), NULL },
55 { "no-wintab", 0, 0, G_OPTION_ARG_NONE, &_gdk_input_ignore_wintab,
56 /* Description of --no-wintab in --help output */ N_("Don't use the Wintab API for tablet support"), NULL },
57 { "ignore-wintab", 0, 0, G_OPTION_ARG_NONE, &_gdk_input_ignore_wintab,
58 /* Description of --ignore-wintab in --help output */ N_("Same as --no-wintab"), NULL },
59 { "use-wintab", 0, 0, G_OPTION_ARG_NONE, &dummy,
60 /* Description of --use-wintab in --help output */ N_("Do use the Wintab API [default]"), NULL },
61 { "max-colors", 0, 0, G_OPTION_ARG_INT, &_gdk_max_colors,
62 /* Description of --max-colors=COLORS in --help output */ N_("Size of the palette in 8 bit mode"),
63 /* Placeholder in --max-colors=COLORS in --help output */ N_("COLORS") },
68 DllMain (HINSTANCE hinstDLL,
72 _gdk_dll_hinstance = hinstDLL;
78 _gdk_windowing_init (void)
82 if (getenv ("GDK_IGNORE_WINTAB") != NULL)
83 _gdk_input_ignore_wintab = TRUE;
84 else if (getenv ("GDK_USE_WINTAB") != NULL)
85 _gdk_input_ignore_wintab = FALSE;
90 _gdk_app_hmodule = GetModuleHandle (NULL);
91 _gdk_display_hdc = CreateDC ("DISPLAY", NULL, NULL, NULL);
92 _gdk_input_locale = GetKeyboardLayout (0);
93 _gdk_input_locale_is_ime = ImmIsIME (_gdk_input_locale);
94 GetLocaleInfo (MAKELCID (LOWORD (_gdk_input_locale), SORT_DEFAULT),
95 LOCALE_IDEFAULTANSICODEPAGE,
97 _gdk_input_codepage = atoi (buf);
98 GDK_NOTE (EVENTS, g_print ("input_locale:%p, codepage:%d\n",
99 _gdk_input_locale, _gdk_input_codepage));
103 _cf_utf8_string = RegisterClipboardFormat ("UTF8_STRING");
104 _cf_image_bmp = RegisterClipboardFormat ("image/bmp");
106 _gdk_selection_property = gdk_atom_intern ("GDK_SELECTION", FALSE);
107 _wm_transient_for = gdk_atom_intern ("WM_TRANSIENT_FOR", FALSE);
108 _targets = gdk_atom_intern ("TARGETS", FALSE);
109 _save_targets = gdk_atom_intern ("SAVE_TARGETS", FALSE);
110 _utf8_string = gdk_atom_intern ("UTF8_STRING", FALSE);
111 _text = gdk_atom_intern ("TEXT", FALSE);
112 _compound_text = gdk_atom_intern ("COMPOUND_TEXT", FALSE);
113 _text_uri_list = gdk_atom_intern ("text/uri-list", FALSE);
114 _image_bmp = gdk_atom_intern ("image/bmp", FALSE);
116 _local_dnd = gdk_atom_intern ("LocalDndSelection", FALSE);
117 _gdk_win32_dropfiles = gdk_atom_intern ("DROPFILES_DND", FALSE);
118 _gdk_ole2_dnd = gdk_atom_intern ("OLE2_DND", FALSE);
120 _gdk_win32_selection_init ();
124 _gdk_win32_api_failed (const gchar *where,
128 gchar *msg = g_win32_error_message (GetLastError ());
129 g_warning ("%s:%d: %s failed: %s", where, line, api, msg);
134 _gdk_other_api_failed (const gchar *where,
138 g_warning ("%s:%d: %s failed", where, line, api);
142 gdk_set_use_xshm (gboolean use_xshm)
148 gdk_get_use_xshm (void)
154 gdk_screen_get_width (GdkScreen *screen)
156 return GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (_gdk_root)->impl)->width;
160 gdk_screen_get_height (GdkScreen *screen)
162 return GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (_gdk_root)->impl)->height;
165 gdk_screen_get_width_mm (GdkScreen *screen)
167 return (double) gdk_screen_get_width (screen) / GetDeviceCaps (_gdk_display_hdc, LOGPIXELSX) * 25.4;
171 gdk_screen_get_height_mm (GdkScreen *screen)
173 return (double) gdk_screen_get_height (screen) / GetDeviceCaps (_gdk_display_hdc, LOGPIXELSY) * 25.4;
177 _gdk_windowing_display_set_sm_client_id (GdkDisplay *display,
178 const gchar *sm_client_id)
180 g_warning("gdk_set_sm_client_id %s", sm_client_id ? sm_client_id : "NULL");
184 gdk_display_beep (GdkDisplay *display)
186 g_return_if_fail (display == gdk_display_get_default());
191 _gdk_windowing_exit (void)
193 _gdk_win32_dnd_exit ();
195 DeleteDC (_gdk_display_hdc);
196 _gdk_display_hdc = NULL;
200 gdk_get_display (void)
202 return g_strdup (gdk_display_get_name (gdk_display_get_default ()));
206 gdk_error_trap_push (void)
211 gdk_error_trap_pop (void)
217 gdk_notify_startup_complete (void)
222 gdk_notify_startup_complete_with_id (const gchar* startup_id)
227 gdk_window_set_startup_id (GdkWindow *window,
228 const gchar *startup_id)
232 #ifdef G_ENABLE_DEBUG
235 * Like g_strdup_printf, but to a static buffer. Return value does not
236 * have to be g_free()d. The buffer is of bounded size and reused
237 * cyclically. Thus the return value is valid only until that part of
238 * the buffer happens to get reused. This doesn't matter as this
239 * function's return value is used in debugging output right after the call,
240 * and the return value isn't used after that.
243 static_printf (const gchar *format,
246 static gchar buf[10000];
248 static gchar *bufp = buf;
252 va_start (args, format);
253 msg = g_strdup_vprintf (format, args);
256 g_assert (strlen (msg) < sizeof (buf));
258 if (bufp + strlen (msg) + 1 > buf + sizeof (buf))
263 bufp += strlen (msg) + 1;
270 _gdk_win32_color_to_string (const GdkColor *color)
272 return static_printf ("(%.04x,%.04x,%.04x):%.06x",
273 color->red, color->green,
274 color->blue, color->pixel);
278 _gdk_win32_print_paletteentries (const PALETTEENTRY *pep,
284 for (i = 0; i < nentries; i++)
285 g_print (" %3d %02x: %02x %02x %02x%s\n",
287 pep[i].peRed, pep[i].peGreen, pep[i].peBlue,
288 (pep[i].peFlags == 0 ? "" :
289 (pep[i].peFlags == PC_EXPLICIT ? " PC_EXPLICIT" :
290 (pep[i].peFlags == PC_NOCOLLAPSE ? " PC_NOCOLLAPSE" :
291 (pep[i].peFlags == PC_RESERVED ? " PC_RESERVED" :
292 (g_sprintf (buf, " %d", pep[i].peFlags), buf))))));
296 _gdk_win32_print_system_palette (void)
301 k = GetSystemPaletteEntries (_gdk_display_hdc, 0, 0, NULL);
302 pe = g_new (PALETTEENTRY, k);
303 k = GetSystemPaletteEntries (_gdk_display_hdc, 0, k, pe);
306 g_print ("GetSystemPaletteEntries failed: %s\n",
307 g_win32_error_message (GetLastError ()));
310 g_print ("System palette: %d entries\n", k);
311 _gdk_win32_print_paletteentries (pe, k);
317 palette_size (HPALETTE hpal)
321 if (!GetObject (hpal, sizeof (npal), &npal))
322 WIN32_GDI_FAILED ("GetObject (HPALETTE)");
328 _gdk_win32_print_hpalette (HPALETTE hpal)
333 npal = palette_size (hpal);
334 pe = g_new (PALETTEENTRY, npal);
335 n = GetPaletteEntries (hpal, 0, npal, pe);
338 g_print ("HPALETTE %p: GetPaletteEntries failed: %s\n",
339 hpal, g_win32_error_message (GetLastError ()));
342 g_print ("HPALETTE %p: %d (%d) entries\n", hpal, n, npal);
343 _gdk_win32_print_paletteentries (pe, n);
349 _gdk_win32_print_dc (HDC hdc)
358 g_print ("%p:\n", hdc);
359 obj = GetCurrentObject (hdc, OBJ_BRUSH);
360 GetObject (obj, sizeof (LOGBRUSH), &logbrush);
361 g_print ("brush: %s color=%06lx hatch=%p\n",
362 _gdk_win32_lbstyle_to_string (logbrush.lbStyle),
363 logbrush.lbColor, (gpointer) logbrush.lbHatch);
364 obj = GetCurrentObject (hdc, OBJ_PEN);
365 GetObject (obj, sizeof (EXTLOGPEN), &extlogpen);
366 g_print ("pen: %s %s %s %s w=%d %s\n",
367 _gdk_win32_pstype_to_string (extlogpen.elpPenStyle),
368 _gdk_win32_psstyle_to_string (extlogpen.elpPenStyle),
369 _gdk_win32_psendcap_to_string (extlogpen.elpPenStyle),
370 _gdk_win32_psjoin_to_string (extlogpen.elpPenStyle),
371 (int) extlogpen.elpWidth,
372 _gdk_win32_lbstyle_to_string (extlogpen.elpBrushStyle));
373 g_print ("rop2: %s textcolor=%06lx\n",
374 _gdk_win32_rop2_to_string (GetROP2 (hdc)),
376 hrgn = CreateRectRgn (0, 0, 0, 0);
377 if ((flag = GetClipRgn (hdc, hrgn)) == -1)
378 WIN32_API_FAILED ("GetClipRgn");
380 g_print ("no clip region\n");
383 GetRgnBox (hrgn, &rect);
384 g_print ("clip region: %p bbox: %s\n",
385 hrgn, _gdk_win32_rect_to_string (&rect));
391 _gdk_win32_cap_style_to_string (GdkCapStyle cap_style)
395 #define CASE(x) case GDK_CAP_##x: return #x
401 default: return static_printf ("illegal_%d", cap_style);
408 _gdk_win32_fill_style_to_string (GdkFill fill)
412 #define CASE(x) case GDK_##x: return #x
416 CASE (OPAQUE_STIPPLED);
418 default: return static_printf ("illegal_%d", fill);
425 _gdk_win32_function_to_string (GdkFunction function)
429 #define CASE(x) case GDK_##x: return #x
446 default: return static_printf ("illegal_%d", function);
453 _gdk_win32_join_style_to_string (GdkJoinStyle join_style)
457 #define CASE(x) case GDK_JOIN_##x: return #x
462 default: return static_printf ("illegal_%d", join_style);
469 _gdk_win32_line_style_to_string (GdkLineStyle line_style)
473 #define CASE(x) case GDK_LINE_##x: return #x
478 default: return static_printf ("illegal_%d", line_style);
485 _gdk_win32_gcvalues_mask_to_string (GdkGCValuesMask mask)
494 if (mask & GDK_GC_##x) \
495 (bufp += g_sprintf (bufp, "%s" #x, s), s = "|")
517 return static_printf ("%s", buf);
521 _gdk_win32_window_state_to_string (GdkWindowState state)
530 if (state & GDK_WINDOW_STATE_ ## x) \
531 (bufp += sprintf (bufp, "%s" #x, s), s = "|")
533 /* For clarity, also show the complement of WITHDRAWN, i.e. "MAPPED" */
534 if (!(state & GDK_WINDOW_STATE_WITHDRAWN))
535 (bufp += sprintf (bufp, "MAPPED"), s = "|");
543 return static_printf ("%s", buf);
547 _gdk_win32_window_style_to_string (LONG style)
556 if (style & WS_ ## x) \
557 (bufp += sprintf (bufp, "%s" #x, s), s = "|")
559 /* Note that many of the WS_* macros are in face several bits.
560 * Handle just the individual bits here. Sort as in w32api's
585 return static_printf ("%s", buf);
589 _gdk_win32_window_exstyle_to_string (LONG style)
598 if (style & WS_EX_ ## x) \
599 (bufp += sprintf (bufp, "%s" #x, s), s = "|")
601 /* Note that many of the WS_EX_* macros are in face several bits.
602 * Handle just the individual bits here. Sort as in w32api's
617 BIT (NOINHERITLAYOUT);
618 BIT (NOPARENTNOTIFY);
628 return static_printf ("%s", buf);
632 _gdk_win32_window_pos_bits_to_string (UINT flags)
641 if (flags & SWP_ ## x) \
642 (bufp += sprintf (bufp, "%s" #x, s), s = "|")
655 BIT (NOSENDCHANGING);
657 BIT (ASYNCWINDOWPOS);
660 return static_printf ("%s", buf);
664 _gdk_win32_rop2_to_string (int rop2)
668 #define CASE(x) case R2_##x: return #x
686 default: return static_printf ("illegal_%x", rop2);
693 _gdk_win32_lbstyle_to_string (UINT brush_style)
697 #define CASE(x) case BS_##x: return #x
705 default: return static_printf ("illegal_%d", brush_style);
712 _gdk_win32_pstype_to_string (DWORD pen_style)
714 switch (pen_style & PS_TYPE_MASK)
716 case PS_GEOMETRIC: return "GEOMETRIC";
717 case PS_COSMETIC: return "COSMETIC";
718 default: return static_printf ("illegal_%d", pen_style & PS_TYPE_MASK);
725 _gdk_win32_psstyle_to_string (DWORD pen_style)
727 switch (pen_style & PS_STYLE_MASK)
729 #define CASE(x) case PS_##x: return #x
740 default: return static_printf ("illegal_%d", pen_style & PS_STYLE_MASK);
747 _gdk_win32_psendcap_to_string (DWORD pen_style)
749 switch (pen_style & PS_ENDCAP_MASK)
751 #define CASE(x) case PS_ENDCAP_##x: return #x
756 default: return static_printf ("illegal_%d", pen_style & PS_ENDCAP_MASK);
763 _gdk_win32_psjoin_to_string (DWORD pen_style)
765 switch (pen_style & PS_JOIN_MASK)
767 #define CASE(x) case PS_JOIN_##x: return #x
772 default: return static_printf ("illegal_%d", pen_style & PS_JOIN_MASK);
779 _gdk_win32_message_to_string (UINT msg)
783 #define CASE(x) case x: return #x
796 CASE (WM_GETTEXTLENGTH);
799 CASE (WM_QUERYENDSESSION);
801 CASE (WM_ENDSESSION);
803 CASE (WM_ERASEBKGND);
804 CASE (WM_SYSCOLORCHANGE);
805 CASE (WM_SHOWWINDOW);
806 CASE (WM_WININICHANGE);
807 CASE (WM_DEVMODECHANGE);
808 CASE (WM_ACTIVATEAPP);
809 CASE (WM_FONTCHANGE);
810 CASE (WM_TIMECHANGE);
811 CASE (WM_CANCELMODE);
813 CASE (WM_MOUSEACTIVATE);
814 CASE (WM_CHILDACTIVATE);
816 CASE (WM_GETMINMAXINFO);
818 CASE (WM_ICONERASEBKGND);
819 CASE (WM_NEXTDLGCTL);
820 CASE (WM_SPOOLERSTATUS);
822 CASE (WM_MEASUREITEM);
823 CASE (WM_DELETEITEM);
824 CASE (WM_VKEYTOITEM);
825 CASE (WM_CHARTOITEM);
830 CASE (WM_QUERYDRAGICON);
831 CASE (WM_COMPAREITEM);
833 CASE (WM_COMPACTING);
834 CASE (WM_WINDOWPOSCHANGING);
835 CASE (WM_WINDOWPOSCHANGED);
838 CASE (WM_CANCELJOURNAL);
840 CASE (WM_INPUTLANGCHANGEREQUEST);
841 CASE (WM_INPUTLANGCHANGE);
844 CASE (WM_USERCHANGED);
845 CASE (WM_NOTIFYFORMAT);
846 CASE (WM_CONTEXTMENU);
847 CASE (WM_STYLECHANGING);
848 CASE (WM_STYLECHANGED);
849 CASE (WM_DISPLAYCHANGE);
854 CASE (WM_NCCALCSIZE);
857 CASE (WM_NCACTIVATE);
858 CASE (WM_GETDLGCODE);
860 CASE (WM_NCMOUSEMOVE);
861 CASE (WM_NCLBUTTONDOWN);
862 CASE (WM_NCLBUTTONUP);
863 CASE (WM_NCLBUTTONDBLCLK);
864 CASE (WM_NCRBUTTONDOWN);
865 CASE (WM_NCRBUTTONUP);
866 CASE (WM_NCRBUTTONDBLCLK);
867 CASE (WM_NCMBUTTONDOWN);
868 CASE (WM_NCMBUTTONUP);
869 CASE (WM_NCMBUTTONDBLCLK);
870 CASE (WM_NCXBUTTONDOWN);
871 CASE (WM_NCXBUTTONUP);
872 CASE (WM_NCXBUTTONDBLCLK);
877 CASE (WM_SYSKEYDOWN);
880 CASE (WM_SYSDEADCHAR);
882 CASE (WM_IME_STARTCOMPOSITION);
883 CASE (WM_IME_ENDCOMPOSITION);
884 CASE (WM_IME_COMPOSITION);
885 CASE (WM_INITDIALOG);
887 CASE (WM_SYSCOMMAND);
892 CASE (WM_INITMENUPOPUP);
893 CASE (WM_MENUSELECT);
896 CASE (WM_MENURBUTTONUP);
898 CASE (WM_MENUGETOBJECT);
899 CASE (WM_UNINITMENUPOPUP);
900 CASE (WM_MENUCOMMAND);
901 CASE (WM_CHANGEUISTATE);
902 CASE (WM_UPDATEUISTATE);
903 CASE (WM_QUERYUISTATE);
904 CASE (WM_CTLCOLORMSGBOX);
905 CASE (WM_CTLCOLOREDIT);
906 CASE (WM_CTLCOLORLISTBOX);
907 CASE (WM_CTLCOLORBTN);
908 CASE (WM_CTLCOLORDLG);
909 CASE (WM_CTLCOLORSCROLLBAR);
910 CASE (WM_CTLCOLORSTATIC);
912 CASE (WM_LBUTTONDOWN);
914 CASE (WM_LBUTTONDBLCLK);
915 CASE (WM_RBUTTONDOWN);
917 CASE (WM_RBUTTONDBLCLK);
918 CASE (WM_MBUTTONDOWN);
920 CASE (WM_MBUTTONDBLCLK);
921 CASE (WM_MOUSEWHEEL);
922 CASE (WM_XBUTTONDOWN);
924 CASE (WM_XBUTTONDBLCLK);
925 CASE (WM_PARENTNOTIFY);
926 CASE (WM_ENTERMENULOOP);
927 CASE (WM_EXITMENULOOP);
930 CASE (WM_CAPTURECHANGED);
932 CASE (WM_POWERBROADCAST);
933 CASE (WM_DEVICECHANGE);
935 CASE (WM_MDIDESTROY);
936 CASE (WM_MDIACTIVATE);
937 CASE (WM_MDIRESTORE);
939 CASE (WM_MDIMAXIMIZE);
941 CASE (WM_MDICASCADE);
942 CASE (WM_MDIICONARRANGE);
943 CASE (WM_MDIGETACTIVE);
944 CASE (WM_MDISETMENU);
945 CASE (WM_ENTERSIZEMOVE);
946 CASE (WM_EXITSIZEMOVE);
948 CASE (WM_MDIREFRESHMENU);
949 CASE (WM_IME_SETCONTEXT);
950 CASE (WM_IME_NOTIFY);
951 CASE (WM_IME_CONTROL);
952 CASE (WM_IME_COMPOSITIONFULL);
953 CASE (WM_IME_SELECT);
955 CASE (WM_IME_REQUEST);
956 CASE (WM_IME_KEYDOWN);
958 CASE (WM_MOUSEHOVER);
959 CASE (WM_MOUSELEAVE);
960 CASE (WM_NCMOUSEHOVER);
961 CASE (WM_NCMOUSELEAVE);
967 CASE (WM_RENDERFORMAT);
968 CASE (WM_RENDERALLFORMATS);
969 CASE (WM_DESTROYCLIPBOARD);
970 CASE (WM_DRAWCLIPBOARD);
971 CASE (WM_PAINTCLIPBOARD);
972 CASE (WM_VSCROLLCLIPBOARD);
973 CASE (WM_SIZECLIPBOARD);
974 CASE (WM_ASKCBFORMATNAME);
975 CASE (WM_CHANGECBCHAIN);
976 CASE (WM_HSCROLLCLIPBOARD);
977 CASE (WM_QUERYNEWPALETTE);
978 CASE (WM_PALETTEISCHANGING);
979 CASE (WM_PALETTECHANGED);
982 CASE (WM_PRINTCLIENT);
983 CASE (WM_APPCOMMAND);
984 CASE (WM_HANDHELDFIRST);
985 CASE (WM_HANDHELDLAST);
988 CASE (WM_PENWINFIRST);
989 CASE (WM_PENWINLAST);
996 if (msg >= WM_HANDHELDFIRST && msg <= WM_HANDHELDLAST)
997 return static_printf ("WM_HANDHELDFIRST+%d", msg - WM_HANDHELDFIRST);
998 else if (msg >= WM_AFXFIRST && msg <= WM_AFXLAST)
999 return static_printf ("WM_AFXFIRST+%d", msg - WM_AFXFIRST);
1000 else if (msg >= WM_PENWINFIRST && msg <= WM_PENWINLAST)
1001 return static_printf ("WM_PENWINFIRST+%d", msg - WM_PENWINFIRST);
1002 else if (msg >= WM_USER && msg <= 0x7FFF)
1003 return static_printf ("WM_USER+%d", msg - WM_USER);
1004 else if (msg >= 0xC000 && msg <= 0xFFFF)
1005 return static_printf ("reg-%#x", msg);
1007 return static_printf ("unk-%#x", msg);
1014 _gdk_win32_key_to_string (LONG lParam)
1017 gchar *keyname_utf8;
1019 if (GetKeyNameText (lParam, buf, sizeof (buf)) &&
1020 (keyname_utf8 = g_locale_to_utf8 (buf, -1, NULL, NULL, NULL)) != NULL)
1022 gchar *retval = static_printf ("%s", keyname_utf8);
1024 g_free (keyname_utf8);
1029 return static_printf ("unk-%#lx", lParam);
1033 _gdk_win32_cf_to_string (UINT format)
1039 #define CASE(x) case CF_##x: return "CF_" #x
1047 CASE (DSPENHMETAFILE);
1048 CASE (DSPMETAFILEPICT);
1053 CASE (METAFILEPICT);
1055 CASE (OWNERDISPLAY);
1065 if (format >= CF_GDIOBJFIRST &&
1066 format <= CF_GDIOBJLAST)
1067 return static_printf ("CF_GDIOBJ%d", format - CF_GDIOBJFIRST);
1068 if (format >= CF_PRIVATEFIRST &&
1069 format <= CF_PRIVATELAST)
1070 return static_printf ("CF_PRIVATE%d", format - CF_PRIVATEFIRST);
1071 if (GetClipboardFormatName (format, buf, sizeof (buf)))
1072 return static_printf ("'%s'", buf);
1074 return static_printf ("unk-%#lx", format);
1079 _gdk_win32_data_to_string (const guchar *data,
1082 GString *s = g_string_new ("");
1086 for (i = 0; i < nbytes; i++)
1087 if (data[i] >=' ' && data[i] <= '~')
1088 g_string_append_printf (s, "%c ", data[i]);
1090 g_string_append_printf (s, "%02X ", data[i]);
1092 retval = static_printf ("%s", s->str);
1093 g_string_free (s, TRUE);
1099 _gdk_win32_rect_to_string (const RECT *rect)
1101 return static_printf ("%ldx%ld@%+ld%+ld",
1102 (rect->right - rect->left), (rect->bottom - rect->top),
1103 rect->left, rect->top);
1107 _gdk_win32_gdkrectangle_to_string (const GdkRectangle *rect)
1109 return static_printf ("%dx%d@%+d%+d",
1110 rect->width, rect->height,
1115 _gdk_win32_gdkregion_to_string (const GdkRegion *rgn)
1117 return static_printf ("%dx%d@%+d%+d",
1118 (rgn->extents.x2 - rgn->extents.x1),
1119 (rgn->extents.y2 - rgn->extents.y1),
1120 rgn->extents.x1, rgn->extents.y1);
1124 _gdk_win32_drawable_description (GdkDrawable *d)
1126 gint width, height, depth;
1128 gdk_drawable_get_size (d, &width, &height);
1129 depth = gdk_drawable_get_depth (d);
1131 return static_printf ("%s:%p:%dx%dx%d",
1132 G_OBJECT_TYPE_NAME (d),
1133 GDK_DRAWABLE_HANDLE (d),
1134 width, height, depth);
1137 #endif /* G_ENABLE_DEBUG */