diff --git a/lcl/interfaces/gtk2/gtk2extra.inc b/lcl/interfaces/gtk2/gtk2extra.inc index be26002ddc..363ec4985e 100644 --- a/lcl/interfaces/gtk2/gtk2extra.inc +++ b/lcl/interfaces/gtk2/gtk2extra.inc @@ -77,8 +77,11 @@ initialization end; end; gdklibhandle := LoadLibrary(gdklib); - if gdklibhandle <> 0 - then pointer(gdk_window_get_cursor):=GetProcAddress(gdklibhandle,'gdk_window_get_cursor'); + if gdklibhandle <> 0 then + begin + pointer(gdk_window_get_cursor) := GetProcAddress(gdklibhandle,'gdk_window_get_cursor'); + pointer(gdk_screen_get_primary_monitor) := GetProcAddress(gdklibhandle,'gdk_screen_get_primary_monitor'); + end; finalization if gtkhandle <> 0 then diff --git a/lcl/interfaces/gtk2/gtk2extrah.inc b/lcl/interfaces/gtk2/gtk2extrah.inc index eaf393d087..181dc4bac9 100644 --- a/lcl/interfaces/gtk2/gtk2extrah.inc +++ b/lcl/interfaces/gtk2/gtk2extrah.inc @@ -341,6 +341,8 @@ var gtk_window_set_opacity: procedure(window: PGtkWindow; opacity: gdouble); cdecl; g_object_ref_sink: function(anObject: PGObject): gpointer; cdecl; gdk_window_get_cursor: function(window: PGdkWindow): PGdkCursor; cdecl; + // since 2.20 + gdk_screen_get_primary_monitor: function(screen: PGdkScreen): gint; cdecl; // since 2.10 gtk_tree_view_set_grid_lines: procedure(tree_view: PGtkTreeView; grid_lines: TGtkTreeViewGridLines); cdecl; diff --git a/lcl/interfaces/gtk2/gtk2winapi.inc b/lcl/interfaces/gtk2/gtk2winapi.inc index 7a2ce9ad85..fedd69aecf 100644 --- a/lcl/interfaces/gtk2/gtk2winapi.inc +++ b/lcl/interfaces/gtk2/gtk2winapi.inc @@ -4998,11 +4998,21 @@ begin else {$ENDIF} lpmi^.rcWork := lpmi^.rcMonitor; - // gtk uses zero position for primary monitor - if Monitor = 0 then - lpmi^.dwFlags := MONITORINFOF_PRIMARY - else - lpmi^.dwFlags := 0; + // since gtk-2.20 we have correct api to get primary monitor. issue #32464 + if Assigned(gdk_screen_get_primary_monitor) then + begin + if (Monitor = gdk_screen_get_primary_monitor(gdk_screen_get_default)) then + lpmi^.dwFlags := MONITORINFOF_PRIMARY + else + lpmi^.dwFlags := 0; + end else + begin + // gtk2 below 2.20 + if Monitor = 0 then + lpmi^.dwFlags := MONITORINFOF_PRIMARY + else + lpmi^.dwFlags := 0; + end; end; {------------------------------------------------------------------------------