diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 40225e92ac..06d4187345 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -1257,6 +1257,11 @@ _gdk_display_has_touch_grab (GdkDisplay *display, { guint i; + g_return_val_if_fail (display, NULL); + + if (!display->touch_implicit_grabs) + return NULL; + for (i = 0; i < display->touch_implicit_grabs->len; i++) { GdkTouchGrabInfo *info; @@ -1318,6 +1323,11 @@ _gdk_display_check_grab_ownership (GdkDisplay *display, GdkGrabOwnership higher_ownership, device_ownership; gboolean device_is_keyboard; + g_return_val_if_fail (display, TRUE); + + if (!display->device_grabs) + return TRUE; /* No hash table, no grabs. */ + g_hash_table_iter_init (&iter, display->device_grabs); higher_ownership = device_ownership = GDK_OWNERSHIP_NONE; device_is_keyboard = (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD); diff --git a/gdk/quartz/GdkQuartzNSWindow.c b/gdk/quartz/GdkQuartzNSWindow.c index c66fea73c8..6c8f233cf7 100644 --- a/gdk/quartz/GdkQuartzNSWindow.c +++ b/gdk/quartz/GdkQuartzNSWindow.c @@ -120,6 +120,13 @@ inMove = YES; } + +#ifdef AVAILABLE_MAC_OS_X_VERSION_10_12_AND_LATER +#define NSLeftMouseUp NSEventTypeLeftMouseUp +#define NSLeftMouseDragged NSEventTypeLeftMouseDragged +#define NSMouseEntered NSEventTypeMouseEntered +#endif + -(void)sendEvent:(NSEvent *)event { switch ([event type]) @@ -189,7 +196,6 @@ GdkWindow *window = [[self contentView] gdkWindow]; GdkEvent *event; - GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl); gboolean maximized = gdk_window_get_state (window) & GDK_WINDOW_STATE_MAXIMIZED; /* In case the window is changed when maximized remove the maximized state */ @@ -220,7 +226,6 @@ NSRect content_rect = [self contentRectForFrameRect:[self frame]]; GdkWindow *window = [[self contentView] gdkWindow]; GdkEvent *event; - GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl); gboolean maximized = gdk_window_get_state (window) & GDK_WINDOW_STATE_MAXIMIZED; /* see same in windowDidMove */ @@ -256,7 +261,15 @@ [self checkSendEnterNotify]; } --(id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag screen:(NSScreen *)screen +-(id)initWithContentRect:(NSRect)contentRect +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101200 + styleMask:(NSUInteger)styleMask +#else + styleMask:(NSWindowStyleMask)styleMask +#endif + backing:(NSBackingStoreType)backingType + defer:(BOOL)flag + screen:(NSScreen *)screen { self = [super initWithContentRect:contentRect styleMask:styleMask @@ -366,6 +379,22 @@ initialPositionKnown = NO; } +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101200 +- (NSPoint)convertPointToScreen:(NSPoint)point +{ + NSRect inrect = NSMakeRect (point.x, point.y, 0.0, 0.0); + NSRect outrect = [self convertRectToScreen: inrect]; + return (NSPoint)((CGRect)outrect).origin; + +} + +- (NSPoint)convertPointFromScreen:(NSPoint)point +{ + NSRect inrect = NSMakeRect (point.x, point.y, 0.0, 0.0); + NSRect outrect = [self convertRectFromScreen: inrect]; + return (NSPoint)((CGRect)outrect).origin; +} +#endif - (BOOL)trackManualMove { @@ -378,8 +407,11 @@ if (!inManualMove) return NO; - +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 currentLocation = [self convertBaseToScreen:[self mouseLocationOutsideOfEventStream]]; +#else + currentLocation = [self convertPointToScreen:[self mouseLocationOutsideOfEventStream]]; +#endif newOrigin.x = currentLocation.x - initialMoveLocation.x; newOrigin.y = currentLocation.y - initialMoveLocation.y; @@ -410,7 +442,11 @@ inManualMove = YES; +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 initialMoveLocation = [self convertBaseToScreen:[self mouseLocationOutsideOfEventStream]]; +#else + initialMoveLocation = [self convertPointToScreen:[self mouseLocationOutsideOfEventStream]]; +#endif initialMoveLocation.x -= frame.origin.x; initialMoveLocation.y -= frame.origin.y; } @@ -427,7 +463,11 @@ inTrackManualResize = YES; +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 mouse_location = [self convertBaseToScreen:[self mouseLocationOutsideOfEventStream]]; +#else + mouse_location = [self convertPointToScreen:[self mouseLocationOutsideOfEventStream]]; +#endif mdx = initialResizeLocation.x - mouse_location.x; mdy = initialResizeLocation.y - mouse_location.y; @@ -512,7 +552,12 @@ resizeEdge = edge; initialResizeFrame = [self frame]; + +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 initialResizeLocation = [self convertBaseToScreen:[self mouseLocationOutsideOfEventStream]]; +#else + initialResizeLocation = [self convertPointToScreen:[self mouseLocationOutsideOfEventStream]]; +#endif } @@ -578,7 +623,7 @@ update_context_from_dragging_info (id sender) - (NSDragOperation)draggingEntered:(id )sender { - GdkDeviceManager *device_manager; + GdkSeat *seat = NULL; GdkEvent *event; GdkWindow *window; @@ -592,10 +637,8 @@ update_context_from_dragging_info (id sender) current_context->display = gdk_window_get_display (window); - device_manager = gdk_display_get_device_manager (gdk_display_get_default ()); - gdk_drag_context_set_device (current_context, - gdk_device_manager_get_client_pointer (device_manager)); - + seat = gdk_display_get_default_seat (gdk_display_get_default ()); + gdk_drag_context_set_device (current_context, gdk_seat_get_pointer (seat)); event = gdk_event_new (GDK_DRAG_ENTER); event->dnd.window = g_object_ref (window); event->dnd.send_event = FALSE; @@ -647,7 +690,13 @@ update_context_from_dragging_info (id sender) - (NSDragOperation)draggingUpdated:(id )sender { NSPoint point = [sender draggingLocation]; - NSPoint screen_point = [self convertBaseToScreen:point]; + NSPoint screen_point; + +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + screen_point = [self convertBaseToScreen:point]; +#else + screen_point = [self convertPointToScreen:point]; +#endif GdkEvent *event; int gx, gy; @@ -675,7 +724,13 @@ update_context_from_dragging_info (id sender) - (BOOL)performDragOperation:(id )sender { NSPoint point = [sender draggingLocation]; - NSPoint screen_point = [self convertBaseToScreen:point]; + NSPoint screen_point; + +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + screen_point = [self convertBaseToScreen:point]; +#else + screen_point = [self convertPointToScreen:point]; +#endif GdkEvent *event; int gy, gx; @@ -761,17 +816,27 @@ update_context_from_dragging_info (id sender) } #ifdef AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER - +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101200 +typedef enum +{ + GDK_QUARTZ_FULL_SCREEN_MASK = NSFullScreenWindowMask, +} GdkQuartzFullScreen; +#else +typedef enum +{ + GDK_QUARTZ_FULL_SCREEN_MASK = NSWindowStyleMaskFullScreen, +} GdkQuartzFullScreen; +#endif - (void)setStyleMask:(NSUInteger)styleMask { gboolean was_fullscreen; gboolean is_fullscreen; - was_fullscreen = (([self styleMask] & NSFullScreenWindowMask) != 0); + was_fullscreen = (([self styleMask] & GDK_QUARTZ_FULL_SCREEN_MASK) != 0); [super setStyleMask:styleMask]; - is_fullscreen = (([self styleMask] & NSFullScreenWindowMask) != 0); + is_fullscreen = (([self styleMask] & GDK_QUARTZ_FULL_SCREEN_MASK) != 0); if (was_fullscreen != is_fullscreen) _gdk_quartz_window_update_fullscreen_state ([[self contentView] gdkWindow]); @@ -800,7 +865,6 @@ update_context_from_dragging_info (id sender) { NSRect screenFrame = [[self screen] visibleFrame]; GdkWindow *window = [[self contentView] gdkWindow]; - GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl); gboolean maximized = gdk_window_get_state (window) & GDK_WINDOW_STATE_MAXIMIZED; if (!maximized) @@ -814,7 +878,6 @@ update_context_from_dragging_info (id sender) { GdkWindow *window = [[self contentView] gdkWindow]; - GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl); gboolean maximized = gdk_window_get_state (window) & GDK_WINDOW_STATE_MAXIMIZED; if (maximized) diff --git a/gdk/quartz/GdkQuartzNSWindow.h b/gdk/quartz/GdkQuartzNSWindow.h index b8edf43e69..45d1d67196 100644 --- a/gdk/quartz/GdkQuartzNSWindow.h +++ b/gdk/quartz/GdkQuartzNSWindow.h @@ -53,7 +53,10 @@ #ifdef AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER -(void)setStyleMask:(NSUInteger)styleMask; #endif - +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101200 +- (NSPoint)convertPointToScreen:(NSPoint)point; +- (NSPoint)convertPointFromScreen:(NSPoint)point; +#endif @end diff --git a/gdk/quartz/GdkQuartzView.c b/gdk/quartz/GdkQuartzView.c index 7237363f75..684832f7a7 100644 --- a/gdk/quartz/GdkQuartzView.c +++ b/gdk/quartz/GdkQuartzView.c @@ -17,6 +17,7 @@ * License along with this library. If not, see . */ +#include #include "config.h" #import "GdkQuartzView.h" #include "gdkquartzwindow.h" @@ -123,7 +124,6 @@ -(void)unmarkText { GDK_NOTE (EVENTS, g_message ("unmarkText")); - gchar *prev_str; markedRange = selectedRange = NSMakeRange (NSNotFound, 0); g_object_set_data_full (G_OBJECT (gdk_window), TIC_MARKED_TEXT, NULL, g_free); @@ -133,7 +133,6 @@ { GDK_NOTE (EVENTS, g_message ("setMarkedText")); const char *str; - gchar *prev_str; if (replacementRange.location == NSNotFound) { @@ -183,7 +182,6 @@ GDK_NOTE (EVENTS, g_message ("insertText")); const char *str; NSString *string; - gchar *prev_str; if ([self hasMarkedText]) [self unmarkText]; @@ -201,8 +199,12 @@ /* discard invalid text input with Chinese input methods */ str = ""; [self unmarkText]; +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 NSInputManager *currentInputManager = [NSInputManager currentInputManager]; [currentInputManager markedTextAbandoned:self]; +#else + [[NSTextInputContext currentInputContext] discardMarkedText]; +#endif } else { diff --git a/gdk/quartz/gdkdevice-core-quartz.c b/gdk/quartz/gdkdevice-core-quartz.c index 6fc17aa7d1..8ba62c0ae0 100644 --- a/gdk/quartz/gdkdevice-core-quartz.c +++ b/gdk/quartz/gdkdevice-core-quartz.c @@ -130,7 +130,7 @@ gdk_quartz_device_core_get_state (GdkDevice *device, { gint x_int, y_int; - gdk_window_get_pointer (window, &x_int, &y_int, mask); + gdk_window_get_device_position (window, device, &x_int, &y_int, mask); if (axes) { diff --git a/gdk/quartz/gdkdevicemanager-core-quartz.c b/gdk/quartz/gdkdevicemanager-core-quartz.c index 932528aae1..d4756863c5 100644 --- a/gdk/quartz/gdkdevicemanager-core-quartz.c +++ b/gdk/quartz/gdkdevicemanager-core-quartz.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "gdkdevicemanager-core-quartz.h" #include "gdkquartzdevice-core.h" #include "gdkkeysyms.h" diff --git a/gdk/quartz/gdkdisplay-quartz.c b/gdk/quartz/gdkdisplay-quartz.c index d706654813..a342b88ff2 100644 --- a/gdk/quartz/gdkdisplay-quartz.c +++ b/gdk/quartz/gdkdisplay-quartz.c @@ -20,6 +20,7 @@ #include #include +#include #include "gdkprivate-quartz.h" #include "gdkquartzscreen.h" @@ -29,15 +30,18 @@ #include "gdkscreen.h" #include "gdkmonitorprivate.h" #include "gdkdisplay-quartz.h" +#include "gdkmonitor-quartz.h" +static gint MONITORS_CHANGED = 0; + +static void display_reconfiguration_callback (CGDirectDisplayID display, + CGDisplayChangeSummaryFlags flags, + void *data); static GdkWindow * gdk_quartz_display_get_default_group (GdkDisplay *display) { - g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); - - /* FIXME: Implement */ - +/* X11-only. */ return NULL; } @@ -110,51 +114,49 @@ gdk_quartz_display_beep (GdkDisplay *display) static void gdk_quartz_display_sync (GdkDisplay *display) { - /* Not supported. */ + /* Not needed. */ } static void gdk_quartz_display_flush (GdkDisplay *display) { - /* Not supported. */ + /* Not needed. */ } static gboolean gdk_quartz_display_supports_selection_notification (GdkDisplay *display) { g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE); - - /* FIXME: Implement */ + /* X11-only. */ return FALSE; } static gboolean gdk_quartz_display_request_selection_notification (GdkDisplay *display, GdkAtom selection) - { - /* FIXME: Implement */ + /* X11-only. */ return FALSE; } static gboolean gdk_quartz_display_supports_clipboard_persistence (GdkDisplay *display) { - /* FIXME: Implement */ + /* X11-only */ return FALSE; } static gboolean gdk_quartz_display_supports_shapes (GdkDisplay *display) { - /* FIXME: Implement */ + /* Not needed, nothing ever calls this.*/ return FALSE; } static gboolean gdk_quartz_display_supports_input_shapes (GdkDisplay *display) { - /* FIXME: Implement */ + /* Not needed, nothign ever calls this. */ return FALSE; } @@ -165,20 +167,23 @@ gdk_quartz_display_store_clipboard (GdkDisplay *display, const GdkAtom *targets, gint n_targets) { - /* FIXME: Implement */ + /* MacOS persists pasteboard items automatically, no application + * action is required. + */ } static gboolean gdk_quartz_display_supports_composite (GdkDisplay *display) { - /* FIXME: Implement */ + /* X11-only. */ return FALSE; } static gulong gdk_quartz_display_get_next_serial (GdkDisplay *display) { + /* X11-only. */ return 0; } @@ -186,26 +191,134 @@ static void gdk_quartz_display_notify_startup_complete (GdkDisplay *display, const gchar *startup_id) { - /* FIXME: Implement? */ + /* This should call finishLaunching, but doing so causes Quartz to throw + * "_createMenuRef called with existing principal MenuRef already" + * " associated with menu". + [NSApp finishLaunching]; + */ } +static void +gdk_quartz_display_push_error_trap (GdkDisplay *display) +{ + /* X11-only. */ +} + +static gint +gdk_quartz_display_pop_error_trap (GdkDisplay *display, gboolean ignore) +{ + /* X11 only. */ + return 0; +} + +/* The display monitor list comprises all of the CGDisplays connected + to the system, some of which may not be drawable either because + they're asleep or are mirroring another monitor. The NSScreens + array contains only the monitors that are currently drawable and we + use the index of the screens array placing GdkNSViews, so we'll use + the same for determining the number of monitors and indexing them. + */ + +int +get_active_displays (CGDirectDisplayID **screens) +{ + unsigned int displays = 0; + + CGGetActiveDisplayList (0, NULL, &displays); + if (screens) + { + *screens = g_new0 (CGDirectDisplayID, displays); + CGGetActiveDisplayList (displays, *screens, &displays); + } + + return displays; +} + +static void +configure_monitor (GdkMonitor *monitor) +{ + GdkQuartzMonitor *quartz_monitor = GDK_QUARTZ_MONITOR (monitor); + CGSize disp_size = CGDisplayScreenSize (quartz_monitor->id); + gint width = (int)trunc (disp_size.width); + gint height = (int)trunc (disp_size.height); + CGRect disp_bounds = CGDisplayBounds (quartz_monitor->id); + GdkRectangle disp_geometry = {(int)trunc (disp_bounds.origin.x), + (int)trunc (disp_bounds.origin.y), + (int)trunc (disp_bounds.size.width), + (int)trunc (disp_bounds.size.height)}; + CGDisplayModeRef mode = CGDisplayCopyDisplayMode (quartz_monitor->id); + gint refresh_rate = (int)trunc (CGDisplayModeGetRefreshRate (mode)); + + monitor->width_mm = width; + monitor->height_mm = height; + monitor->geometry = disp_geometry; + monitor->scale_factor = 1; + monitor->refresh_rate = refresh_rate; + monitor->subpixel_layout = GDK_SUBPIXEL_LAYOUT_UNKNOWN; + CGDisplayModeRelease (mode); +} + +static void +display_reconfiguration_callback (CGDirectDisplayID cg_display, + CGDisplayChangeSummaryFlags flags, + void *data) +{ + GdkQuartzDisplay *display = data; + GdkQuartzMonitor *monitor; + + /* Ignore the begin configuration signal. */ + if (flags & kCGDisplayBeginConfigurationFlag) + return; + + if (flags & (kCGDisplayMovedFlag | kCGDisplayAddFlag | kCGDisplayEnabledFlag | + kCGDisplaySetMainFlag | kCGDisplayDesktopShapeChangedFlag | + kCGDisplayMirrorFlag | kCGDisplayUnMirrorFlag)) + { + monitor = g_hash_table_lookup (display->monitors, + GINT_TO_POINTER (cg_display)); + if (!monitor) + { + monitor = g_object_new (GDK_TYPE_QUARTZ_MONITOR, + "display", display, NULL); + monitor->id = cg_display; + g_hash_table_insert (display->monitors, GINT_TO_POINTER (monitor->id), + monitor); + gdk_display_monitor_added (GDK_DISPLAY (display), + GDK_MONITOR (monitor)); + } + configure_monitor (GDK_MONITOR (monitor)); + } + else if (flags & (kCGDisplayRemoveFlag | kCGDisplayDisabledFlag)) + { + GdkMonitor *monitor = g_hash_table_lookup (display->monitors, + GINT_TO_POINTER (cg_display)); + gdk_display_monitor_removed (GDK_DISPLAY (display), + GDK_MONITOR (monitor)); + g_hash_table_remove (display->monitors, GINT_TO_POINTER (cg_display)); + } + + g_signal_emit (display, MONITORS_CHANGED, 0); +} + + static int gdk_quartz_display_get_n_monitors (GdkDisplay *display) { - GdkQuartzDisplay *quartz_display = GDK_QUARTZ_DISPLAY (display); - - return quartz_display->monitors->len; + return get_active_displays (NULL); } - static GdkMonitor * gdk_quartz_display_get_monitor (GdkDisplay *display, int monitor_num) { GdkQuartzDisplay *quartz_display = GDK_QUARTZ_DISPLAY (display); + CGDirectDisplayID *screens = NULL; - if (0 <= monitor_num || monitor_num < quartz_display->monitors->len) - return (GdkMonitor *)quartz_display->monitors->pdata[monitor_num]; + int count = get_active_displays (&screens); + + if (monitor_num >= 0 && monitor_num < count) + return g_hash_table_lookup (quartz_display->monitors, + GINT_TO_POINTER (screens[monitor_num])); return NULL; } @@ -214,8 +327,23 @@ static GdkMonitor * gdk_quartz_display_get_primary_monitor (GdkDisplay *display) { GdkQuartzDisplay *quartz_display = GDK_QUARTZ_DISPLAY (display); + CGDirectDisplayID primary_id = CGMainDisplayID (); - return quartz_display->monitors->pdata[0]; + return g_hash_table_lookup (quartz_display->monitors, + GINT_TO_POINTER (primary_id)); +} + +static GdkMonitor * +gdk_quartz_display_get_monitor_at_window (GdkDisplay *display, + GdkWindow *window) +{ + GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl); + NSWindow *nswindow = impl->toplevel; + NSScreen *screen = [nswindow screen]; + CGDirectDisplayID id = [[[screen deviceDescription] + objectForKey: @"NSScreenNumber"] unsignedIntValue]; + return g_hash_table_lookup (GDK_QUARTZ_DISPLAY (display)->monitors, + GINT_TO_POINTER (id)); } G_DEFINE_TYPE (GdkQuartzDisplay, gdk_quartz_display, GDK_TYPE_DISPLAY) @@ -223,11 +351,26 @@ G_DEFINE_TYPE (GdkQuartzDisplay, gdk_quartz_display, GDK_TYPE_DISPLAY) static void gdk_quartz_display_init (GdkQuartzDisplay *display) { - GDK_QUARTZ_ALLOC_POOL; + uint32_t max_displays = 0, disp; + CGDirectDisplayID *displays; - display->monitors = g_ptr_array_new_with_free_func (g_object_unref); - - GDK_QUARTZ_RELEASE_POOL; + CGGetActiveDisplayList (0, NULL, &max_displays); + display->monitors = g_hash_table_new_full (g_direct_hash, NULL, + NULL, g_object_unref); + displays = g_new0 (CGDirectDisplayID, max_displays); + CGGetActiveDisplayList (max_displays, displays, &max_displays); + for (disp = 0; disp < max_displays; ++disp) + { + GdkQuartzMonitor *monitor = g_object_new (GDK_TYPE_QUARTZ_MONITOR, + "display", display, NULL); + monitor->id = displays[disp]; + g_hash_table_insert (display->monitors, GINT_TO_POINTER (monitor->id), + monitor); + configure_monitor (GDK_MONITOR (monitor)); + } + CGDisplayRegisterReconfigurationCallback (display_reconfiguration_callback, + display); + g_signal_emit (display, MONITORS_CHANGED, 0); } static void @@ -235,7 +378,9 @@ gdk_quartz_display_dispose (GObject *object) { GdkQuartzDisplay *display_quartz = GDK_QUARTZ_DISPLAY (object); - g_ptr_array_free (display_quartz->monitors, TRUE); + g_hash_table_destroy (display_quartz->monitors); + CGDisplayRemoveReconfigurationCallback (display_reconfiguration_callback, + display_quartz); G_OBJECT_CLASS (gdk_quartz_display_parent_class)->dispose (object); } @@ -262,24 +407,28 @@ gdk_quartz_display_class_init (GdkQuartzDisplayClass *class) display_class->beep = gdk_quartz_display_beep; display_class->sync = gdk_quartz_display_sync; display_class->flush = gdk_quartz_display_flush; - display_class->queue_events = _gdk_quartz_display_queue_events; display_class->has_pending = _gdk_quartz_display_has_pending; + display_class->queue_events = _gdk_quartz_display_queue_events; display_class->get_default_group = gdk_quartz_display_get_default_group; display_class->supports_selection_notification = gdk_quartz_display_supports_selection_notification; display_class->request_selection_notification = gdk_quartz_display_request_selection_notification; - display_class->supports_clipboard_persistence = gdk_quartz_display_supports_clipboard_persistence; - display_class->store_clipboard = gdk_quartz_display_store_clipboard; + display_class->supports_shapes = gdk_quartz_display_supports_shapes; display_class->supports_input_shapes = gdk_quartz_display_supports_input_shapes; display_class->supports_composite = gdk_quartz_display_supports_composite; - display_class->get_cursor_for_type = _gdk_quartz_display_get_cursor_for_type; - display_class->get_cursor_for_name = _gdk_quartz_display_get_cursor_for_name; - display_class->get_cursor_for_surface = _gdk_quartz_display_get_cursor_for_surface; - display_class->get_default_cursor_size = _gdk_quartz_display_get_default_cursor_size; - display_class->get_maximal_cursor_size = _gdk_quartz_display_get_maximal_cursor_size; display_class->supports_cursor_alpha = _gdk_quartz_display_supports_cursor_alpha; display_class->supports_cursor_color = _gdk_quartz_display_supports_cursor_color; + display_class->supports_clipboard_persistence = gdk_quartz_display_supports_clipboard_persistence; + display_class->store_clipboard = gdk_quartz_display_store_clipboard; + + display_class->get_default_cursor_size = _gdk_quartz_display_get_default_cursor_size; + display_class->get_maximal_cursor_size = _gdk_quartz_display_get_maximal_cursor_size; + display_class->get_cursor_for_type = _gdk_quartz_display_get_cursor_for_type; + display_class->get_cursor_for_name = _gdk_quartz_display_get_cursor_for_name; + display_class->get_cursor_for_surface = _gdk_quartz_display_get_cursor_for_surface; + + /* display_class->get_app_launch_context = NULL; Has default. */ display_class->before_process_all_updates = _gdk_quartz_display_before_process_all_updates; display_class->after_process_all_updates = _gdk_quartz_display_after_process_all_updates; display_class->get_next_serial = gdk_quartz_display_get_next_serial; @@ -288,15 +437,42 @@ gdk_quartz_display_class_init (GdkQuartzDisplayClass *class) display_class->event_data_free = _gdk_quartz_display_event_data_free; display_class->create_window_impl = _gdk_quartz_display_create_window_impl; display_class->get_keymap = _gdk_quartz_display_get_keymap; + display_class->push_error_trap = gdk_quartz_display_push_error_trap; + display_class->pop_error_trap = gdk_quartz_display_pop_error_trap; + display_class->get_selection_owner = _gdk_quartz_display_get_selection_owner; display_class->set_selection_owner = _gdk_quartz_display_set_selection_owner; + display_class->send_selection_notify = NULL; /* Ignore. X11 stuff removed in master. */ display_class->get_selection_property = _gdk_quartz_display_get_selection_property; display_class->convert_selection = _gdk_quartz_display_convert_selection; display_class->text_property_to_utf8_list = _gdk_quartz_display_text_property_to_utf8_list; display_class->utf8_to_string_target = _gdk_quartz_display_utf8_to_string_target; + +/* display_class->get_default_seat; The parent class default works fine. */ + display_class->get_n_monitors = gdk_quartz_display_get_n_monitors; display_class->get_monitor = gdk_quartz_display_get_monitor; display_class->get_primary_monitor = gdk_quartz_display_get_primary_monitor; + display_class->get_monitor_at_window = gdk_quartz_display_get_monitor_at_window; + + /** + * GdkQuartzDisplay::monitors-changed: + * @display: The object on which the signal is emitted + * + * The ::monitors-changed signal is emitted whenever the arrangement + * of the monitors changes, either because of the addition or + * removal of a monitor or because of some other configuration + * change in System Preferences>Displays including a resolution + * change or a position change. Note that enabling or disabling + * mirroring will result in the addition or removal of the mirror + * monitor(s). + */ + MONITORS_CHANGED = + g_signal_new (g_intern_static_string ("monitors-changed"), + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, + 0, NULL, NULL, NULL, + G_TYPE_NONE, 0, NULL); ProcessSerialNumber psn = { 0, kCurrentProcess }; diff --git a/gdk/quartz/gdkdisplay-quartz.h b/gdk/quartz/gdkdisplay-quartz.h index 44d4ec6cd4..c256d7bca5 100644 --- a/gdk/quartz/gdkdisplay-quartz.h +++ b/gdk/quartz/gdkdisplay-quartz.h @@ -32,119 +32,7 @@ G_BEGIN_DECLS struct _GdkQuartzDisplay { GdkDisplay parent_instance; - /*Display *xdisplay; - GdkScreen *screen; - GList *screens; - - GSource *event_source; - - gint grab_count; - */ - /* Visual infos for creating Windows */ - /*int window_depth; - Visual *window_visual; - Colormap window_colormap; - */ - /* Keyboard related information */ - /*gint xkb_event_type; - gboolean use_xkb; - */ - /* Whether we were able to turn on detectable-autorepeat using - * XkbSetDetectableAutorepeat. If FALSE, we'll fall back - * to checking the next event with XPending(). - */ - /*gboolean have_xkb_autorepeat; - - GdkKeymap *keymap; - guint keymap_serial; - - gboolean have_xfixes; - gint xfixes_event_base; - - gboolean have_xcomposite; - gboolean have_xdamage; - gint xdamage_event_base; - - gboolean have_randr12; - gboolean have_randr13; - gboolean have_randr15; - gint xrandr_event_base; - */ - /* If the SECURITY extension is in place, whether this client holds - * a trusted authorization and so is allowed to make various requests - * (grabs, properties etc.) Otherwise always TRUE. - */ - /*gboolean trusted_client; - */ - /* drag and drop information */ - /*GdkDragContext *current_dest_drag; - */ - /* Mapping to/from virtual atoms */ - /*GHashTable *atom_from_virtual; - GHashTable *atom_to_virtual; - */ - /* Session Management leader window see ICCCM */ - /*Window leader_window; - GdkWindow *leader_gdk_window; - gboolean leader_window_title_set; - */ - /* List of functions to go from extension event => X window */ - /*GSList *event_types; - */ - /* X ID hashtable */ - /*GHashTable *xid_ht; - */ - /* translation queue */ - /*GQueue *translate_queue; - */ - /* input GdkWindow list */ - /*GList *input_windows; - */ - GPtrArray *monitors; - - /* Startup notification */ - /*gchar *startup_notification_id; - */ - /* Time of most recent user interaction. */ - /*gulong user_time; - */ - /* Sets of atoms for DND */ - /*guint base_dnd_atoms_precached : 1; - guint xdnd_atoms_precached : 1; - guint motif_atoms_precached : 1; - guint use_sync : 1; - - guint have_shapes : 1; - guint have_input_shapes : 1; - gint shape_event_base; - - GSList *error_traps; - - gint wm_moveresize_button; - */ - /* GLX information */ - /*gint glx_version; - gint glx_error_base; - gint glx_event_base; - */ - /* Translation between X server time and system-local monotonic time */ - /*gint64 server_time_query_time; - gint64 server_time_offset; - */ - /*guint server_time_is_monotonic_time : 1; - - guint have_glx : 1; - */ - /* GLX extensions we check */ - /*guint has_glx_swap_interval : 1; - guint has_glx_create_context : 1; - guint has_glx_texture_from_pixmap : 1; - guint has_glx_video_sync : 1; - guint has_glx_buffer_age : 1; - guint has_glx_sync_control : 1; - guint has_glx_multisample : 1; - guint has_glx_visual_rating : 1; - guint has_glx_create_es2_context : 1;*/ + GHashTable *monitors; }; struct _GdkQuartzDisplayClass @@ -220,16 +108,6 @@ gint _gdk_quartz_display_text_property_to_utf8_list (GdkDisplay *disp gchar ***list); gchar * _gdk_quartz_display_utf8_to_string_target (GdkDisplay *displayt, const gchar *str); -/* -GdkScreen *_gdk_x11_display_screen_for_xrootwin (GdkDisplay *display, - Window xrootwin); -void _gdk_x11_display_error_event (GdkDisplay *display, - XErrorEvent *error); - -GdkFilterReturn _gdk_wm_protocols_filter (GdkXEvent *xev, - GdkEvent *event, - gpointer data); -*/ G_END_DECLS #endif /* __GDK_QUARTZ_DISPLAY__ */ diff --git a/gdk/quartz/gdkdisplaymanager-quartz.c b/gdk/quartz/gdkdisplaymanager-quartz.c index 2058fcfda6..fdcb72f711 100644 --- a/gdk/quartz/gdkdisplaymanager-quartz.c +++ b/gdk/quartz/gdkdisplaymanager-quartz.c @@ -55,7 +55,6 @@ static void gdk_quartz_display_manager_class_init (GdkQuartzDisplayManagerClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); - GdkDisplayManagerClass *manager_class = GDK_DISPLAY_MANAGER_CLASS (class); object_class->finalize = gdk_quartz_display_manager_finalize; } diff --git a/gdk/quartz/gdkeventloop-quartz.c b/gdk/quartz/gdkeventloop-quartz.c index c20563931f..3f3b033242 100644 --- a/gdk/quartz/gdkeventloop-quartz.c +++ b/gdk/quartz/gdkeventloop-quartz.c @@ -292,13 +292,19 @@ select_thread_func (void *arg) } } +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101200 +#define GDK_QUARTZ_APPLICATION_DEFINED NSApplicationDefined +#else +#define GDK_QUARTZ_APPLICATION_DEFINED NSEventTypeApplicationDefined +#endif + static void got_fd_activity (void *info) { NSEvent *event; /* Post a message so we'll break out of the message loop */ - event = [NSEvent otherEventWithType: NSApplicationDefined + event = [NSEvent otherEventWithType: GDK_QUARTZ_APPLICATION_DEFINED location: NSZeroPoint modifierFlags: 0 timestamp: 0 @@ -714,6 +720,12 @@ static GSourceFuncs event_funcs = { ********* Our Poll Function ********* ************************************************************/ +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101200 +#define GDK_QUARTZ_EVENT_MASK_ANY NSAnyEventMask +#else +#define GDK_QUARTZ_EVENT_MASK_ANY NSEventMaskAny +#endif + static gint poll_func (GPollFD *ufds, guint nfds, @@ -739,7 +751,7 @@ poll_func (GPollFD *ufds, limit_date = [NSDate dateWithTimeIntervalSinceNow:timeout_/1000.0]; getting_events++; - event = [NSApp nextEventMatchingMask: NSAnyEventMask + event = [NSApp nextEventMatchingMask: GDK_QUARTZ_EVENT_MASK_ANY untilDate: limit_date inMode: NSDefaultRunLoopMode dequeue: YES]; @@ -758,7 +770,7 @@ poll_func (GPollFD *ufds, n_ready = select_thread_collect_poll (ufds, nfds); if (event && - [event type] == NSApplicationDefined && + [event type] == GDK_QUARTZ_APPLICATION_DEFINED && [event subtype] == GDK_QUARTZ_EVENT_SUBTYPE_EVENTLOOP) { /* Just used to wake us up; if an event and a FD arrived at the same diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c index 01a400889a..952d4a8189 100644 --- a/gdk/quartz/gdkevents-quartz.c +++ b/gdk/quartz/gdkevents-quartz.c @@ -35,6 +35,7 @@ #include "gdkquartzdisplay.h" #include "gdkprivate-quartz.h" #include "gdkquartzdevicemanager-core.h" +#include "gdkquartzkeys.h" #define GRIP_WIDTH 15 #define GRIP_HEIGHT 15 @@ -128,27 +129,8 @@ _gdk_quartz_display_has_pending (GdkDisplay *display) void _gdk_quartz_events_break_all_grabs (guint32 time) { - GList *list, *l; - GdkDeviceManager *device_manager; - - device_manager = gdk_display_get_device_manager (_gdk_display); - list = gdk_device_manager_list_devices (device_manager, - GDK_DEVICE_TYPE_MASTER); - for (l = list; l; l = l->next) - { - GdkDeviceGrabInfo *grab; - - grab = _gdk_display_get_last_device_grab (_gdk_display, l->data); - if (grab) - { - grab->serial_end = 0; - grab->implicit_ungrab = TRUE; - } - - _gdk_display_device_grab_update (_gdk_display, l->data, NULL, 0); - } - - g_list_free (list); + GdkSeat *seat = gdk_display_get_default_seat (_gdk_display); + gdk_seat_ungrab (seat); } static void @@ -289,15 +271,15 @@ get_keyboard_modifiers_from_ns_flags (NSUInteger nsflags) { GdkModifierType modifiers = 0; - if (nsflags & NSAlphaShiftKeyMask) + if (nsflags & GDK_QUARTZ_ALPHA_SHIFT_KEY_MASK) modifiers |= GDK_LOCK_MASK; - if (nsflags & NSShiftKeyMask) + if (nsflags & GDK_QUARTZ_SHIFT_KEY_MASK) modifiers |= GDK_SHIFT_MASK; - if (nsflags & NSControlKeyMask) + if (nsflags & GDK_QUARTZ_CONTROL_KEY_MASK) modifiers |= GDK_CONTROL_MASK; - if (nsflags & NSAlternateKeyMask) + if (nsflags & GDK_QUARTZ_ALTERNATE_KEY_MASK) modifiers |= GDK_MOD1_MASK; - if (nsflags & NSCommandKeyMask) + if (nsflags & GDK_QUARTZ_COMMAND_KEY_MASK) modifiers |= GDK_MOD2_MASK; return modifiers; @@ -315,31 +297,31 @@ get_event_mask_from_ns_event (NSEvent *nsevent) { switch ([nsevent type]) { - case NSLeftMouseDown: - case NSRightMouseDown: - case NSOtherMouseDown: + case GDK_QUARTZ_LEFT_MOUSE_DOWN: + case GDK_QUARTZ_RIGHT_MOUSE_DOWN: + case GDK_QUARTZ_OTHER_MOUSE_DOWN: return GDK_BUTTON_PRESS_MASK; - case NSLeftMouseUp: - case NSRightMouseUp: - case NSOtherMouseUp: + case GDK_QUARTZ_LEFT_MOUSE_UP: + case GDK_QUARTZ_RIGHT_MOUSE_UP: + case GDK_QUARTZ_OTHER_MOUSE_UP: return GDK_BUTTON_RELEASE_MASK; - case NSMouseMoved: + case GDK_QUARTZ_MOUSE_MOVED: return GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK; - case NSScrollWheel: + case GDK_QUARTZ_SCROLL_WHEEL: /* Since applications that want button press events can get * scroll events on X11 (since scroll wheel events are really * button press events there), we need to use GDK_BUTTON_PRESS_MASK too. */ return GDK_SCROLL_MASK | GDK_BUTTON_PRESS_MASK; - case NSLeftMouseDragged: + case GDK_QUARTZ_LEFT_MOUSE_DRAGGED: return (GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON1_MASK); - case NSRightMouseDragged: + case GDK_QUARTZ_RIGHT_MOUSE_DRAGGED: return (GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_BUTTON3_MASK); - case NSOtherMouseDragged: + case GDK_QUARTZ_OTHER_MOUSE_DRAGGED: { GdkEventMask mask; @@ -356,9 +338,9 @@ get_event_mask_from_ns_event (NSEvent *nsevent) case NSEventTypeMagnify: case NSEventTypeRotate: return GDK_TOUCHPAD_GESTURE_MASK; - case NSKeyDown: - case NSKeyUp: - case NSFlagsChanged: + case GDK_QUARTZ_KEY_DOWN: + case GDK_QUARTZ_KEY_UP: + case GDK_QUARTZ_FLAGS_CHANGED: { switch (_gdk_quartz_keys_event_type (nsevent)) { @@ -374,10 +356,10 @@ get_event_mask_from_ns_event (NSEvent *nsevent) } break; - case NSMouseEntered: + case GDK_QUARTZ_MOUSE_ENTERED: return GDK_ENTER_NOTIFY_MASK; - case NSMouseExited: + case GDK_QUARTZ_MOUSE_EXITED: return GDK_LEAVE_NOTIFY_MASK; default: @@ -394,12 +376,15 @@ get_window_point_from_screen_point (GdkWindow *window, gint *y) { NSPoint point; - NSWindow *nswindow; + GdkQuartzNSWindow *nswindow; - nswindow = ((GdkWindowImplQuartz *)window->impl)->toplevel; + nswindow = (GdkQuartzNSWindow*)(((GdkWindowImplQuartz *)window->impl)->toplevel); +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 point = [nswindow convertScreenToBase:screen_point]; - +#else + point = [nswindow convertPointFromScreen:screen_point]; +#endif *x = point.x; *y = window->height - point.y; } @@ -409,10 +394,12 @@ is_mouse_button_press_event (NSEventType type) { switch (type) { - case NSLeftMouseDown: - case NSRightMouseDown: - case NSOtherMouseDown: + case GDK_QUARTZ_LEFT_MOUSE_DOWN: + case GDK_QUARTZ_RIGHT_MOUSE_DOWN: + case GDK_QUARTZ_OTHER_MOUSE_DOWN: return TRUE; + default: + return FALSE; } return FALSE; @@ -473,8 +460,12 @@ get_toplevel_from_ns_event (NSEvent *nsevent, } else { - *screen_point = [[nsevent window] convertBaseToScreen:point]; - + if (gdk_quartz_osx_version () >= GDK_OSX_LION) + *screen_point = [(GdkQuartzNSWindow*)[nsevent window] convertPointToScreen:point]; +#if MAC_OS_X_VERSION_MIN_REQUIRED < 10700 + else + *screen_point = [[nsevent window] convertBaseToScreen:point]; +#endif *x = point.x; *y = toplevel->height - point.y; } @@ -502,15 +493,15 @@ create_focus_event (GdkWindow *window, gboolean in) { GdkEvent *event; - GdkQuartzDeviceManagerCore *device_manager; + GdkDisplay *display = gdk_window_get_display (window); + GdkSeat *seat = gdk_display_get_default_seat (display); event = gdk_event_new (GDK_FOCUS_CHANGE); event->focus_change.window = window; event->focus_change.in = in; - device_manager = GDK_QUARTZ_DEVICE_MANAGER_CORE (_gdk_display->device_manager); - gdk_event_set_device (event, device_manager->core_keyboard); - gdk_event_set_seat (event, gdk_device_get_seat (device_manager->core_keyboard)); + gdk_event_set_device (event, gdk_seat_get_keyboard (seat)); + gdk_event_set_seat (event, seat); return event; } @@ -522,7 +513,8 @@ generate_motion_event (GdkWindow *window) NSPoint screen_point; GdkEvent *event; gint x, y, x_root, y_root; - GdkQuartzDeviceManagerCore *device_manager; + GdkDisplay *display = gdk_window_get_display (window); + GdkSeat *seat = gdk_display_get_default_seat (display); event = gdk_event_new (GDK_MOTION_NOTIFY); event->any.window = NULL; @@ -544,9 +536,8 @@ generate_motion_event (GdkWindow *window) event->motion.state = _gdk_quartz_events_get_current_keyboard_modifiers () | _gdk_quartz_events_get_current_mouse_modifiers (); event->motion.is_hint = FALSE; - device_manager = GDK_QUARTZ_DEVICE_MANAGER_CORE (_gdk_display->device_manager); - event->motion.device = device_manager->core_pointer; - gdk_event_set_seat (event, gdk_device_get_seat (device_manager->core_pointer)); + event->motion.device = gdk_seat_get_pointer (seat); + gdk_event_set_seat (event, seat); append_event (event, TRUE); } @@ -623,8 +614,9 @@ find_toplevel_under_pointer (GdkDisplay *display, { GdkWindow *toplevel; GdkPointerWindowInfo *info; + GdkSeat *seat = gdk_display_get_default_seat (display); - info = _gdk_display_get_pointer_info (display, GDK_QUARTZ_DEVICE_MANAGER_CORE (display->device_manager)->core_pointer); + info = _gdk_display_get_pointer_info (display, gdk_seat_get_pointer (seat)); toplevel = info->toplevel_under_pointer; if (toplevel && WINDOW_IS_TOPLEVEL (toplevel)) get_window_point_from_screen_point (toplevel, screen_point, x, y); @@ -651,24 +643,20 @@ find_toplevel_for_keyboard_event (NSEvent *nsevent) GdkWindow *window; GdkDisplay *display; GdkQuartzView *view; - GdkDeviceManager *device_manager; + GdkSeat *seat; view = (GdkQuartzView *)[[nsevent window] contentView]; window = [view gdkWindow]; display = gdk_window_get_display (window); + seat = gdk_display_get_default_seat (display); - device_manager = gdk_display_get_device_manager (display); - list = gdk_device_manager_list_devices (device_manager, - GDK_DEVICE_TYPE_MASTER); + list = gdk_seat_get_slaves (seat, GDK_SEAT_CAPABILITY_KEYBOARD); for (l = list; l; l = l->next) { GdkDeviceGrabInfo *grab; GdkDevice *device = l->data; - if (gdk_device_get_source(device) != GDK_SOURCE_KEYBOARD) - continue; - grab = _gdk_display_get_last_device_grab (display, device); if (grab && grab->window && !grab->owner_events) { @@ -692,11 +680,13 @@ find_toplevel_for_mouse_event (NSEvent *nsevent, GdkWindow *toplevel; GdkDisplay *display; GdkDeviceGrabInfo *grab; + GdkSeat *seat; toplevel = get_toplevel_from_ns_event (nsevent, &screen_point, x, y); display = gdk_window_get_display (toplevel); - + seat = gdk_display_get_default_seat (_gdk_display); + event_type = [nsevent type]; /* From the docs for XGrabPointer: @@ -709,7 +699,7 @@ find_toplevel_for_mouse_event (NSEvent *nsevent, * events are discarded. */ grab = _gdk_display_get_last_device_grab (display, - GDK_QUARTZ_DEVICE_MANAGER_CORE (display->device_manager)->core_pointer); + gdk_seat_get_pointer (seat)); if (WINDOW_IS_TOPLEVEL (toplevel) && grab) { /* Implicit grabs do not go through XGrabPointer and thus the @@ -766,7 +756,7 @@ find_toplevel_for_mouse_event (NSEvent *nsevent, * gdk gets confused about getting e.g. button presses with no * window (the title bar is not known to it). */ - if (event_type != NSMouseMoved) + if (event_type != GDK_QUARTZ_MOUSE_MOVED) if (*y < 0) return NULL; @@ -821,23 +811,23 @@ find_window_for_ns_event (NSEvent *nsevent, switch (event_type) { - case NSLeftMouseDown: - case NSRightMouseDown: - case NSOtherMouseDown: - case NSLeftMouseUp: - case NSRightMouseUp: - case NSOtherMouseUp: - case NSMouseMoved: - case NSScrollWheel: - case NSLeftMouseDragged: - case NSRightMouseDragged: - case NSOtherMouseDragged: + case GDK_QUARTZ_LEFT_MOUSE_DOWN: + case GDK_QUARTZ_RIGHT_MOUSE_DOWN: + case GDK_QUARTZ_OTHER_MOUSE_DOWN: + case GDK_QUARTZ_LEFT_MOUSE_UP: + case GDK_QUARTZ_RIGHT_MOUSE_UP: + case GDK_QUARTZ_OTHER_MOUSE_UP: + case GDK_QUARTZ_MOUSE_MOVED: + case GDK_QUARTZ_SCROLL_WHEEL: + case GDK_QUARTZ_LEFT_MOUSE_DRAGGED: + case GDK_QUARTZ_RIGHT_MOUSE_DRAGGED: + case GDK_QUARTZ_OTHER_MOUSE_DRAGGED: case NSEventTypeMagnify: case NSEventTypeRotate: return find_toplevel_for_mouse_event (nsevent, x, y); - - case NSMouseEntered: - case NSMouseExited: + + case GDK_QUARTZ_MOUSE_ENTERED: + case GDK_QUARTZ_MOUSE_EXITED: /* Only handle our own entered/exited events, not the ones for the * titlebar buttons. */ @@ -846,9 +836,9 @@ find_window_for_ns_event (NSEvent *nsevent, else return NULL; - case NSKeyDown: - case NSKeyUp: - case NSFlagsChanged: + case GDK_QUARTZ_KEY_DOWN: + case GDK_QUARTZ_KEY_UP: + case GDK_QUARTZ_FLAGS_CHANGED: return find_toplevel_for_keyboard_event (nsevent); default: @@ -871,7 +861,7 @@ fill_crossing_event (GdkWindow *toplevel, GdkCrossingMode mode, GdkNotifyType detail) { - GdkQuartzDeviceManagerCore *device_manager; + GdkSeat *seat = gdk_display_get_default_seat (_gdk_display); event->any.type = event_type; event->crossing.window = toplevel; @@ -886,9 +876,8 @@ fill_crossing_event (GdkWindow *toplevel, event->crossing.state = get_keyboard_modifiers_from_ns_event (nsevent) | _gdk_quartz_events_get_current_mouse_modifiers (); - device_manager = GDK_QUARTZ_DEVICE_MANAGER_CORE (_gdk_display->device_manager); - gdk_event_set_device (event, device_manager->core_pointer); - gdk_event_set_seat (event, gdk_device_get_seat (device_manager->core_pointer)); + gdk_event_set_device (event, gdk_seat_get_pointer (seat)); + gdk_event_set_seat (event, seat); /* FIXME: Focus and button state? */ } @@ -921,9 +910,7 @@ fill_pinch_event (GdkWindow *window, FP_STATE_IDLE, FP_STATE_UPDATE } last_state = FP_STATE_IDLE; - GdkQuartzDeviceManagerCore *device_manager; - - device_manager = GDK_QUARTZ_DEVICE_MANAGER_CORE (_gdk_display->device_manager); + GdkSeat *seat = gdk_display_get_default_seat (_gdk_display); event->any.type = GDK_TOUCHPAD_PINCH; event->touchpad_pinch.window = window; @@ -936,7 +923,7 @@ fill_pinch_event (GdkWindow *window, event->touchpad_pinch.n_fingers = 2; event->touchpad_pinch.dx = 0.0; event->touchpad_pinch.dy = 0.0; - gdk_event_set_device (event, device_manager->core_pointer); + gdk_event_set_device (event, gdk_seat_get_pointer (seat)); switch ([nsevent phase]) { @@ -1015,23 +1002,23 @@ fill_button_event (GdkWindow *window, { GdkEventType type; gint state; - GdkQuartzDeviceManagerCore *device_manager; + GdkSeat *seat = gdk_display_get_default_seat (_gdk_display); state = get_keyboard_modifiers_from_ns_event (nsevent) | _gdk_quartz_events_get_current_mouse_modifiers (); switch ([nsevent type]) { - case NSLeftMouseDown: - case NSRightMouseDown: - case NSOtherMouseDown: + case GDK_QUARTZ_LEFT_MOUSE_DOWN: + case GDK_QUARTZ_RIGHT_MOUSE_DOWN: + case GDK_QUARTZ_OTHER_MOUSE_DOWN: type = GDK_BUTTON_PRESS; state &= ~get_mouse_button_modifiers_from_ns_event (nsevent); break; - case NSLeftMouseUp: - case NSRightMouseUp: - case NSOtherMouseUp: + case GDK_QUARTZ_LEFT_MOUSE_UP: + case GDK_QUARTZ_RIGHT_MOUSE_UP: + case GDK_QUARTZ_OTHER_MOUSE_UP: type = GDK_BUTTON_RELEASE; state |= get_mouse_button_modifiers_from_ns_event (nsevent); break; @@ -1050,9 +1037,9 @@ fill_button_event (GdkWindow *window, /* FIXME event->axes */ event->button.state = state; event->button.button = get_mouse_button_from_ns_event (nsevent); - device_manager = GDK_QUARTZ_DEVICE_MANAGER_CORE (_gdk_display->device_manager); - event->button.device = device_manager->core_pointer; - gdk_event_set_seat (event, gdk_device_get_seat (device_manager->core_pointer)); + + event->button.device = gdk_seat_get_pointer (seat); + gdk_event_set_seat (event, seat); } static void @@ -1064,7 +1051,7 @@ fill_motion_event (GdkWindow *window, gint x_root, gint y_root) { - GdkQuartzDeviceManagerCore *device_manager; + GdkSeat *seat = gdk_display_get_default_seat (_gdk_display); event->any.type = GDK_MOTION_NOTIFY; event->motion.window = window; @@ -1077,9 +1064,8 @@ fill_motion_event (GdkWindow *window, event->motion.state = get_keyboard_modifiers_from_ns_event (nsevent) | _gdk_quartz_events_get_current_mouse_modifiers (); event->motion.is_hint = FALSE; - device_manager = GDK_QUARTZ_DEVICE_MANAGER_CORE (_gdk_display->device_manager); - event->motion.device = device_manager->core_pointer; - gdk_event_set_seat (event, gdk_device_get_seat (device_manager->core_pointer)); + event->motion.device = gdk_seat_get_pointer (seat); + gdk_event_set_seat (event, seat); } static void @@ -1094,11 +1080,10 @@ fill_scroll_event (GdkWindow *window, gdouble delta_y, GdkScrollDirection direction) { - GdkQuartzDeviceManagerCore *device_manager; + GdkSeat *seat = gdk_display_get_default_seat (_gdk_display); NSPoint point; point = [nsevent locationInWindow]; - device_manager = GDK_QUARTZ_DEVICE_MANAGER_CORE (_gdk_display->device_manager); event->any.type = GDK_SCROLL; event->scroll.window = window; @@ -1109,10 +1094,10 @@ fill_scroll_event (GdkWindow *window, event->scroll.y_root = y_root; event->scroll.state = get_keyboard_modifiers_from_ns_event (nsevent); event->scroll.direction = direction; - event->scroll.device = device_manager->core_pointer; + event->scroll.device = gdk_seat_get_pointer (seat); event->scroll.delta_x = delta_x; event->scroll.delta_y = delta_y; - gdk_event_set_seat (event, gdk_device_get_seat (device_manager->core_pointer)); + gdk_event_set_seat (event, seat); } static void @@ -1122,7 +1107,7 @@ fill_key_event (GdkWindow *window, GdkEventType type) { GdkEventPrivate *priv; - GdkQuartzDeviceManagerCore *device_manager; + GdkSeat *seat = gdk_display_get_default_seat (_gdk_display); gchar buf[7]; gunichar c = 0; @@ -1135,16 +1120,15 @@ fill_key_event (GdkWindow *window, event->key.state = get_keyboard_modifiers_from_ns_event (nsevent); event->key.hardware_keycode = [nsevent keyCode]; gdk_event_set_scancode (event, [nsevent keyCode]); - event->key.group = ([nsevent modifierFlags] & NSAlternateKeyMask) ? 1 : 0; + event->key.group = ([nsevent modifierFlags] & GDK_QUARTZ_ALTERNATE_KEY_MASK) ? 1 : 0; event->key.keyval = GDK_KEY_VoidSymbol; - device_manager = GDK_QUARTZ_DEVICE_MANAGER_CORE (_gdk_display->device_manager); - gdk_event_set_device (event, device_manager->core_keyboard); - gdk_event_set_seat (event, gdk_device_get_seat (device_manager->core_keyboard)); - + gdk_event_set_device (event, gdk_seat_get_keyboard (seat)); + gdk_event_set_seat (event, seat); + gdk_keymap_translate_keyboard_state (gdk_keymap_get_for_display (_gdk_display), event->key.hardware_keycode, - event->key.state, + event->key.state, event->key.group, &event->key.keyval, NULL, NULL, NULL); @@ -1256,7 +1240,7 @@ synthesize_crossing_event (GdkWindow *window, { switch ([nsevent type]) { - case NSMouseEntered: + case GDK_QUARTZ_MOUSE_ENTERED: /* Enter events are considered always to be from another toplevel * window, this shouldn't negatively affect any app or gtk code, * and is the only way to make GtkMenu work. EEK EEK EEK. @@ -1272,7 +1256,7 @@ synthesize_crossing_event (GdkWindow *window, GDK_NOTIFY_NONLINEAR); return TRUE; - case NSMouseExited: + case GDK_QUARTZ_MOUSE_EXITED: /* See above */ if (!(window->event_mask & GDK_LEAVE_NOTIFY_MASK)) return FALSE; @@ -1296,7 +1280,7 @@ void _gdk_quartz_synthesize_null_key_event (GdkWindow *window) { GdkEvent *event; - GdkQuartzDeviceManagerCore *device_manager; + GdkSeat *seat = gdk_display_get_default_seat (_gdk_display); event = gdk_event_new (GDK_KEY_PRESS); event->any.type = GDK_KEY_PRESS; @@ -1305,9 +1289,9 @@ _gdk_quartz_synthesize_null_key_event (GdkWindow *window) event->key.hardware_keycode = 0; event->key.group = 0; event->key.keyval = GDK_KEY_VoidSymbol; - device_manager = GDK_QUARTZ_DEVICE_MANAGER_CORE (_gdk_display->device_manager); - gdk_event_set_device (event, device_manager->core_keyboard); - gdk_event_set_seat (event, gdk_device_get_seat (device_manager->core_keyboard)); + + gdk_event_set_device (event, gdk_seat_get_keyboard (seat)); + gdk_event_set_seat (event, seat); append_event(event, FALSE); } @@ -1359,12 +1343,12 @@ test_resize (NSEvent *event, GdkWindow *toplevel, gint x, gint y) GdkWindowImplQuartz *toplevel_impl; gboolean lion; - /* Resizing from the resize indicator only begins if an NSLeftMouseButton + /* Resizing from the resize indicator only begins if an GDK_QUARTZ_LEFT_MOUSE_BUTTON * event is received in the resizing area. */ toplevel_impl = (GdkWindowImplQuartz *)toplevel->impl; if ([toplevel_impl->toplevel showsResizeIndicator]) - if ([event type] == NSLeftMouseDown && + if ([event type] == GDK_QUARTZ_LEFT_MOUSE_DOWN && [toplevel_impl->toplevel showsResizeIndicator]) { NSRect frame; @@ -1403,9 +1387,9 @@ test_resize (NSEvent *event, GdkWindow *toplevel, gint x, gint y) */ lion = gdk_quartz_osx_version () >= GDK_OSX_LION; if (lion && - ([event type] == NSLeftMouseDown || - [event type] == NSRightMouseDown || - [event type] == NSOtherMouseDown)) + ([event type] == GDK_QUARTZ_LEFT_MOUSE_DOWN || + [event type] == GDK_QUARTZ_RIGHT_MOUSE_DOWN || + [event type] == GDK_QUARTZ_OTHER_MOUSE_DOWN)) { if (x < GDK_LION_RESIZE || x > toplevel->width - GDK_LION_RESIZE || @@ -1416,6 +1400,14 @@ test_resize (NSEvent *event, GdkWindow *toplevel, gint x, gint y) return FALSE; } +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101200 +#define GDK_QUARTZ_APP_KIT_DEFINED NSAppKitDefined +#define GDK_QUARTZ_APPLICATION_DEACTIVATED NSApplicationDeactivatedEventType +#else +#define GDK_QUARTZ_APP_KIT_DEFINED NSEventTypeAppKitDefined +#define GDK_QUARTZ_APPLICATION_DEACTIVATED NSEventSubtypeApplicationDeactivated +#endif + static gboolean gdk_event_translate (GdkEvent *event, NSEvent *nsevent) @@ -1431,9 +1423,9 @@ gdk_event_translate (GdkEvent *event, * grabs when the application loses focus (gets deactivated). */ event_type = [nsevent type]; - if (event_type == NSAppKitDefined) + if (event_type == GDK_QUARTZ_APP_KIT_DEFINED) { - if ([nsevent subtype] == NSApplicationDeactivatedEventType) + if ([nsevent subtype] == GDK_QUARTZ_APPLICATION_DEACTIVATED) _gdk_quartz_events_break_all_grabs (get_time_from_ns_event (nsevent)); /* This could potentially be used to break grabs when clicking @@ -1469,7 +1461,7 @@ gdk_event_translate (GdkEvent *event, { GdkWindow *toplevel = NULL; - if (event_type == NSMouseMoved) + if (event_type == GDK_QUARTZ_MOUSE_MOVED) { /* Motion events received after clicking the menu bar do not have the * window field set. Instead of giving up on the event immediately, @@ -1540,9 +1532,9 @@ gdk_event_translate (GdkEvent *event, * native apps). If the app is active, we focus the window and then handle * the event, also to match native apps. */ - if ((event_type == NSRightMouseDown || - event_type == NSOtherMouseDown || - event_type == NSLeftMouseDown)) + if ((event_type == GDK_QUARTZ_RIGHT_MOUSE_DOWN || + event_type == GDK_QUARTZ_OTHER_MOUSE_DOWN || + event_type == GDK_QUARTZ_LEFT_MOUSE_DOWN)) { GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl); @@ -1554,35 +1546,32 @@ gdk_event_translate (GdkEvent *event, else if (![impl->toplevel isKeyWindow]) { GdkDeviceGrabInfo *grab; + GdkSeat *seat = gdk_display_get_default_seat (_gdk_display); grab = _gdk_display_get_last_device_grab (_gdk_display, - GDK_QUARTZ_DEVICE_MANAGER_CORE (_gdk_display->device_manager)->core_pointer); - if (!grab) - [impl->toplevel makeKeyWindow]; + gdk_seat_get_pointer (seat)); } + return_val = TRUE; } - - return_val = TRUE; - switch (event_type) { - case NSLeftMouseDown: - case NSRightMouseDown: - case NSOtherMouseDown: - case NSLeftMouseUp: - case NSRightMouseUp: - case NSOtherMouseUp: + case GDK_QUARTZ_LEFT_MOUSE_DOWN: + case GDK_QUARTZ_RIGHT_MOUSE_DOWN: + case GDK_QUARTZ_OTHER_MOUSE_DOWN: + case GDK_QUARTZ_LEFT_MOUSE_UP: + case GDK_QUARTZ_RIGHT_MOUSE_UP: + case GDK_QUARTZ_OTHER_MOUSE_UP: fill_button_event (window, event, nsevent, x, y, x_root, y_root); break; - case NSLeftMouseDragged: - case NSRightMouseDragged: - case NSOtherMouseDragged: - case NSMouseMoved: + case GDK_QUARTZ_LEFT_MOUSE_DRAGGED: + case GDK_QUARTZ_RIGHT_MOUSE_DRAGGED: + case GDK_QUARTZ_OTHER_MOUSE_DRAGGED: + case GDK_QUARTZ_MOUSE_MOVED: fill_motion_event (window, event, nsevent, x, y, x_root, y_root); break; - case NSScrollWheel: + case GDK_QUARTZ_SCROLL_WHEEL: { GdkScrollDirection direction; float dx; @@ -1659,17 +1648,17 @@ gdk_event_translate (GdkEvent *event, return_val = FALSE; break; #endif - case NSMouseExited: + case GDK_QUARTZ_MOUSE_EXITED: if (WINDOW_IS_TOPLEVEL (window)) [[NSCursor arrowCursor] set]; /* fall through */ - case NSMouseEntered: + case GDK_QUARTZ_MOUSE_ENTERED: return_val = synthesize_crossing_event (window, event, nsevent, x, y, x_root, y_root); break; - case NSKeyDown: - case NSKeyUp: - case NSFlagsChanged: + case GDK_QUARTZ_KEY_DOWN: + case GDK_QUARTZ_KEY_UP: + case GDK_QUARTZ_FLAGS_CHANGED: { GdkEventType type; diff --git a/gdk/quartz/gdkglobals-quartz.c b/gdk/quartz/gdkglobals-quartz.c index efcf73c391..81cd4632e8 100644 --- a/gdk/quartz/gdkglobals-quartz.c +++ b/gdk/quartz/gdkglobals-quartz.c @@ -32,9 +32,16 @@ gdk_quartz_osx_version (void) if (minor == GDK_OSX_UNSUPPORTED) { +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101000 OSErr err = Gestalt (gestaltSystemVersionMinor, (SInt32*)&minor); g_return_val_if_fail (err == noErr, GDK_OSX_UNSUPPORTED); +#else + NSOperatingSystemVersion version; + + version = [[NSProcessInfo processInfo] operatingSystemVersion]; + minor = version.minorVersion; +#endif } if (minor < GDK_OSX_MIN) diff --git a/gdk/quartz/gdkkeys-quartz.c b/gdk/quartz/gdkkeys-quartz.c index f9857831c9..f646372fe0 100644 --- a/gdk/quartz/gdkkeys-quartz.c +++ b/gdk/quartz/gdkkeys-quartz.c @@ -87,52 +87,20 @@ _gdk_quartz_display_get_keymap (GdkDisplay *display) */ static guint *keyval_array = NULL; -static inline UniChar -macroman2ucs (unsigned char c) -{ - /* Precalculated table mapping MacRoman-128 to Unicode. Generated - by creating single element CFStringRefs then extracting the - first character. */ - - static const unsigned short table[128] = { - 0xc4, 0xc5, 0xc7, 0xc9, 0xd1, 0xd6, 0xdc, 0xe1, - 0xe0, 0xe2, 0xe4, 0xe3, 0xe5, 0xe7, 0xe9, 0xe8, - 0xea, 0xeb, 0xed, 0xec, 0xee, 0xef, 0xf1, 0xf3, - 0xf2, 0xf4, 0xf6, 0xf5, 0xfa, 0xf9, 0xfb, 0xfc, - 0x2020, 0xb0, 0xa2, 0xa3, 0xa7, 0x2022, 0xb6, 0xdf, - 0xae, 0xa9, 0x2122, 0xb4, 0xa8, 0x2260, 0xc6, 0xd8, - 0x221e, 0xb1, 0x2264, 0x2265, 0xa5, 0xb5, 0x2202, 0x2211, - 0x220f, 0x3c0, 0x222b, 0xaa, 0xba, 0x3a9, 0xe6, 0xf8, - 0xbf, 0xa1, 0xac, 0x221a, 0x192, 0x2248, 0x2206, 0xab, - 0xbb, 0x2026, 0xa0, 0xc0, 0xc3, 0xd5, 0x152, 0x153, - 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0xf7, 0x25ca, - 0xff, 0x178, 0x2044, 0x20ac, 0x2039, 0x203a, 0xfb01, 0xfb02, - 0x2021, 0xb7, 0x201a, 0x201e, 0x2030, 0xc2, 0xca, 0xc1, - 0xcb, 0xc8, 0xcd, 0xce, 0xcf, 0xcc, 0xd3, 0xd4, - 0xf8ff, 0xd2, 0xda, 0xdb, 0xd9, 0x131, 0x2c6, 0x2dc, - 0xaf, 0x2d8, 0x2d9, 0x2da, 0xb8, 0x2dd, 0x2db, 0x2c7 - }; - - if (c < 128) - return c; - else - return table[c - 128]; -} - const static struct { guint keycode; guint keyval; unsigned int modmask; /* So we can tell when a mod key is pressed/released */ } modifier_keys[] = { - { 54, GDK_KEY_Meta_R, NSCommandKeyMask }, - { 55, GDK_KEY_Meta_L, NSCommandKeyMask }, - { 56, GDK_KEY_Shift_L, NSShiftKeyMask }, - { 57, GDK_KEY_Caps_Lock, NSAlphaShiftKeyMask }, - { 58, GDK_KEY_Alt_L, NSAlternateKeyMask }, - { 59, GDK_KEY_Control_L, NSControlKeyMask }, - { 60, GDK_KEY_Shift_R, NSShiftKeyMask }, - { 61, GDK_KEY_Alt_R, NSAlternateKeyMask }, - { 62, GDK_KEY_Control_R, NSControlKeyMask } + { 54, GDK_KEY_Meta_R, GDK_QUARTZ_COMMAND_KEY_MASK }, + { 55, GDK_KEY_Meta_L, GDK_QUARTZ_COMMAND_KEY_MASK }, + { 56, GDK_KEY_Shift_L, GDK_QUARTZ_SHIFT_KEY_MASK }, + { 57, GDK_KEY_Caps_Lock, GDK_QUARTZ_ALPHA_SHIFT_KEY_MASK }, + { 58, GDK_KEY_Alt_L, GDK_QUARTZ_ALTERNATE_KEY_MASK }, + { 59, GDK_KEY_Control_L, GDK_QUARTZ_CONTROL_KEY_MASK }, + { 60, GDK_KEY_Shift_R, GDK_QUARTZ_SHIFT_KEY_MASK }, + { 61, GDK_KEY_Alt_R, GDK_QUARTZ_ALTERNATE_KEY_MASK }, + { 62, GDK_KEY_Control_R, GDK_QUARTZ_CONTROL_KEY_MASK } }; const static struct { @@ -783,11 +751,11 @@ _gdk_quartz_keys_event_type (NSEvent *event) switch ([event type]) { - case NSKeyDown: + case GDK_QUARTZ_KEY_DOWN: return GDK_KEY_PRESS; - case NSKeyUp: + case GDK_QUARTZ_KEY_UP: return GDK_KEY_RELEASE; - case NSFlagsChanged: + case GDK_QUARTZ_FLAGS_CHANGED: break; default: g_assert_not_reached (); diff --git a/gdk/quartz/gdkmonitor-quartz.h b/gdk/quartz/gdkmonitor-quartz.h index 468a1d8f96..75dc9c8b12 100644 --- a/gdk/quartz/gdkmonitor-quartz.h +++ b/gdk/quartz/gdkmonitor-quartz.h @@ -29,8 +29,8 @@ struct _GdkQuartzMonitor { GdkMonitor parent; - gint monitor_num; + CGDirectDisplayID id; }; struct _GdkQuartzMonitorClass { @@ -38,4 +38,3 @@ struct _GdkQuartzMonitorClass { }; #endif - diff --git a/gdk/quartz/gdkproperty-quartz.c b/gdk/quartz/gdkproperty-quartz.c index cfc62a389c..82b1e473db 100644 --- a/gdk/quartz/gdkproperty-quartz.c +++ b/gdk/quartz/gdkproperty-quartz.c @@ -128,26 +128,6 @@ ensure_atom_tables (void) } } -static GdkAtom -intern_atom_internal (const gchar *atom_name, gboolean allocate) -{ - gpointer result; - gchar *name; - g_return_val_if_fail (atom_name != NULL, GDK_NONE); - - ensure_atom_tables (); - - if (g_hash_table_lookup_extended (names_to_atoms, atom_name, NULL, &result)) - return result; - - result = GINT_TO_POINTER (atoms_to_names->len); - name = allocate ? g_strdup (atom_name) : (gchar *)atom_name; - g_hash_table_insert(names_to_atoms, name, result); - g_ptr_array_add(atoms_to_names, name); - - return result; -} - void _gdk_quartz_window_delete_property (GdkWindow *window, GdkAtom property) diff --git a/gdk/quartz/gdkquartzkeys.h b/gdk/quartz/gdkquartzkeys.h index f35612e36a..c937288b45 100644 --- a/gdk/quartz/gdkquartzkeys.h +++ b/gdk/quartz/gdkquartzkeys.h @@ -45,6 +45,79 @@ typedef struct _GdkQuartzKeymapClass GdkQuartzKeymapClass; GDK_AVAILABLE_IN_ALL GType gdk_quartz_keymap_get_type (void); +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101200 +typedef enum + { + GDK_QUARTZ_FLAGS_CHANGED = NSFlagsChanged, + GDK_QUARTZ_KEY_UP = NSKeyUp, + GDK_QUARTZ_KEY_DOWN = NSKeyDown, + GDK_QUARTZ_MOUSE_ENTERED = NSMouseEntered, + GDK_QUARTZ_MOUSE_EXITED = NSMouseExited, + GDK_QUARTZ_SCROLL_WHEEL = NSScrollWheel, + GDK_QUARTZ_MOUSE_MOVED = NSMouseMoved, + GDK_QUARTZ_OTHER_MOUSE_DRAGGED = NSOtherMouseDragged, + GDK_QUARTZ_RIGHT_MOUSE_DRAGGED = NSRightMouseDragged, + GDK_QUARTZ_LEFT_MOUSE_DRAGGED = NSLeftMouseDragged, + GDK_QUARTZ_OTHER_MOUSE_UP = NSOtherMouseUp, + GDK_QUARTZ_RIGHT_MOUSE_UP = NSRightMouseUp, + GDK_QUARTZ_LEFT_MOUSE_UP = NSLeftMouseUp, + GDK_QUARTZ_OTHER_MOUSE_DOWN = NSOtherMouseDown, + GDK_QUARTZ_RIGHT_MOUSE_DOWN = NSRightMouseDown, + GDK_QUARTZ_LEFT_MOUSE_DOWN = NSLeftMouseDown, + } GdkQuartzEventType; + +typedef enum + { + GDK_QUARTZ_ALTERNATE_KEY_MASK = NSAlternateKeyMask, + GDK_QUARTZ_CONTROL_KEY_MASK = NSControlKeyMask, + GDK_QUARTZ_SHIFT_KEY_MASK = NSShiftKeyMask, + GDK_QUARTZ_ALPHA_SHIFT_KEY_MASK = NSAlphaShiftKeyMask, + GDK_QUARTZ_COMMAND_KEY_MASK = NSCommandKeyMask, + GDK_QUARTZ_ANY_EVENT_MASK = NSAnyEventMask, + } GdkQuartzEventModifierFlags; + +typedef enum + { + GDK_QUARTZ_EVENT_MASK_ANY = NSAnyEventMask, + } GdkQuartzEventMask; + +#else +typedef enum + { + GDK_QUARTZ_FLAGS_CHANGED = NSEventTypeFlagsChanged, + GDK_QUARTZ_KEY_UP = NSEventTypeKeyUp, + GDK_QUARTZ_KEY_DOWN = NSEventTypeKeyDown, + GDK_QUARTZ_MOUSE_ENTERED = NSEventTypeMouseEntered, + GDK_QUARTZ_MOUSE_EXITED = NSEventTypeMouseExited, + GDK_QUARTZ_SCROLL_WHEEL = NSEventTypeScrollWheel, + GDK_QUARTZ_MOUSE_MOVED = NSEventTypeMouseMoved, + GDK_QUARTZ_OTHER_MOUSE_DRAGGED = NSEventTypeOtherMouseDragged, + GDK_QUARTZ_RIGHT_MOUSE_DRAGGED = NSEventTypeRightMouseDragged, + GDK_QUARTZ_LEFT_MOUSE_DRAGGED = NSEventTypeLeftMouseDragged, + GDK_QUARTZ_OTHER_MOUSE_UP = NSEventTypeOtherMouseUp, + GDK_QUARTZ_RIGHT_MOUSE_UP = NSEventTypeRightMouseUp, + GDK_QUARTZ_LEFT_MOUSE_UP = NSEventTypeLeftMouseUp, + GDK_QUARTZ_OTHER_MOUSE_DOWN = NSEventTypeOtherMouseDown, + GDK_QUARTZ_RIGHT_MOUSE_DOWN = NSEventTypeRightMouseDown, + GDK_QUARTZ_LEFT_MOUSE_DOWN = NSEventTypeLeftMouseDown, + } GdkQuartzEventType; + +typedef enum + { + GDK_QUARTZ_ALTERNATE_KEY_MASK = NSEventModifierFlagOption, + GDK_QUARTZ_CONTROL_KEY_MASK = NSEventModifierFlagControl, + GDK_QUARTZ_SHIFT_KEY_MASK = NSEventModifierFlagShift, + GDK_QUARTZ_ALPHA_SHIFT_KEY_MASK = NSEventModifierFlagCapsLock, + GDK_QUARTZ_COMMAND_KEY_MASK = NSEventModifierFlagCommand, + } GdkQuartzEventModifierFlags; + +typedef enum + { + GDK_QUARTZ_EVENT_MASK_ANY = NSEventMaskAny, + } GdkQuartzEventMask; + +#endif + G_END_DECLS #endif /* __GDK_QUARTZ_KEYS_H__ */ diff --git a/gdk/quartz/gdkscreen-quartz.c b/gdk/quartz/gdkscreen-quartz.c index cea9c4cba7..cd9d6649cb 100644 --- a/gdk/quartz/gdkscreen-quartz.c +++ b/gdk/quartz/gdkscreen-quartz.c @@ -63,12 +63,10 @@ static void gdk_quartz_screen_dispose (GObject *object); static void gdk_quartz_screen_finalize (GObject *object); static void gdk_quartz_screen_calculate_layout (GdkQuartzScreen *screen); +static void gdk_quartz_screen_reconfigure (GdkQuartzDisplay *dispplay, + GdkQuartzScreen *screen); -static void display_reconfiguration_callback (CGDirectDisplayID display, - CGDisplayChangeSummaryFlags flags, - void *userInfo); static const double dpi = 72.0; -static gint get_mm_from_pixels (NSScreen *screen, int pixels); G_DEFINE_TYPE (GdkQuartzScreen, gdk_quartz_screen, GDK_TYPE_SCREEN); @@ -86,13 +84,11 @@ gdk_quartz_screen_init (GdkQuartzScreen *quartz_screen) * pangocairo-coretext needs to default to that scaling factor. */ + g_signal_connect (_gdk_display, "monitors-changed", + G_CALLBACK (gdk_quartz_screen_reconfigure), quartz_screen); + /* The first monitors-changed should have fired already. */ _gdk_screen_set_resolution (screen, dpi); - gdk_quartz_screen_calculate_layout (quartz_screen); - - CGDisplayRegisterReconfigurationCallback (display_reconfiguration_callback, - screen); - quartz_screen->emit_monitors_changed = FALSE; } @@ -107,9 +103,6 @@ gdk_quartz_screen_dispose (GObject *object) screen->screen_changed_id = 0; } - CGDisplayRemoveReconfigurationCallback (display_reconfiguration_callback, - screen); - G_OBJECT_CLASS (gdk_quartz_screen_parent_class)->dispose (object); } @@ -127,77 +120,42 @@ gdk_quartz_screen_finalize (GObject *object) static void gdk_quartz_screen_calculate_layout (GdkQuartzScreen *screen) { - NSArray *array; - int i; + int i, monitors; int max_x, max_y; GdkDisplay *display = gdk_screen_get_display (GDK_SCREEN (screen)); - GdkQuartzDisplay *display_quartz = GDK_QUARTZ_DISPLAY (display); - - g_ptr_array_free (display_quartz->monitors, TRUE); - display_quartz->monitors = g_ptr_array_new_with_free_func (g_object_unref); - - GDK_QUARTZ_ALLOC_POOL; - - array = [NSScreen screens]; screen->width = 0; screen->height = 0; screen->min_x = 0; screen->min_y = 0; max_x = max_y = 0; + screen->mm_width = 0; + screen->mm_height = 0; /* We determine the minimum and maximum x and y coordinates * covered by the monitors. From this we can deduce the width * and height of the root screen. */ - for (i = 0; i < [array count]; i++) + monitors = gdk_display_get_n_monitors (display); + for (i = 0; i < monitors; ++i) { - GdkQuartzMonitor *monitor = g_object_new (GDK_TYPE_QUARTZ_MONITOR, - "display", display, - NULL); - g_ptr_array_add (display_quartz->monitors, monitor); - monitor->monitor_num = i; + GdkQuartzMonitor *monitor = + GDK_QUARTZ_MONITOR (gdk_display_get_monitor (display, i)); + GdkRectangle rect; - NSRect rect = [[array objectAtIndex:i] frame]; + gdk_monitor_get_geometry (GDK_MONITOR (monitor), &rect); + screen->min_x = MIN (screen->min_x, rect.x); + max_x = MAX (max_x, rect.x + rect.width); - screen->min_x = MIN (screen->min_x, rect.origin.x); - max_x = MAX (max_x, rect.origin.x + rect.size.width); + screen->min_y = MIN (screen->min_y, rect.y); + max_y = MAX (max_y, rect.y + rect.height); - screen->min_y = MIN (screen->min_y, rect.origin.y); - max_y = MAX (max_y, rect.origin.y + rect.size.height); + screen->mm_height += GDK_MONITOR (monitor)->height_mm; + screen->mm_width += GDK_MONITOR (monitor)->width_mm; } screen->width = max_x - screen->min_x; screen->height = max_y - screen->min_y; - - for (i = 0; i < [array count] ; i++) - { - NSScreen *nsscreen; - NSRect rect; - GdkMonitor *monitor; - - monitor = GDK_MONITOR(display_quartz->monitors->pdata[i]); - nsscreen = [array objectAtIndex:i]; - rect = [nsscreen frame]; - - monitor->geometry.x = rect.origin.x - screen->min_x; - monitor->geometry.y - = screen->height - (rect.origin.y + rect.size.height) + screen->min_y; - monitor->geometry.width = rect.size.width; - monitor->geometry.height = rect.size.height; - if (gdk_quartz_osx_version() >= GDK_OSX_LION) - monitor->scale_factor = [(id ) nsscreen backingScaleFactor]; - else - monitor->scale_factor = 1; - monitor->width_mm = get_mm_from_pixels(nsscreen, monitor->geometry.width); - monitor->height_mm = get_mm_from_pixels(nsscreen, monitor->geometry.height); - monitor->refresh_rate = 0; // unknown - monitor->manufacturer = NULL; // unknown - monitor->model = NULL; // unknown - monitor->subpixel_layout = GDK_SUBPIXEL_LAYOUT_UNKNOWN; // unknown - } - - GDK_QUARTZ_RELEASE_POOL; } void @@ -236,7 +194,7 @@ _gdk_quartz_screen_update_window_sizes (GdkScreen *screen) } static void -process_display_reconfiguration (GdkQuartzScreen *screen) +gdk_quartz_screen_reconfigure (GdkQuartzDisplay *display, GdkQuartzScreen *screen) { int width, height; @@ -258,56 +216,6 @@ process_display_reconfiguration (GdkQuartzScreen *screen) g_signal_emit_by_name (screen, "size-changed"); } -static gboolean -screen_changed_idle (gpointer data) -{ - GdkQuartzScreen *screen = data; - - process_display_reconfiguration (data); - - screen->screen_changed_id = 0; - - return FALSE; -} - -static void -display_reconfiguration_callback (CGDirectDisplayID display, - CGDisplayChangeSummaryFlags flags, - void *userInfo) -{ - GdkQuartzScreen *screen = userInfo; - - if (flags & kCGDisplayBeginConfigurationFlag) - { - /* Ignore the begin configuration signal. */ - return; - } - else - { - /* We save information about the changes, so we can emit - * ::monitors-changed when appropriate. This signal must be - * emitted when the number, size of position of one of the - * monitors changes. - */ - if (flags & kCGDisplayMovedFlag - || flags & kCGDisplayAddFlag - || flags & kCGDisplayRemoveFlag - || flags & kCGDisplayEnabledFlag - || flags & kCGDisplayDisabledFlag) - screen->emit_monitors_changed = TRUE; - - /* At this point Cocoa does not know about the new screen data - * yet, so we delay our refresh into an idle handler. - */ - if (!screen->screen_changed_id) - { - screen->screen_changed_id = gdk_threads_add_idle (screen_changed_idle, - screen); - g_source_set_name_by_id (screen->screen_changed_id, "[gtk+] screen_changed_idle"); - } - } -} - static GdkDisplay * gdk_quartz_screen_get_display (GdkScreen *screen) { @@ -338,13 +246,6 @@ gdk_quartz_screen_get_height (GdkScreen *screen) return GDK_QUARTZ_SCREEN (screen)->height; } -static gint -get_mm_from_pixels (NSScreen *screen, int pixels) -{ - const float mm_per_inch = 25.4; - return (pixels / dpi) * mm_per_inch; -} - static gchar * gdk_quartz_screen_make_display_name (GdkScreen *screen) { @@ -369,34 +270,16 @@ gdk_quartz_screen_is_composited (GdkScreen *screen) return TRUE; } -static NSScreen * -get_nsscreen_for_monitor (gint monitor_num) -{ - NSArray *array; - NSScreen *screen; - - GDK_QUARTZ_ALLOC_POOL; - - array = [NSScreen screens]; - screen = [array objectAtIndex:monitor_num]; - - GDK_QUARTZ_RELEASE_POOL; - - return screen; -} - static gint gdk_quartz_screen_get_width_mm (GdkScreen *screen) { - return get_mm_from_pixels (get_nsscreen_for_monitor (0), - GDK_QUARTZ_SCREEN (screen)->width); + return GDK_QUARTZ_SCREEN (screen)->mm_width; } static gint gdk_quartz_screen_get_height_mm (GdkScreen *screen) { - return get_mm_from_pixels (get_nsscreen_for_monitor (0), - GDK_QUARTZ_SCREEN (screen)->height); + return GDK_QUARTZ_SCREEN (screen)->mm_height; } static void diff --git a/gdk/quartz/gdkscreen-quartz.h b/gdk/quartz/gdkscreen-quartz.h index 5a1cfa3398..99c2c4fe88 100644 --- a/gdk/quartz/gdkscreen-quartz.h +++ b/gdk/quartz/gdkscreen-quartz.h @@ -35,6 +35,8 @@ struct _GdkQuartzScreen gint width; gint height; + gint mm_width; + gint mm_height; guint screen_changed_id; diff --git a/gdk/quartz/gdkselection-quartz.c b/gdk/quartz/gdkselection-quartz.c index c6014a2579..22ad16a3e5 100644 --- a/gdk/quartz/gdkselection-quartz.c +++ b/gdk/quartz/gdkselection-quartz.c @@ -172,16 +172,28 @@ _gdk_quartz_display_text_property_to_utf8_list (GdkDisplay *display, } } +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101400 +#define GDK_QUARTZ_URL_PBOARD_TYPE NSURLPboardType +#define GDK_QUARTZ_COLOR_PBOARD_TYPE NSColorPboardType +#define GDK_QUARTZ_STRING_PBOARD_TYPE NSStringPboardType +#define GDK_QUARTZ_TIFF_PBOARD_TYPE NSTIFFPboardType +#else +#define GDK_QUARTZ_URL_PBOARD_TYPE NSPasteboardTypeURL +#define GDK_QUARTZ_COLOR_PBOARD_TYPE NSPasteboardTypeColor +#define GDK_QUARTZ_STRING_PBOARD_TYPE NSPasteboardTypeString +#define GDK_QUARTZ_TIFF_PBOARD_TYPE NSPasteboardTypeTIFF +#endif + GdkAtom gdk_quartz_pasteboard_type_to_atom_libgtk_only (NSString *type) { - if ([type isEqualToString:NSStringPboardType]) + if ([type isEqualToString:GDK_QUARTZ_STRING_PBOARD_TYPE]) return gdk_atom_intern_static_string ("UTF8_STRING"); - else if ([type isEqualToString:NSTIFFPboardType]) + else if ([type isEqualToString:GDK_QUARTZ_TIFF_PBOARD_TYPE]) return gdk_atom_intern_static_string ("image/tiff"); - else if ([type isEqualToString:NSColorPboardType]) + else if ([type isEqualToString:GDK_QUARTZ_COLOR_PBOARD_TYPE]) return gdk_atom_intern_static_string ("application/x-color"); - else if ([type isEqualToString:NSURLPboardType]) + else if ([type isEqualToString:GDK_QUARTZ_URL_PBOARD_TYPE]) return gdk_atom_intern_static_string ("text/uri-list"); else return gdk_atom_intern ([type UTF8String], FALSE); @@ -191,13 +203,13 @@ NSString * gdk_quartz_target_to_pasteboard_type_libgtk_only (const char *target) { if (strcmp (target, "UTF8_STRING") == 0) - return NSStringPboardType; + return GDK_QUARTZ_STRING_PBOARD_TYPE; else if (strcmp (target, "image/tiff") == 0) - return NSTIFFPboardType; + return GDK_QUARTZ_TIFF_PBOARD_TYPE; else if (strcmp (target, "application/x-color") == 0) - return NSColorPboardType; + return GDK_QUARTZ_COLOR_PBOARD_TYPE; else if (strcmp (target, "text/uri-list") == 0) - return NSURLPboardType; + return GDK_QUARTZ_URL_PBOARD_TYPE; else return [NSString stringWithUTF8String:target]; } diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index 858444b2bb..200c7018a9 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -52,6 +52,27 @@ typedef struct GdkWMDecoration decor; } FullscreenSavedGeometry; +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101200 +typedef enum +{ + GDK_QUARTZ_BORDERLESS_WINDOW = NSBorderlessWindowMask, + GDK_QUARTZ_CLOSABLE_WINDOW = NSClosableWindowMask, + GDK_QUARTZ_FULLSCREEN_WINDOW = NSFullScreenWindowMask, + GDK_QUARTZ_MINIATURIZABLE_WINDOW = NSMiniaturizableWindowMask, + GDK_QUARTZ_RESIZABLE_WINDOW = NSResizableWindowMask, + GDK_QUARTZ_TITLED_WINDOW = NSTitledWindowMask, +} GdkQuartzWindowMask; +#else +typedef enum +{ + GDK_QUARTZ_BORDERLESS_WINDOW = NSWindowStyleMaskBorderless, + GDK_QUARTZ_CLOSABLE_WINDOW = NSWindowStyleMaskClosable, + GDK_QUARTZ_FULLSCREEN_WINDOW = NSWindowStyleMaskFullScreen, + GDK_QUARTZ_MINIATURIZABLE_WINDOW = NSWindowStyleMaskMiniaturizable, + GDK_QUARTZ_RESIZABLE_WINDOW = NSWindowStyleMaskResizable, + GDK_QUARTZ_TITLED_WINDOW = NSWindowStyleMaskTitled, +} GdkQuartzWindowMask; +#endif #ifndef AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER static FullscreenSavedGeometry *get_fullscreen_geometry (GdkWindow *window); @@ -120,7 +141,7 @@ static CGContextRef gdk_window_impl_quartz_get_context (GdkWindowImplQuartz *window_impl, gboolean antialias) { - CGContextRef cg_context; + CGContextRef cg_context = NULL; CGSize scale; if (GDK_WINDOW_DESTROYED (window_impl->wrapper)) @@ -137,10 +158,15 @@ gdk_window_impl_quartz_get_context (GdkWindowImplQuartz *window_impl, if (![window_impl->view lockFocusIfCanDraw]) return NULL; } +#if MAC_OS_X_VERSION_MAX_ALLOWED < 101000 + cg_context = [[NSGraphicsContext currentContext] graphicsPort]; +#else if (gdk_quartz_osx_version () < GDK_OSX_YOSEMITE) cg_context = [[NSGraphicsContext currentContext] graphicsPort]; else cg_context = [[NSGraphicsContext currentContext] CGContext]; +#endif + if (!cg_context) return NULL; CGContextSaveGState (cg_context); @@ -170,58 +196,14 @@ gdk_window_impl_quartz_release_context (GdkWindowImplQuartz *window_impl, } } -static void -check_grab_unmap (GdkWindow *window) -{ - GList *list, *l; - GdkDisplay *display = gdk_window_get_display (window); - GdkDeviceManager *device_manager; - - device_manager = gdk_display_get_device_manager (display); - list = gdk_device_manager_list_devices (device_manager, - GDK_DEVICE_TYPE_FLOATING); - for (l = list; l; l = l->next) - { - _gdk_display_end_device_grab (display, l->data, 0, window, TRUE); - } - - g_list_free (list); -} - -static void -check_grab_destroy (GdkWindow *window) -{ - GList *list, *l; - GdkDisplay *display = gdk_window_get_display (window); - GdkDeviceManager *device_manager; - - /* Make sure there is no lasting grab in this native window */ - device_manager = gdk_display_get_device_manager (display); - list = gdk_device_manager_list_devices (device_manager, - GDK_DEVICE_TYPE_MASTER); - - for (l = list; l; l = l->next) - { - GdkDeviceGrabInfo *grab; - - grab = _gdk_display_get_last_device_grab (display, l->data); - if (grab && grab->native_window == window) - { - /* Serials are always 0 in quartz, but for clarity: */ - grab->serial_end = grab->serial_start; - grab->implicit_ungrab = TRUE; - } - } - - g_list_free (list); -} - static void gdk_window_impl_quartz_finalize (GObject *object) { GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (object); + GdkDisplay *display = gdk_window_get_display (impl->wrapper); + GdkSeat *seat = gdk_display_get_default_seat (display); - check_grab_destroy (GDK_WINDOW_IMPL_QUARTZ (object)->wrapper); + gdk_seat_ungrab (seat); if (impl->transient_for) g_object_unref (impl->transient_for); @@ -239,10 +221,14 @@ gdk_window_impl_quartz_finalize (GObject *object) * * If drawable NULL, no flushing is done, only registering that a flush was * done externally. + * + * Note: As of MacOS 10.14 NSWindow flushWindow is deprecated because + * Quartz has the ability to handle deferred drawing on its own. */ void _gdk_quartz_window_flush (GdkWindowImplQuartz *window_impl) { +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101400 static struct timeval prev_tv; static gint intervals[4]; static gint index; @@ -268,6 +254,7 @@ _gdk_quartz_window_flush (GdkWindowImplQuartz *window_impl) } else prev_tv = tv; +#endif } static cairo_user_data_key_t gdk_quartz_cairo_key; @@ -398,7 +385,7 @@ _gdk_quartz_window_process_updates_recurse (GdkWindow *window, toplevel_impl = (GdkWindowImplQuartz *)toplevel->impl; nswindow = toplevel_impl->toplevel; - +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101400 /* In theory, we could skip the flush disabling, since we only * have one NSView. */ @@ -408,6 +395,7 @@ _gdk_quartz_window_process_updates_recurse (GdkWindow *window, [nswindow disableFlushWindow]; update_nswindows = g_slist_prepend (update_nswindows, nswindow); } +#endif } } @@ -431,10 +419,12 @@ _gdk_quartz_display_before_process_all_updates (GdkDisplay *display) { [NSAnimationContext endGrouping]; } +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101100 else { NSDisableScreenUpdates (); } +#endif } void @@ -452,9 +442,10 @@ _gdk_quartz_display_after_process_all_updates (GdkDisplay *display) [[nswindow contentView] displayIfNeeded]; _gdk_quartz_window_flush (NULL); - +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101400 [nswindow enableFlushWindow]; [nswindow flushWindow]; +#endif [nswindow release]; tmp_list = tmp_list->next; @@ -468,10 +459,12 @@ _gdk_quartz_display_after_process_all_updates (GdkDisplay *display) { [NSAnimationContext beginGrouping]; } +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101100 else { NSEnableScreenUpdates (); } +#endif } static const gchar * @@ -553,7 +546,11 @@ _gdk_quartz_window_debug_highlight (GdkWindow *window, gint number) [debug_window[number] close]; debug_window[number] = [[NSWindow alloc] initWithContentRect:rect - styleMask:NSBorderlessWindowMask +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101200 + styleMask:(NSUInteger)GDK_QUARTZ_BORDERLESS_WINDOW +#else + styleMask:(NSWindowStyleMask)GDK_QUARTZ_BORDERLESS_WINDOW +#endif backing:NSBackingStoreBuffered defer:NO]; @@ -880,14 +877,14 @@ _gdk_quartz_display_create_window_impl (GdkDisplay *display, ((attributes_mask & GDK_WA_TYPE_HINT) && attributes->type_hint == GDK_WINDOW_TYPE_HINT_SPLASHSCREEN)) { - style_mask = NSBorderlessWindowMask; + style_mask = GDK_QUARTZ_BORDERLESS_WINDOW; } else { - style_mask = (NSTitledWindowMask | - NSClosableWindowMask | - NSMiniaturizableWindowMask | - NSResizableWindowMask); + style_mask = (GDK_QUARTZ_TITLED_WINDOW | + GDK_QUARTZ_CLOSABLE_WINDOW | + GDK_QUARTZ_MINIATURIZABLE_WINDOW | + GDK_QUARTZ_RESIZABLE_WINDOW); } impl->toplevel = [[GdkQuartzNSWindow alloc] initWithContentRect:content_rect @@ -1147,6 +1144,9 @@ void gdk_window_quartz_hide (GdkWindow *window) { GdkWindowImplQuartz *impl; + GdkDisplay *display = gdk_window_get_display (window); + GdkSeat *seat = gdk_display_get_default_seat (display); + gdk_seat_ungrab (seat); /* Make sure we're not stuck in fullscreen mode. */ #ifndef AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER @@ -1154,8 +1154,6 @@ gdk_window_quartz_hide (GdkWindow *window) SetSystemUIMode (kUIModeNormal, 0); #endif - check_grab_unmap (window); - _gdk_window_clear_update_area (window); impl = GDK_WINDOW_IMPL_QUARTZ (window->impl); @@ -1626,7 +1624,7 @@ gdk_window_quartz_get_geometry (GdkWindow *window, * windows with borders and the root relative coordinates * otherwise. */ - if ([impl->toplevel styleMask] == NSBorderlessWindowMask) + if ([impl->toplevel styleMask] == GDK_QUARTZ_BORDERLESS_WINDOW) { _gdk_quartz_window_xy_to_gdk_xy (ns_rect.origin.x, ns_rect.origin.y + ns_rect.size.height, @@ -2353,13 +2351,14 @@ gdk_quartz_window_set_decorations (GdkWindow *window, if (decorations == 0 || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || impl->type_hint == GDK_WINDOW_TYPE_HINT_SPLASHSCREEN ) { - new_mask = NSBorderlessWindowMask; + new_mask = GDK_QUARTZ_BORDERLESS_WINDOW; } else { /* FIXME: Honor other GDK_DECOR_* flags. */ - new_mask = (NSTitledWindowMask | NSClosableWindowMask | - NSMiniaturizableWindowMask | NSResizableWindowMask); + new_mask = (GDK_QUARTZ_TITLED_WINDOW | GDK_QUARTZ_CLOSABLE_WINDOW | + GDK_QUARTZ_MINIATURIZABLE_WINDOW | + GDK_QUARTZ_RESIZABLE_WINDOW); } GDK_QUARTZ_ALLOC_POOL; @@ -2377,14 +2376,14 @@ gdk_quartz_window_set_decorations (GdkWindow *window, /* Properly update the size of the window when the titlebar is * added or removed. */ - if (old_mask == NSBorderlessWindowMask && - new_mask != NSBorderlessWindowMask) + if (old_mask == GDK_QUARTZ_BORDERLESS_WINDOW && + new_mask != GDK_QUARTZ_BORDERLESS_WINDOW) { rect = [NSWindow frameRectForContentRect:rect styleMask:new_mask]; } - else if (old_mask != NSBorderlessWindowMask && - new_mask == NSBorderlessWindowMask) + else if (old_mask != GDK_QUARTZ_BORDERLESS_WINDOW && + new_mask == GDK_QUARTZ_BORDERLESS_WINDOW) { rect = [NSWindow contentRectForFrameRect:rect styleMask:old_mask]; } @@ -2400,13 +2399,14 @@ gdk_quartz_window_set_decorations (GdkWindow *window, [(id)impl->toplevel setStyleMask:new_mask]; - /* It appears that unsetting and then resetting NSTitledWindowMask - * does not reset the title in the title bar as might be expected. + /* It appears that unsetting and then resetting + * GDK_QUARTZ_TITLED_WINDOW does not reset the title in the + * title bar as might be expected. * * In theory we only need to set this if new_mask includes - * NSTitledWindowMask. This behaved extremely oddly when + * GDK_QUARTZ_TITLED_WINDOW. This behaved extremely oddly when * conditionalized upon that and since it has no side effects (i.e. - * if NSTitledWindowMask is not requested, the title will not be + * if GDK_QUARTZ_TITLED_WINDOW is not requested, the title will not be * displayed) just do it unconditionally. We also must null check * 'title' before setting it to avoid crashing. */ @@ -2439,7 +2439,7 @@ gdk_quartz_window_set_decorations (GdkWindow *window, [impl->toplevel setContentView:old_view]; } - if (new_mask == NSBorderlessWindowMask) + if (new_mask == GDK_QUARTZ_BORDERLESS_WINDOW) { [impl->toplevel setContentSize:rect.size]; [impl->toplevel setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary]; @@ -2474,7 +2474,7 @@ gdk_quartz_window_get_decorations (GdkWindow *window, if (decorations) { /* Borderless is 0, so we can't check it as a bit being set. */ - if ([impl->toplevel styleMask] == NSBorderlessWindowMask) + if ([impl->toplevel styleMask] == GDK_QUARTZ_BORDERLESS_WINDOW) { *decorations = 0; } @@ -2517,19 +2517,19 @@ gdk_quartz_window_set_functions (GdkWindow *window, NSUInteger mask = [impl->toplevel styleMask]; if (min) - mask = mask | NSMiniaturizableWindowMask; + mask = mask | GDK_QUARTZ_MINIATURIZABLE_WINDOW; else - mask = mask & ~NSMiniaturizableWindowMask; + mask = mask & ~GDK_QUARTZ_MINIATURIZABLE_WINDOW; if (max) - mask = mask | NSResizableWindowMask; + mask = mask | GDK_QUARTZ_RESIZABLE_WINDOW; else - mask = mask & ~NSResizableWindowMask; + mask = mask & ~GDK_QUARTZ_RESIZABLE_WINDOW; if (close) - mask = mask | NSClosableWindowMask; + mask = mask | GDK_QUARTZ_CLOSABLE_WINDOW; else - mask = mask & ~NSClosableWindowMask; + mask = mask & ~GDK_QUARTZ_CLOSABLE_WINDOW; [impl->toplevel setStyleMask:mask]; } @@ -2662,7 +2662,7 @@ window_is_fullscreen (GdkWindow *window) { GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl); - return ([impl->toplevel styleMask] & NSFullScreenWindowMask) != 0; + return ([impl->toplevel styleMask] & GDK_QUARTZ_FULLSCREEN_WINDOW) != 0; } static void @@ -2838,31 +2838,26 @@ gdk_quartz_window_set_keep_below (GdkWindow *window, [impl->toplevel setLevel: level - (setting ? 1 : 0)]; } +/* X11 "feature" not useful in other backends. */ static GdkWindow * gdk_quartz_window_get_group (GdkWindow *window) { - g_return_val_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD, NULL); - - if (GDK_WINDOW_DESTROYED (window) || - !WINDOW_IS_TOPLEVEL (window)) return NULL; - - /* FIXME: Implement */ - - return NULL; } +/* X11 "feature" not useful in other backends. */ static void gdk_quartz_window_set_group (GdkWindow *window, GdkWindow *leader) { - /* FIXME: Implement */ } static void gdk_quartz_window_destroy_notify (GdkWindow *window) { - check_grab_destroy (window); + GdkDisplay *display = gdk_window_get_display (window); + GdkSeat *seat = gdk_display_get_default_seat (display); + gdk_seat_ungrab (seat); } static void @@ -3108,7 +3103,7 @@ gdk_root_window_impl_quartz_get_context (GdkWindowImplQuartz *window, colorspace = CGColorSpaceCreateWithName (kCGColorSpaceGenericRGB); cg_context = CGBitmapContextCreate (NULL, 1, 1, 8, 4, colorspace, - kCGImageAlphaPremultipliedLast); + (CGBitmapInfo)kCGImageAlphaPremultipliedLast); CGColorSpaceRelease (colorspace); return cg_context; diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c index bc273ce59c..43c3897ded 100644 --- a/gtk/gtkicontheme.c +++ b/gtk/gtkicontheme.c @@ -1031,11 +1031,12 @@ void gtk_icon_theme_add_resource_path (GtkIconTheme *icon_theme, const gchar *path) { - GtkIconThemePrivate *priv = icon_theme->priv; + GtkIconThemePrivate *priv = NULL; g_return_if_fail (GTK_IS_ICON_THEME (icon_theme)); g_return_if_fail (path != NULL); + priv = icon_theme->priv; priv->resource_paths = g_list_append (priv->resource_paths, g_strdup (path)); do_theme_change (icon_theme); diff --git a/gtk/gtkstyleproviderprivate.c b/gtk/gtkstyleproviderprivate.c index 8779f1e57d..cb1b269b17 100644 --- a/gtk/gtkstyleproviderprivate.c +++ b/gtk/gtkstyleproviderprivate.c @@ -118,7 +118,7 @@ _gtk_style_provider_private_get_settings (GtkStyleProviderPrivate *provider) { GtkStyleProviderPrivateInterface *iface; - gtk_internal_return_val_if_fail (GTK_IS_STYLE_PROVIDER_PRIVATE (provider), NULL); + g_return_val_if_fail (GTK_IS_STYLE_PROVIDER_PRIVATE (provider), NULL); iface = GTK_STYLE_PROVIDER_PRIVATE_GET_INTERFACE (provider);