diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index 792092e..3455461 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -2704,28 +2704,53 @@ gdk_window_set_decorations (GdkWindow *window, rect = [NSWindow contentRectForFrameRect:rect styleMask:old_mask]; } - /* Note, before OS 10.6 there doesn't seem to be a way to change this without - * recreating the toplevel. There might be bad side-effects of doing - * that, but it seems alright. + /* Before OS 10.6 there doesn't seem to be a way to change this without + * recreating the toplevel. From 10.6 onward, a simple call to setStyleMask + * takes care of most of this, except for ensuring that the title is set. */ if ([impl->toplevel respondsToSelector:@selector(setStyleMask:)]) { + NSString* title = [impl->toplevel title]; + [(id)impl->toplevel setStyleMask:new_mask]; + + /* It appears that unsetting and then resetting NSTitleMask does + not reset the title in the title bar as might be expected. + + In theory we only need set this if new_mask includes NSTitledMask. + This behaved extremely oddly when conditionalized upon that + and since it has no side effects (i.e. if NSTitleMask is not + requested, the title will not be displayed, just do it + unconditionally. + */ + [impl->toplevel setTitle:title]; } else { + NSString* title = [impl->toplevel title]; + NSColor* bg = [impl->toplevel backgroundColor]; + NSScreen* the_screen = [impl->toplevel screen]; + [impl->toplevel release]; + impl->toplevel = [[GdkQuartzWindow alloc] initWithContentRect:rect styleMask:new_mask backing:NSBackingStoreBuffered - defer:NO]; + defer:YES + screen:the_screen]; [impl->toplevel setHasShadow: window_type_hint_to_shadow (impl->type_hint)]; [impl->toplevel setLevel: window_type_hint_to_level (impl->type_hint)]; + [impl->toplevel setTitle:title]; + [impl->toplevel setBackgroundColor:bg]; + [impl->toplevel setHidesOnDeactivate: window_type_hint_to_hides_on_deactivate (impl->type_hint)]; [impl->toplevel setContentView:old_view]; } - [impl->toplevel setFrame:rect display:YES]; + if (new_mask == NSBorderlessWindowMask) + [impl->toplevel setContentSize:rect.size]; + else + [impl->toplevel setFrame:rect display:YES]; /* Invalidate the window shadow for non-opaque views that have shadow * enabled, to get the shadow shape updated. @@ -2921,6 +2946,7 @@ gdk_window_fullscreen (GdkWindow *window) { FullscreenSavedGeometry *geometry; GdkWindowObject *private = (GdkWindowObject *) window; + GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl); NSRect frame; if (GDK_WINDOW_DESTROYED (window) || @@ -2946,10 +2972,14 @@ gdk_window_fullscreen (GdkWindow *window) gdk_window_set_decorations (window, 0); - frame = [[NSScreen mainScreen] frame]; + frame = [[impl->toplevel screen] frame]; move_resize_window_internal (window, 0, 0, frame.size.width, frame.size.height); + [impl->toplevel setContentSize:frame.size]; + [impl->toplevel makeKeyAndOrderFront:impl->toplevel]; + + clear_toplevel_order (); } SetSystemUIMode (kUIModeAllHidden, kUIOptionAutoShowMenuBar); @@ -2960,6 +2990,8 @@ gdk_window_fullscreen (GdkWindow *window) void gdk_window_unfullscreen (GdkWindow *window) { + GdkWindowObject *private = (GdkWindowObject *) window; + GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl); FullscreenSavedGeometry *geometry; if (GDK_WINDOW_DESTROYED (window) || @@ -2981,6 +3013,8 @@ gdk_window_unfullscreen (GdkWindow *window) g_object_set_data (G_OBJECT (window), FULLSCREEN_DATA, NULL); + [impl->toplevel makeKeyAndOrderFront:impl->toplevel]; + gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FULLSCREEN, 0); } }