From 1acfc93cd456b788aad27030ac57b7b832e26231 Mon Sep 17 00:00:00 2001 From: sekelsenmat Date: Fri, 7 Oct 2011 07:11:49 +0000 Subject: [PATCH] Fixes crashes related to GetForegroundWindow by rewrapping the X11 window into a GdkWindow git-svn-id: trunk@32725 - --- lcl/interfaces/gtk2/gtk2int.pas | 2 +- lcl/interfaces/gtk2/gtk2widgetset.inc | 19 +++++++++++-------- lcl/interfaces/gtk2/gtk2winapi.inc | 6 ------ 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/lcl/interfaces/gtk2/gtk2int.pas b/lcl/interfaces/gtk2/gtk2int.pas index c90697aeba..40588c2856 100644 --- a/lcl/interfaces/gtk2/gtk2int.pas +++ b/lcl/interfaces/gtk2/gtk2int.pas @@ -299,7 +299,7 @@ type {$I gtk2lclintfh.inc} public {$IFDEF HASX} - function X11Raise(AHandle: HWND): boolean; + //function X11Raise(AHandle: HWND): boolean; currently not used function X11GetActiveWindow: HWND; {$ENDIF} procedure StartFocusTimer; diff --git a/lcl/interfaces/gtk2/gtk2widgetset.inc b/lcl/interfaces/gtk2/gtk2widgetset.inc index 5123a64be7..ba8916c8ac 100644 --- a/lcl/interfaces/gtk2/gtk2widgetset.inc +++ b/lcl/interfaces/gtk2/gtk2widgetset.inc @@ -4254,7 +4254,7 @@ begin end; {$IFDEF HASX} -function TGtk2WidgetSet.X11Raise(AHandle: HWND): boolean; +{function TGtk2WidgetSet.X11Raise(AHandle: HWND): boolean; var Display: PDisplay; RootWin: TWindow; @@ -4283,12 +4283,12 @@ begin Result:=XSendEvent (Display, RootWin, False, SubstructureRedirectMask or SubstructureNotifyMask, @XClient)<>0; -end; +end;} function TGtk2WidgetSet.X11GetActivewindow: HWND; var Display: PDisplay; - RootWin: TWindow; + RootWin, ResultWindow: TWindow; ScreenNum: Integer; WMAtom: TAtom; ActualTypeReturn: TAtom; @@ -4298,11 +4298,13 @@ var screen: PGdkScreen; Valid: Boolean; begin + Result := 0; + screen:=gdk_screen_get_default; Display := gdk_x11_get_default_xdisplay; - if Display = nil then - exit; + if Display = nil then Exit; + ScreenNum := gdk_screen_get_number(screen); RootWin := gdk_x11_get_default_root_xwindow; WMAtom := XInternAtom(Display,'_NET_ACTIVE_WINDOW', False); @@ -4314,11 +4316,12 @@ begin try if (ActualTypeReturn = None) or (ActualFormatReturn <> 32) or not Assigned(Ptr) then Valid := False; - if Valid then Result := PCardinal(Ptr)^; + if Valid then ResultWindow := PWindow(Ptr)^; finally - if Assigned(Ptr) then - XFree(Ptr); + if Assigned(Ptr) then XFree(Ptr); end; + + if Valid then Result := HWND(gdk_window_foreign_new(ResultWindow)); end; {$ENDIF} {------------------------------------------------------------------------------ diff --git a/lcl/interfaces/gtk2/gtk2winapi.inc b/lcl/interfaces/gtk2/gtk2winapi.inc index 148f7b4836..26ddf4765a 100644 --- a/lcl/interfaces/gtk2/gtk2winapi.inc +++ b/lcl/interfaces/gtk2/gtk2winapi.inc @@ -8323,7 +8323,6 @@ var GdkWindow: PGdkWindow; AForm: TCustomForm; begin - try {$IFDEF VerboseFocus} DbgOut('TGtk2WidgetSet.SetForegroundWindow hWnd=',DbgS(hWnd)); LCLObject:=TControl(GetLCLObject(Pointer(hWnd))); @@ -8370,11 +8369,6 @@ begin gtk_window_present(PGtkWindow(hWnd)); end; end; - except - {$IFDEF HASX} - Result:=X11Raise(hWnd); - {$ENDIF} - end; end; function TGtk2WidgetSet.SetMapMode(DC: HDC; fnMapMode : Integer): Integer;