[gtk/gtk-3-24] Switch quartz monitors collection from hash table to ptr array.
- From: John Ralls <jralls src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/gtk-3-24] Switch quartz monitors collection from hash table to ptr array.
- Date: Mon, 11 Mar 2019 23:54:09 +0000 (UTC)
commit 261f1dc395de8f32576e542ebb48523299c47763
Author: John Ralls <jralls ceridwen us>
Date: Sun Feb 24 05:38:24 2019 -0800
Switch quartz monitors collection from hash table to ptr array.
It's easier to find in a ptr array than to iterate over a hash table.
gdk/quartz/gdkdisplay-quartz.c | 111 +++++++++++++++++++++++++++--------------
gdk/quartz/gdkdisplay-quartz.h | 2 +-
2 files changed, 74 insertions(+), 39 deletions(-)
---
diff --git a/gdk/quartz/gdkdisplay-quartz.c b/gdk/quartz/gdkdisplay-quartz.c
index fc81a6de86..cb43636587 100644
--- a/gdk/quartz/gdkdisplay-quartz.c
+++ b/gdk/quartz/gdkdisplay-quartz.c
@@ -342,13 +342,22 @@ display_rect (GdkQuartzDisplay *display)
display->size = NSMakeSize (max_x_mm - min_x_mm, max_y_mm - min_y_mm);
}
+static gboolean
+same_monitor (gconstpointer a, gconstpointer b)
+{
+ GdkQuartzMonitor *mon_a = GDK_QUARTZ_MONITOR (a);
+ CGDirectDisplayID disp_id = (CGDirectDisplayID)GPOINTER_TO_INT (b);
+ if (!mon_a)
+ return FALSE;
+ return mon_a->id == disp_id;
+}
+
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)
@@ -358,28 +367,44 @@ display_reconfiguration_callback (CGDirectDisplayID cg_display,
kCGDisplaySetMainFlag | kCGDisplayDesktopShapeChangedFlag |
kCGDisplayMirrorFlag | kCGDisplayUnMirrorFlag))
{
- monitor = g_hash_table_lookup (display->monitors,
- GINT_TO_POINTER (cg_display));
- if (!monitor)
+ GdkQuartzMonitor *monitor = NULL;
+ guint index;
+
+ if (!g_ptr_array_find_with_equal_func (display->monitors,
+ GINT_TO_POINTER (cg_display),
+ same_monitor,
+ &index))
{
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);
+ g_ptr_array_add (display->monitors, monitor);
gdk_display_monitor_added (GDK_DISPLAY (display),
GDK_MONITOR (monitor));
}
+ else
+ {
+ monitor = g_ptr_array_index (display->monitors, index);
+ }
+
display_rect (display);
configure_monitor (GDK_MONITOR (monitor), display);
}
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));
+ guint index;
+
+ if (g_ptr_array_find_with_equal_func (display->monitors,
+ GINT_TO_POINTER (cg_display),
+ same_monitor,
+ &index))
+ {
+ GdkQuartzMonitor *monitor = g_ptr_array_index (display->monitors,
+ index);
+ gdk_display_monitor_removed (GDK_DISPLAY (display),
+ GDK_MONITOR (monitor));
+ g_ptr_array_remove_fast (display->monitors, monitor);
+ }
}
g_signal_emit (display, MONITORS_CHANGED, 0);
@@ -389,7 +414,8 @@ display_reconfiguration_callback (CGDirectDisplayID cg_display,
static int
gdk_quartz_display_get_n_monitors (GdkDisplay *display)
{
- return get_active_displays (NULL);
+ GdkQuartzDisplay *quartz_display = GDK_QUARTZ_DISPLAY (display);
+ return quartz_display->monitors->len;
}
static GdkMonitor *
@@ -397,16 +423,12 @@ gdk_quartz_display_get_monitor (GdkDisplay *display,
int monitor_num)
{
GdkQuartzDisplay *quartz_display = GDK_QUARTZ_DISPLAY (display);
- CGDirectDisplayID *screens = NULL;
-
- int count = get_active_displays (&screens);
- GdkMonitor *monitor = NULL;
+ int count = gdk_quartz_display_get_n_monitors (display);
if (monitor_num >= 0 && monitor_num < count)
- monitor = g_hash_table_lookup (quartz_display->monitors,
- GINT_TO_POINTER (screens[monitor_num]));
- g_free (screens);
- return monitor;
+ return g_ptr_array_index (quartz_display->monitors, monitor_num);
+
+ return NULL;
}
static GdkMonitor *
@@ -414,9 +436,15 @@ gdk_quartz_display_get_primary_monitor (GdkDisplay *display)
{
GdkQuartzDisplay *quartz_display = GDK_QUARTZ_DISPLAY (display);
CGDirectDisplayID primary_id = CGMainDisplayID ();
+ GdkMonitor *monitor = NULL;
+ guint index;
- return g_hash_table_lookup (quartz_display->monitors,
- GINT_TO_POINTER (primary_id));
+ if (g_ptr_array_find_with_equal_func (quartz_display->monitors,
+ GINT_TO_POINTER (primary_id),
+ same_monitor, &index))
+ monitor = g_ptr_array_index (quartz_display->monitors, index);
+
+ return monitor;
}
static GdkMonitor *
@@ -426,18 +454,27 @@ gdk_quartz_display_get_monitor_at_window (GdkDisplay *display,
GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
NSWindow *nswindow = impl->toplevel;
NSScreen *screen = [nswindow screen];
+ GdkMonitor *monitor = NULL;
if (screen)
{
- CGDirectDisplayID disp_id =
- [[[screen deviceDescription]
- objectForKey: @"NSScreenNumber"] unsignedIntValue];
- return g_hash_table_lookup (GDK_QUARTZ_DISPLAY (display)->monitors,
- GINT_TO_POINTER (disp_id));
+ GdkQuartzDisplay *quartz_display = GDK_QUARTZ_DISPLAY (display);
+ guint index;
+ CGDirectDisplayID disp_id =
+ [[[screen deviceDescription]
+ objectForKey: @"NSScreenNumber"] unsignedIntValue];
+ if (g_ptr_array_find_with_equal_func (quartz_display->monitors,
+ GINT_TO_POINTER (disp_id),
+ same_monitor, &index))
+ monitor = g_ptr_array_index (quartz_display->monitors, index);
}
- GdkRectangle rect = cgrect_to_gdkrect ([nswindow frame]);
- return gdk_display_get_monitor_at_point (display,
- rect.x + rect.width/2,
- rect.y + rect.height /2);
+ if (!monitor)
+ {
+ GdkRectangle rect = cgrect_to_gdkrect ([nswindow frame]);
+ monitor = gdk_display_get_monitor_at_point (display,
+ rect.x + rect.width/2,
+ rect.y + rect.height /2);
+ }
+ return monitor;
}
G_DEFINE_TYPE (GdkQuartzDisplay, gdk_quartz_display, GDK_TYPE_DISPLAY)
@@ -450,15 +487,13 @@ gdk_quartz_display_init (GdkQuartzDisplay *display)
display_rect(display); /* Initialize the overall display coordinates. */
count = get_active_displays (&displays);
- display->monitors = g_hash_table_new_full (g_direct_hash, NULL,
- NULL, g_object_unref);
+ display->monitors = g_ptr_array_new_full (max_displays, g_object_unref);
for (disp = 0; disp < count; ++disp)
{
GdkQuartzMonitor *monitor = g_object_new (GDK_TYPE_QUARTZ_MONITOR,
"display", display, NULL);
monitor->id = displays[disp];
- g_hash_table_insert (display->monitors, GINT_TO_POINTER (monitor->id),
- monitor);
+ g_ptr_array_add (display->monitors, monitor);
configure_monitor (GDK_MONITOR (monitor), display);
}
g_free (displays);
@@ -471,11 +506,11 @@ gdk_quartz_display_init (GdkQuartzDisplay *display)
static void
gdk_quartz_display_dispose (GObject *object)
{
- GdkQuartzDisplay *display_quartz = GDK_QUARTZ_DISPLAY (object);
+ GdkQuartzDisplay *quartz_display = GDK_QUARTZ_DISPLAY (object);
- g_hash_table_destroy (display_quartz->monitors);
+ g_ptr_array_free (quartz_display->monitors, TRUE);
CGDisplayRemoveReconfigurationCallback (display_reconfiguration_callback,
- display_quartz);
+ quartz_display);
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 d539642f1e..c9533a91db 100644
--- a/gdk/quartz/gdkdisplay-quartz.h
+++ b/gdk/quartz/gdkdisplay-quartz.h
@@ -34,7 +34,7 @@ struct _GdkQuartzDisplay
GdkDisplay parent_instance;
NSRect geometry; /* In AppKit coordinates. */
NSSize size; /* Aggregate size of displays in millimeters. */
- GHashTable *monitors;
+ GPtrArray *monitors;
};
struct _GdkQuartzDisplayClass
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]