From 2b1c3fba9688226caa4cb6e8ab1db2efb20af688 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Sat, 17 Nov 2018 09:46:21 +0900 Subject: [PATCH 01/19] Reorder virtual method assignments and fill in missing ones. Makes auditing easier. --- gdk/quartz/gdkdisplay-quartz.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/gdk/quartz/gdkdisplay-quartz.c b/gdk/quartz/gdkdisplay-quartz.c index d7066548133..a8c5e2b0dfe 100644 --- a/gdk/quartz/gdkdisplay-quartz.c +++ b/gdk/quartz/gdkdisplay-quartz.c @@ -262,24 +262,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->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_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->get_app_launch_context = NULL; /* FIXME */ 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 +292,23 @@ 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 = NULL; /* FIXME */ + display_class->pop_error_trap = NULL; /* FIXME */ + 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; /* FIXME */ 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 = NULL; /* FIXME */ + 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 = NULL; /* FIXME */ ProcessSerialNumber psn = { 0, kCurrentProcess }; -- GitLab From 74aecac6fe4b69b4a5f53e7f7a843d920a5133fb Mon Sep 17 00:00:00 2001 From: John Ralls Date: Sat, 17 Nov 2018 09:46:55 +0900 Subject: [PATCH 02/19] Remove commented-out code copied from X11 implementation. --- gdk/quartz/gdkdisplay-quartz.h | 122 --------------------------------- 1 file changed, 122 deletions(-) diff --git a/gdk/quartz/gdkdisplay-quartz.h b/gdk/quartz/gdkdisplay-quartz.h index 44d4ec6cd4a..61151d9508b 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;*/ }; 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__ */ -- GitLab From 4d0cae4468e111c29b2a5b393b4188d417e2e270 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 3 Dec 2018 21:03:34 +0900 Subject: [PATCH 03/19] Replace convertBaseToScreen & convertScreenToBase. With convertPointToScreen & convertPointFromScreen when MacOS version is > =10.7, when the earlier functions were deprecated and replaced. --- gdk/quartz/GdkQuartzNSWindow.c | 50 ++++++++++++++++++++++++++++++++-- gdk/quartz/GdkQuartzNSWindow.h | 5 +++- gdk/quartz/gdkevents-quartz.c | 19 +++++++++---- 3 files changed, 65 insertions(+), 9 deletions(-) diff --git a/gdk/quartz/GdkQuartzNSWindow.c b/gdk/quartz/GdkQuartzNSWindow.c index c66fea73c85..2ef40f86fb7 100644 --- a/gdk/quartz/GdkQuartzNSWindow.c +++ b/gdk/quartz/GdkQuartzNSWindow.c @@ -366,6 +366,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 +394,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 +429,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 +450,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 +539,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 } @@ -647,7 +679,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 +713,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; diff --git a/gdk/quartz/GdkQuartzNSWindow.h b/gdk/quartz/GdkQuartzNSWindow.h index b8edf43e697..45d1d67196f 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/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c index 01a400889ae..fa64af49579 100644 --- a/gdk/quartz/gdkevents-quartz.c +++ b/gdk/quartz/gdkevents-quartz.c @@ -394,12 +394,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; } @@ -413,6 +416,8 @@ is_mouse_button_press_event (NSEventType type) case NSRightMouseDown: case NSOtherMouseDown: return TRUE; + default: + return FALSE; } return FALSE; @@ -473,8 +478,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; } -- GitLab From 6ac81545ef9763062a209466c89d1975fae925aa Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 3 Dec 2018 21:13:15 +0900 Subject: [PATCH 04/19] Prevent crash from passing NULL style provider. gtk_internal_return_val_if_fail operates only in debug mode, quartz can call this with a NULL that crashes in GTK_STYLE_PROVIDER_PRIVATE_GET_INTERFACE. --- gtk/gtkstyleproviderprivate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk/gtkstyleproviderprivate.c b/gtk/gtkstyleproviderprivate.c index 8779f1e57d2..cb1b269b17d 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); -- GitLab From cf279a14fa454572b43f7e2284712d277dd725bb Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 3 Dec 2018 21:14:25 +0900 Subject: [PATCH 05/19] Don't attempt to dereference icon_theme until after checking it. --- gtk/gtkicontheme.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c index bc273ce59cf..43c3897ded9 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); -- GitLab From 28b8bbda455e8d4dae8349fbdbc324d7f5a6d869 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 3 Dec 2018 21:22:19 +0900 Subject: [PATCH 06/19] Implement the GdkMonitor/GdkDisplay API. Moving the initialization of the GdkQuartzMonitors to GdkQuartzDisplay from the now-obsolete GdkQuartzScreen. Use QuartzDisplayServices for monitor enumeration and to populate the GdkMonitor properties. This is better aligned with acting on the Quartz Services callbacks for monitor changes and with Cairo which also uses CoreGraphics for drawing. --- gdk/quartz/gdkdisplay-quartz.c | 83 +++++++++++++++++++++++++++++----- gdk/quartz/gdkdisplay-quartz.h | 2 +- gdk/quartz/gdkmonitor-quartz.h | 1 - gdk/quartz/gdkscreen-quartz.c | 17 +------ 4 files changed, 74 insertions(+), 29 deletions(-) diff --git a/gdk/quartz/gdkdisplay-quartz.c b/gdk/quartz/gdkdisplay-quartz.c index a8c5e2b0dfe..6e1bc33bdc2 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" @@ -189,23 +190,50 @@ gdk_quartz_display_notify_startup_complete (GdkDisplay *display, /* FIXME: Implement? */ } +/* 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. + */ + static int gdk_quartz_display_get_n_monitors (GdkDisplay *display) { - GdkQuartzDisplay *quartz_display = GDK_QUARTZ_DISPLAY (display); + int n; - return quartz_display->monitors->len; -} + GDK_QUARTZ_ALLOC_POOL; + n = [[NSScreen screens] count]; + + GDK_QUARTZ_RELEASE_POOL; + + return n; +} static GdkMonitor * gdk_quartz_display_get_monitor (GdkDisplay *display, int monitor_num) { GdkQuartzDisplay *quartz_display = GDK_QUARTZ_DISPLAY (display); + NSArray* screens; + NSScreen *screen = NULL; + CGDirectDisplayID id = 0; + + GDK_QUARTZ_ALLOC_POOL; - if (0 <= monitor_num || monitor_num < quartz_display->monitors->len) - return (GdkMonitor *)quartz_display->monitors->pdata[monitor_num]; + screens = [NSScreen screens]; + if (monitor_num >= 0 && monitor_num < [screens count]) + { + screen = [screens objectAtIndex:monitor_num]; + id = [[[screen deviceDescription] valueForKey: @"NSScreenNumber"] unsignedIntValue]; + } + + GDK_QUARTZ_RELEASE_POOL; + + if (id) + return g_hash_table_lookup (quartz_display->monitors, GINT_TO_POINTER (id)); return NULL; } @@ -214,8 +242,10 @@ 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)); } G_DEFINE_TYPE (GdkQuartzDisplay, gdk_quartz_display, GDK_TYPE_DISPLAY) @@ -223,11 +253,40 @@ G_DEFINE_TYPE (GdkQuartzDisplay, gdk_quartz_display, GDK_TYPE_DISPLAY) static void gdk_quartz_display_init (GdkQuartzDisplay *display) { - GDK_QUARTZ_ALLOC_POOL; - - display->monitors = g_ptr_array_new_with_free_func (g_object_unref); - - GDK_QUARTZ_RELEASE_POOL; + uint32_t max_displays = 0, disp; + CGDirectDisplayID *displays; + 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) + { + CGSize disp_size = CGDisplayScreenSize (displays[disp]); + gint width = (int)trunc (disp_size.width); + gint height = (int)trunc (disp_size.height); + CGRect disp_bounds = CGDisplayBounds (displays[disp]); + 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 (displays[disp]); + gint refresh_rate = (int)trunc (CGDisplayModeGetRefreshRate (mode)); + GdkQuartzMonitor *quartz_monitor = g_object_new (GDK_TYPE_QUARTZ_MONITOR, + "display", display, NULL); + GdkMonitor *monitor = GDK_MONITOR (quartz_monitor); + + 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; + + g_hash_table_insert (display->monitors, GINT_TO_POINTER (displays[disp]), + monitor); + CGDisplayModeRelease (mode); + } } static void @@ -235,7 +294,7 @@ 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); G_OBJECT_CLASS (gdk_quartz_display_parent_class)->dispose (object); } diff --git a/gdk/quartz/gdkdisplay-quartz.h b/gdk/quartz/gdkdisplay-quartz.h index 61151d9508b..c256d7bca5f 100644 --- a/gdk/quartz/gdkdisplay-quartz.h +++ b/gdk/quartz/gdkdisplay-quartz.h @@ -32,7 +32,7 @@ G_BEGIN_DECLS struct _GdkQuartzDisplay { GdkDisplay parent_instance; - GPtrArray *monitors; + GHashTable *monitors; }; struct _GdkQuartzDisplayClass diff --git a/gdk/quartz/gdkmonitor-quartz.h b/gdk/quartz/gdkmonitor-quartz.h index 468a1d8f96d..0f9a823211d 100644 --- a/gdk/quartz/gdkmonitor-quartz.h +++ b/gdk/quartz/gdkmonitor-quartz.h @@ -29,7 +29,6 @@ struct _GdkQuartzMonitor { GdkMonitor parent; - gint monitor_num; }; diff --git a/gdk/quartz/gdkscreen-quartz.c b/gdk/quartz/gdkscreen-quartz.c index cea9c4cba79..65f79a5cfb0 100644 --- a/gdk/quartz/gdkscreen-quartz.c +++ b/gdk/quartz/gdkscreen-quartz.c @@ -131,10 +131,6 @@ gdk_quartz_screen_calculate_layout (GdkQuartzScreen *screen) int i; 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; @@ -152,10 +148,7 @@ gdk_quartz_screen_calculate_layout (GdkQuartzScreen *screen) */ for (i = 0; i < [array count]; i++) { - GdkQuartzMonitor *monitor = g_object_new (GDK_TYPE_QUARTZ_MONITOR, - "display", display, - NULL); - g_ptr_array_add (display_quartz->monitors, monitor); + GdkQuartzMonitor *monitor = gdk_display_get_monitor (display, i); monitor->monitor_num = i; NSRect rect = [[array objectAtIndex:i] frame]; @@ -176,7 +169,7 @@ gdk_quartz_screen_calculate_layout (GdkQuartzScreen *screen) NSRect rect; GdkMonitor *monitor; - monitor = GDK_MONITOR(display_quartz->monitors->pdata[i]); + monitor = gdk_display_get_monitor (display, i); nsscreen = [array objectAtIndex:i]; rect = [nsscreen frame]; @@ -189,12 +182,6 @@ gdk_quartz_screen_calculate_layout (GdkQuartzScreen *screen) 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; -- GitLab From 08b871fa51eae7b73529768e1bcb21587cfb4393 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 3 Dec 2018 21:24:03 +0900 Subject: [PATCH 07/19] Replace the deprecated GdkDisplayManager with GdkSeat. --- gdk/quartz/GdkQuartzNSWindow.c | 8 +- gdk/quartz/gdkdevice-core-quartz.c | 2 +- gdk/quartz/gdkdevicemanager-core-quartz.c | 1 + gdk/quartz/gdkdisplaymanager-quartz.c | 1 - gdk/quartz/gdkevents-quartz.c | 121 ++++++++-------------- gdk/quartz/gdkwindow-quartz.c | 59 ++--------- 6 files changed, 60 insertions(+), 132 deletions(-) diff --git a/gdk/quartz/GdkQuartzNSWindow.c b/gdk/quartz/GdkQuartzNSWindow.c index 2ef40f86fb7..b311f634c4b 100644 --- a/gdk/quartz/GdkQuartzNSWindow.c +++ b/gdk/quartz/GdkQuartzNSWindow.c @@ -610,7 +610,7 @@ update_context_from_dragging_info (id sender) - (NSDragOperation)draggingEntered:(id )sender { - GdkDeviceManager *device_manager; + GdkSeat *seat = NULL; GdkEvent *event; GdkWindow *window; @@ -624,10 +624,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; diff --git a/gdk/quartz/gdkdevice-core-quartz.c b/gdk/quartz/gdkdevice-core-quartz.c index 6fc17aa7d1b..8ba62c0ae08 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 932528aae11..d4756863c59 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/gdkdisplaymanager-quartz.c b/gdk/quartz/gdkdisplaymanager-quartz.c index 2058fcfda60..fdcb72f7118 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/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c index fa64af49579..00df2dc40c4 100644 --- a/gdk/quartz/gdkevents-quartz.c +++ b/gdk/quartz/gdkevents-quartz.c @@ -128,27 +128,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 @@ -511,15 +492,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; } @@ -531,7 +512,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; @@ -553,9 +535,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); } @@ -632,8 +613,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); @@ -660,24 +642,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) { @@ -701,11 +679,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: @@ -718,7 +698,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 @@ -880,7 +860,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; @@ -895,9 +875,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? */ } @@ -930,9 +909,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; @@ -945,7 +922,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]) { @@ -1024,7 +1001,7 @@ 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 (); @@ -1059,9 +1036,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 @@ -1073,7 +1050,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; @@ -1086,9 +1063,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 @@ -1103,11 +1079,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; @@ -1118,10 +1093,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 @@ -1131,7 +1106,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; @@ -1147,13 +1122,12 @@ fill_key_event (GdkWindow *window, event->key.group = ([nsevent modifierFlags] & NSAlternateKeyMask) ? 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); @@ -1305,7 +1279,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; @@ -1314,9 +1288,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); } @@ -1563,16 +1537,13 @@ 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: diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index 858444b2bb0..f018e544df3 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -170,58 +170,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); @@ -1147,6 +1103,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 +1113,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); @@ -2862,7 +2819,9 @@ gdk_quartz_window_set_group (GdkWindow *window, 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 -- GitLab From 85f52dceaa8ab71c3d00d2518c819a957cae946f Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 3 Dec 2018 21:25:38 +0900 Subject: [PATCH 08/19] Replace NSInputManager for MacOS 10.6 and later. --- gdk/quartz/GdkQuartzView.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gdk/quartz/GdkQuartzView.c b/gdk/quartz/GdkQuartzView.c index 7237363f75e..88485fc2c5e 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" @@ -201,8 +202,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 { -- GitLab From 9773b1951c4b1cea687343b568e2c119c456fbe4 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 3 Dec 2018 21:26:39 +0900 Subject: [PATCH 09/19] Clean up some unused variables. --- gdk/quartz/GdkQuartzNSWindow.c | 10 +++++----- gdk/quartz/GdkQuartzView.c | 3 --- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/gdk/quartz/GdkQuartzNSWindow.c b/gdk/quartz/GdkQuartzNSWindow.c index b311f634c4b..becf325b83a 100644 --- a/gdk/quartz/GdkQuartzNSWindow.c +++ b/gdk/quartz/GdkQuartzNSWindow.c @@ -189,7 +189,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 +219,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 +254,11 @@ [self checkSendEnterNotify]; } --(id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag screen:(NSScreen *)screen +-(id)initWithContentRect:(NSRect)contentRect + styleMask:(NSWindowStyleMask)styleMask + backing:(NSBackingStoreType)backingType + defer:(BOOL)flag + screen:(NSScreen *)screen { self = [super initWithContentRect:contentRect styleMask:styleMask @@ -842,7 +844,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) @@ -856,7 +857,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/GdkQuartzView.c b/gdk/quartz/GdkQuartzView.c index 88485fc2c5e..684832f7a7a 100644 --- a/gdk/quartz/GdkQuartzView.c +++ b/gdk/quartz/GdkQuartzView.c @@ -124,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); @@ -134,7 +133,6 @@ { GDK_NOTE (EVENTS, g_message ("setMarkedText")); const char *str; - gchar *prev_str; if (replacementRange.location == NSNotFound) { @@ -184,7 +182,6 @@ GDK_NOTE (EVENTS, g_message ("insertText")); const char *str; NSString *string; - gchar *prev_str; if ([self hasMarkedText]) [self unmarkText]; -- GitLab From 941f3c3887da63eb5040fc932912ebbb2ca6a7c2 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Wed, 21 Nov 2018 21:32:41 +0900 Subject: [PATCH 10/19] Move the CGDisplayReconfigurationCallback to gdkdisplay-quartz.c. Handling more flags, handling them correctly, and emitting the requisite signals. Change screen layout to use CGGetActiveDisplayList instead of NSScreens, eliminating the latency between updating screens and recomputing the root window. --- gdk/quartz/gdkdisplay-quartz.c | 167 ++++++++++++++++++++++++--------- gdk/quartz/gdkmonitor-quartz.h | 2 +- gdk/quartz/gdkscreen-quartz.c | 150 +++++------------------------ gdk/quartz/gdkscreen-quartz.h | 2 + 4 files changed, 148 insertions(+), 173 deletions(-) diff --git a/gdk/quartz/gdkdisplay-quartz.c b/gdk/quartz/gdkdisplay-quartz.c index 6e1bc33bdc2..abd6a660c8c 100644 --- a/gdk/quartz/gdkdisplay-quartz.c +++ b/gdk/quartz/gdkdisplay-quartz.c @@ -30,7 +30,13 @@ #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) @@ -198,18 +204,92 @@ gdk_quartz_display_notify_startup_complete (GdkDisplay *display, the same for determining the number of monitors and indexing them. */ -static int -gdk_quartz_display_get_n_monitors (GdkDisplay *display) +int +get_active_displays (CGDirectDisplayID **screens) { - int n; + unsigned int displays = 0; - GDK_QUARTZ_ALLOC_POOL; + CGGetActiveDisplayList (0, NULL, &displays); + if (screens) + { + *screens = g_new0 (CGDirectDisplayID, displays); + CGGetActiveDisplayList (displays, *screens, &displays); + } - n = [[NSScreen screens] count]; + return displays; +} - GDK_QUARTZ_RELEASE_POOL; +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); +} - return n; +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) +{ + return get_active_displays (NULL); } static GdkMonitor * @@ -217,23 +297,13 @@ gdk_quartz_display_get_monitor (GdkDisplay *display, int monitor_num) { GdkQuartzDisplay *quartz_display = GDK_QUARTZ_DISPLAY (display); - NSArray* screens; - NSScreen *screen = NULL; - CGDirectDisplayID id = 0; - - GDK_QUARTZ_ALLOC_POOL; + CGDirectDisplayID *screens = NULL; - screens = [NSScreen screens]; - if (monitor_num >= 0 && monitor_num < [screens count]) - { - screen = [screens objectAtIndex:monitor_num]; - id = [[[screen deviceDescription] valueForKey: @"NSScreenNumber"] unsignedIntValue]; - } + int count = get_active_displays (&screens); - GDK_QUARTZ_RELEASE_POOL; - - if (id) - return g_hash_table_lookup (quartz_display->monitors, GINT_TO_POINTER (id)); + if (monitor_num >= 0 && monitor_num < count) + return g_hash_table_lookup (quartz_display->monitors, + GINT_TO_POINTER (screens[monitor_num])); return NULL; } @@ -255,6 +325,7 @@ gdk_quartz_display_init (GdkQuartzDisplay *display) { uint32_t max_displays = 0, disp; CGDirectDisplayID *displays; + CGGetActiveDisplayList (0, NULL, &max_displays); display->monitors = g_hash_table_new_full (g_direct_hash, NULL, NULL, g_object_unref); @@ -262,31 +333,16 @@ gdk_quartz_display_init (GdkQuartzDisplay *display) CGGetActiveDisplayList (max_displays, displays, &max_displays); for (disp = 0; disp < max_displays; ++disp) { - CGSize disp_size = CGDisplayScreenSize (displays[disp]); - gint width = (int)trunc (disp_size.width); - gint height = (int)trunc (disp_size.height); - CGRect disp_bounds = CGDisplayBounds (displays[disp]); - 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 (displays[disp]); - gint refresh_rate = (int)trunc (CGDisplayModeGetRefreshRate (mode)); - GdkQuartzMonitor *quartz_monitor = g_object_new (GDK_TYPE_QUARTZ_MONITOR, + GdkQuartzMonitor *monitor = g_object_new (GDK_TYPE_QUARTZ_MONITOR, "display", display, NULL); - GdkMonitor *monitor = GDK_MONITOR (quartz_monitor); - - 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; - - g_hash_table_insert (display->monitors, GINT_TO_POINTER (displays[disp]), + monitor->id = displays[disp]; + g_hash_table_insert (display->monitors, GINT_TO_POINTER (monitor->id), monitor); - CGDisplayModeRelease (mode); + configure_monitor (GDK_MONITOR (monitor)); } + CGDisplayRegisterReconfigurationCallback (display_reconfiguration_callback, + display); + g_signal_emit (display, MONITORS_CHANGED, 0); } static void @@ -295,6 +351,8 @@ gdk_quartz_display_dispose (GObject *object) GdkQuartzDisplay *display_quartz = GDK_QUARTZ_DISPLAY (object); g_hash_table_destroy (display_quartz->monitors); + CGDisplayRemoveReconfigurationCallback (display_reconfiguration_callback, + display_quartz); G_OBJECT_CLASS (gdk_quartz_display_parent_class)->dispose (object); } @@ -362,13 +420,32 @@ gdk_quartz_display_class_init (GdkQuartzDisplayClass *class) 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 = NULL; /* FIXME */ +/* 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 = NULL; /* FIXME */ + /** + * 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 }; /* Make the current process a foreground application, i.e. an app diff --git a/gdk/quartz/gdkmonitor-quartz.h b/gdk/quartz/gdkmonitor-quartz.h index 0f9a823211d..75dc9c8b125 100644 --- a/gdk/quartz/gdkmonitor-quartz.h +++ b/gdk/quartz/gdkmonitor-quartz.h @@ -30,6 +30,7 @@ struct _GdkQuartzMonitor { GdkMonitor parent; gint monitor_num; + CGDirectDisplayID id; }; struct _GdkQuartzMonitorClass { @@ -37,4 +38,3 @@ struct _GdkQuartzMonitorClass { }; #endif - diff --git a/gdk/quartz/gdkscreen-quartz.c b/gdk/quartz/gdkscreen-quartz.c index 65f79a5cfb0..cd9d6649cb5 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,64 +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)); - 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 = gdk_display_get_monitor (display, i); - 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_display_get_monitor (display, 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; - } - - GDK_QUARTZ_RELEASE_POOL; } void @@ -223,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; @@ -245,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) { @@ -325,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) { @@ -356,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 5a1cfa33987..99c2c4fe88f 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; -- GitLab From f30ed5ddc75ef7fe4d6c1f05cb87fc2b1502aabc Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 3 Dec 2018 21:06:41 +0900 Subject: [PATCH 11/19] Fix Cocoa style and event constants for MacOS X 10.12 and later. --- gdk/quartz/GdkQuartzNSWindow.c | 27 ++++- gdk/quartz/gdkeventloop-quartz.c | 18 +++- gdk/quartz/gdkevents-quartz.c | 165 ++++++++++++++++--------------- gdk/quartz/gdkkeys-quartz.c | 24 ++--- gdk/quartz/gdkquartzkeys.h | 73 ++++++++++++++ gdk/quartz/gdkselection-quartz.c | 28 ++++-- gdk/quartz/gdkwindow-quartz.c | 81 ++++++++++----- 7 files changed, 285 insertions(+), 131 deletions(-) diff --git a/gdk/quartz/GdkQuartzNSWindow.c b/gdk/quartz/GdkQuartzNSWindow.c index becf325b83a..6c8f233cf77 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]) @@ -255,7 +262,11 @@ } -(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 @@ -805,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]); diff --git a/gdk/quartz/gdkeventloop-quartz.c b/gdk/quartz/gdkeventloop-quartz.c index c20563931fa..3f3b033242a 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 00df2dc40c4..952d4a81896 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 @@ -270,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; @@ -296,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; @@ -337,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)) { @@ -355,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: @@ -393,9 +394,9 @@ 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; @@ -755,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; @@ -810,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. */ @@ -835,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: @@ -1008,16 +1009,16 @@ fill_button_event (GdkWindow *window, 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; @@ -1119,7 +1120,7 @@ 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; gdk_event_set_device (event, gdk_seat_get_keyboard (seat)); @@ -1239,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. @@ -1255,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; @@ -1342,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; @@ -1386,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 || @@ -1399,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) @@ -1414,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 @@ -1452,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, @@ -1523,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); @@ -1546,23 +1555,23 @@ gdk_event_translate (GdkEvent *event, } 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; @@ -1639,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/gdkkeys-quartz.c b/gdk/quartz/gdkkeys-quartz.c index f9857831c99..aff299eee89 100644 --- a/gdk/quartz/gdkkeys-quartz.c +++ b/gdk/quartz/gdkkeys-quartz.c @@ -124,15 +124,15 @@ const static struct { 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 +783,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/gdkquartzkeys.h b/gdk/quartz/gdkquartzkeys.h index f35612e36ae..c937288b45d 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/gdkselection-quartz.c b/gdk/quartz/gdkselection-quartz.c index c6014a25795..22ad16a3e5f 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 f018e544df3..1d200ecab9b 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); @@ -509,7 +530,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]; @@ -836,14 +861,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 @@ -1583,7 +1608,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, @@ -2310,13 +2335,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; @@ -2334,14 +2360,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]; } @@ -2357,13 +2383,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. */ @@ -2396,7 +2423,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]; @@ -2431,7 +2458,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; } @@ -2474,19 +2501,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]; } @@ -2619,7 +2646,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 -- GitLab From ca6db9a79da13a7329c1e97e1334421418a58630 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Fri, 23 Nov 2018 09:46:28 +0900 Subject: [PATCH 12/19] Add compile-time check for NSGraphicsContext graphicsPort/CGContext. Runtime check alone doesn't silence warning. --- gdk/quartz/gdkwindow-quartz.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index 1d200ecab9b..47857156e88 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -141,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)) @@ -158,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); -- GitLab From 1165ab9d27574445489b21ed9beb4b8a7f872907 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Fri, 23 Nov 2018 10:23:02 +0900 Subject: [PATCH 13/19] Replace deprecated gestalt for 10.10 and later. It was deprecated in 10.8 but no replacement until 10.10. --- gdk/quartz/gdkglobals-quartz.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gdk/quartz/gdkglobals-quartz.c b/gdk/quartz/gdkglobals-quartz.c index efcf73c3911..81cd4632e81 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) -- GitLab From eb2799cd7a8c50b358bb1e3b8f1c91f00d810cf6 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Fri, 23 Nov 2018 17:12:10 +0900 Subject: [PATCH 14/19] Make _gdk_quartz_window_flush a no-op for MacOS 10.14 and later. According to Apple's docs it's no longer necessary as Cocoa will notice any changes and call drawRect as needed. --- gdk/quartz/gdkwindow-quartz.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index 47857156e88..33779073cd5 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -221,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; @@ -250,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; @@ -380,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. */ @@ -390,6 +395,7 @@ _gdk_quartz_window_process_updates_recurse (GdkWindow *window, [nswindow disableFlushWindow]; update_nswindows = g_slist_prepend (update_nswindows, nswindow); } +#endif } } @@ -413,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 @@ -434,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; @@ -450,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 * -- GitLab From 89c8c55fdaaa573d824450610dc30df97a3f6495 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Fri, 23 Nov 2018 17:34:45 +0900 Subject: [PATCH 15/19] Remove 2 unused functions. --- gdk/quartz/gdkkeys-quartz.c | 32 -------------------------------- gdk/quartz/gdkproperty-quartz.c | 20 -------------------- 2 files changed, 52 deletions(-) diff --git a/gdk/quartz/gdkkeys-quartz.c b/gdk/quartz/gdkkeys-quartz.c index aff299eee89..f646372fe01 100644 --- a/gdk/quartz/gdkkeys-quartz.c +++ b/gdk/quartz/gdkkeys-quartz.c @@ -87,38 +87,6 @@ _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; diff --git a/gdk/quartz/gdkproperty-quartz.c b/gdk/quartz/gdkproperty-quartz.c index cfc62a389cd..82b1e473db2 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) -- GitLab From e786da9ca9bed9db24177369bf4caf66fd50081c Mon Sep 17 00:00:00 2001 From: John Ralls Date: Sun, 25 Nov 2018 11:42:34 +0900 Subject: [PATCH 16/19] Complete GdkQuartzDisplay Implementation. Changing FIXME on unneeded functions to X11-only where appropriate. --- gdk/quartz/gdkdisplay-quartz.c | 70 ++++++++++++++++++++++++---------- gdk/quartz/gdkwindow-quartz.c | 11 +----- 2 files changed, 51 insertions(+), 30 deletions(-) diff --git a/gdk/quartz/gdkdisplay-quartz.c b/gdk/quartz/gdkdisplay-quartz.c index abd6a660c8c..a342b88ff23 100644 --- a/gdk/quartz/gdkdisplay-quartz.c +++ b/gdk/quartz/gdkdisplay-quartz.c @@ -41,10 +41,7 @@ static void display_reconfiguration_callback (CGDirectDisplayID displ 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; } @@ -117,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; } @@ -172,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; } @@ -193,7 +191,24 @@ 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 @@ -318,6 +333,19 @@ gdk_quartz_display_get_primary_monitor (GdkDisplay *display) 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) static void @@ -400,7 +428,7 @@ gdk_quartz_display_class_init (GdkQuartzDisplayClass *class) 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; /* FIXME */ + /* 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; @@ -409,12 +437,12 @@ 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 = NULL; /* FIXME */ - display_class->pop_error_trap = NULL; /* FIXME */ + 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; /* FIXME */ + 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; @@ -425,7 +453,7 @@ gdk_quartz_display_class_init (GdkQuartzDisplayClass *class) 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 = NULL; /* FIXME */ + display_class->get_monitor_at_window = gdk_quartz_display_get_monitor_at_window; /** * GdkQuartzDisplay::monitors-changed: diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index 33779073cd5..9bb10bd20a4 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -2838,25 +2838,18 @@ 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 -- GitLab From 5294c4f6f33c8071d9c948752c4e3bd728746890 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 26 Nov 2018 09:51:36 +0900 Subject: [PATCH 17/19] Fix crash if there are no grabs in place. --- gdk/gdkdisplay.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 40225e92ac5..1845e80de38 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -1318,6 +1318,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); -- GitLab From 9e212cd98194f4baddd821e63a2181ec24863fd3 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Mon, 26 Nov 2018 21:38:35 +0900 Subject: [PATCH 18/19] Prevent crash if display->touch_implicit_grabs is NULL. --- gdk/gdkdisplay.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 1845e80de38..06d4187345e 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; -- GitLab From 833ddc6e8d12a3591d1b25093e5d2977c815c246 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Fri, 7 Dec 2018 16:21:10 -0800 Subject: [PATCH 19/19] Silence enum type warning in 10.9. --- gdk/quartz/gdkwindow-quartz.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index 9bb10bd20a4..200c7018a9b 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -3103,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; -- GitLab