diff options
author | Tor Lillqvist <tml@novell.com> | 2005-09-08 22:37:57 +0000 |
---|---|---|
committer | Tor Lillqvist <tml@src.gnome.org> | 2005-09-08 22:37:57 +0000 |
commit | afb3753ceea2de4d89b04c82fe28eb214d160d87 (patch) | |
tree | 4317e702cdcb0db7abcddfbf26ff9777e84a665f /gdk | |
parent | 22208448293b7bd2232408a1fbebfe970dcf1df1 (diff) | |
download | gdk-pixbuf-afb3753ceea2de4d89b04c82fe28eb214d160d87.tar.gz |
Cache the display name. There is only one GdkDisplay on Win32, and
2005-09-09 Tor Lillqvist <tml@novell.com>
* gdk/win32/gdkdisplay-win32.c (gdk_display_get_name): Cache the
display name. There is only one GdkDisplay on Win32, and
constructing the display name isn't entirely trivial, so cacheing
is probably worth it. For instance GIMP calls this function a lot.
(gdk_display_open): Call gdk_display_get_name() to prime the
cached name.
(gdk_display_get_n_screens, gdk_display_get_screen,
gdk_display_get_default_screen): Verify parameter correctness like
the X11 backend does.
* gdk/win32/gdkscreen-win32.c (gdk_screen_make_display_name):
Return a freshly allocated string, as the API specifies. Fixes a
heap corruption problem that caused random errors and crashes in
GIMP, for instance.
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/win32/gdkdisplay-win32.c | 28 | ||||
-rw-r--r-- | gdk/win32/gdkscreen-win32.c | 2 |
2 files changed, 21 insertions, 9 deletions
diff --git a/gdk/win32/gdkdisplay-win32.c b/gdk/win32/gdkdisplay-win32.c index fe08e4584..499894857 100644 --- a/gdk/win32/gdkdisplay-win32.c +++ b/gdk/win32/gdkdisplay-win32.c @@ -236,6 +236,9 @@ gdk_display_open (const gchar *display_name) _gdk_input_init (_gdk_display); _gdk_dnd_init (); + /* Precalculate display name */ + (void) gdk_display_get_name (_gdk_display); + g_signal_emit_by_name (gdk_display_manager_get (), "display_opened", _gdk_display); @@ -253,9 +256,13 @@ gdk_display_get_name (GdkDisplay *display) HWINSTA hwinsta = GetProcessWindowStation (); char *window_station_name; DWORD n; - DWORD session_id; char *display_name; - const char *retval; + static const char *display_name_cache = NULL; + + g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); + + if (display_name_cache != NULL) + return display_name_cache; n = 0; GetUserObjectInformation (hdesk, UOI_NAME, &dummy, 0, &n); @@ -285,22 +292,22 @@ gdk_display_get_name (GdkDisplay *display) window_station_name = "WinSta0"; } - display_name = g_strdup_printf ("%ld\\%s\\%s", + display_name = g_strdup_printf ("%d\\%s\\%s", get_session_id (), window_station_name, desktop_name); - retval = g_quark_to_string (g_quark_from_string (display_name)); - - g_free (display_name); + GDK_NOTE (MISC, g_print ("gdk_display_get_name: %s\n", display_name)); - GDK_NOTE (MISC, g_print ("gdk_display_get_name: %s\n", retval)); + display_name_cache = display_name; - return retval; + return display_name_cache; } gint gdk_display_get_n_screens (GdkDisplay *display) { + g_return_val_if_fail (GDK_IS_DISPLAY (display), 0); + return 1; } @@ -308,12 +315,17 @@ GdkScreen * gdk_display_get_screen (GdkDisplay *display, gint screen_num) { + g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); + g_return_val_if_fail (screen_num != 0, NULL); + return _gdk_screen; } GdkScreen * gdk_display_get_default_screen (GdkDisplay *display) { + g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); + return _gdk_screen; } diff --git a/gdk/win32/gdkscreen-win32.c b/gdk/win32/gdkscreen-win32.c index 91e3ff6a2..59b5430cd 100644 --- a/gdk/win32/gdkscreen-win32.c +++ b/gdk/win32/gdkscreen-win32.c @@ -115,5 +115,5 @@ _gdk_windowing_substitute_screen_number (const gchar *display_name, gchar * gdk_screen_make_display_name (GdkScreen *screen) { - return gdk_display_get_name (_gdk_display); + return g_strdup (gdk_display_get_name (_gdk_display)); } |