Gtk2: fixed THintWindow visibility when minimizing application.part of #24363

git-svn-id: trunk@41000 -
This commit is contained in:
zeljko 2013-05-02 12:09:30 +00:00
parent 7446c7f8f3
commit 516dfebcfc
3 changed files with 92 additions and 12 deletions

View File

@ -303,6 +303,9 @@ type
//function X11Raise(AHandle: HWND): boolean; currently not used
function GetWindowManager: String;
function X11GetActiveWindow: HWND;
procedure HideAllHints;
procedure RestoreAllHints;
{$ENDIF}
procedure StartFocusTimer;
property AppActive: Boolean read GetAppActive write SetAppActive;

View File

@ -263,7 +263,7 @@ end;
------------------------------------------------------------------------------}
//TODO: remove ALCLObject when creation splitup is finished
procedure TGtk2WidgetSet._SetCallbackEx(const AMsg: LongInt;
const AGTKObject: PGTKObject; const ALCLObject: TObject; Direct: boolean);
const AGTKObject: PGTKObject; const ALCLObject: TObject; Direct: Boolean);
procedure ConnectSenderSignal(const AnObject:PGTKObject; const ASignal: PChar;
const ACallBackProc: Pointer);
@ -716,8 +716,8 @@ end;
Applies a Message to the sender
------------------------------------------------------------------------------}
procedure TGTK2WidgetSet.SetCallbackEx(const AMsg: LongInt;
const AGTKObject: PGTKObject; const ALCLObject: TObject; Direct: boolean);
procedure TGtk2WidgetSet.SetCallbackEx(const AMsg: LongInt;
const AGTKObject: PGTKObject; const ALCLObject: TObject; Direct: Boolean);
procedure ConnectSenderSignal(const AnObject:PGTKObject; const ASignal: PChar;
const ACallBackProc: Pointer);
@ -909,7 +909,7 @@ end;
MultiSelect, ExtendedSelect: boolean);
------------------------------------------------------------------------------}
procedure TGtk2WidgetSet.SetSelectionMode(Sender: TObject; Widget: PGtkWidget;
MultiSelect, ExtendedSelect: boolean);
MultiSelect, ExtendedSelect: Boolean);
var
AControl: TWinControl;
SelectionMode: TGtkSelectionMode;
@ -930,7 +930,8 @@ begin
end;
end;
procedure TGtk2WidgetSet.SetWidgetFont(const AWidget: PGtkWidget; const AFONT: tFont);
procedure TGtk2WidgetSet.SetWidgetFont(const AWidget: PGtkWidget;
const AFont: TFont);
var
FontDesc: PPangoFontDescription;
UseFont: PPangoLayout;
@ -1079,6 +1080,9 @@ var
WInfo: PWidgetInfo;
begin
if Screen=nil then exit;
{$IFDEF HASX}
HideAllHints;
{$ENDIF}
for i:= 0 to Screen.CustomFormZOrderCount-1 do
begin
AForm := Screen.CustomFormsZOrdered[i];
@ -1110,9 +1114,12 @@ begin
not (AForm.BorderStyle in [bsNone]) then
gtk_window_deiconify({%H-}PGtkWindow(AForm.Handle));
end;
{$IFDEF HASX}
RestoreAllHints;
{$ENDIF}
end;
function TGtk2WidgetSet.GetAppHandle: Thandle;
function TGtk2WidgetSet.GetAppHandle: THandle;
begin
{$ifdef windows}
Result := GetWin32AppHandle;
@ -2214,7 +2221,7 @@ end;
Any system color
}
procedure TGtk2WidgetSet.SetWidgetColor(const AWidget: PGtkWidget;
const FGColor, BGColor: TColor; const Mask: TGtkStateEnum);
const FGColor, BGColor: TColor; const Mask: tGtkStateEnum);
var
i: integer;
xfg, xbg: TGdkColor;
@ -2894,7 +2901,9 @@ begin
{$ifdef DebugGDK}finally EndGDKErrorTrap; end;{$endif}
end;
function TGtk2WidgetSet.RawImage_DescriptionFromDrawable(out ADesc: TRawImageDescription; ADrawable: PGdkDrawable; ACustomAlpha: Boolean): Boolean;
function TGtk2WidgetSet.RawImage_DescriptionFromDrawable(out
ADesc: TRawImageDescription; ADrawable: PGdkDrawable; ACustomAlpha: Boolean
): boolean;
var
Visual: PGdkVisual;
Image: PGdkImage;
@ -4319,7 +4328,7 @@ begin
end;
end;
function TGtk2WidgetSet.X11GetActivewindow: HWND;
function TGtk2WidgetSet.X11GetActiveWindow: HWND;
var
Display: PDisplay;
RootWin, ResultWindow: TWindow;
@ -4354,6 +4363,70 @@ begin
if Valid then Result := {%H-}HWND(gdk_window_foreign_new(ResultWindow));
end;
procedure TGtk2WidgetSet.HideAllHints;
var
TopList, List: PGList;
Window: PGTKWindow;
begin
TopList := gdk_window_get_toplevels;
List := TopList;
while List <> nil do
begin
if (List^.Data <> nil) then
begin
gdk_window_get_user_data(PGDKWindow(List^.Data), Pgpointer(@Window));
if GDK_IS_WINDOW(PGDKWindow(List^.Data)) then
begin
if gtk_is_window(Window) then
begin
if g_object_get_data(PGObject(Window),'lclhintwindow') <> nil then
begin
if gdk_window_is_visible(PGDKWindow(List^.Data)) then
g_object_set_data(PGObject(Window),'lclneedrestorevisible',Pointer(1));
gdk_window_hide(PGDKWindow(List^.Data));
end;
end;
end;
end;
list := g_list_next(list);
end;
if TopList <> nil then
g_list_free(TopList);
end;
procedure TGtk2WidgetSet.RestoreAllHints;
var
TopList, List: PGList;
Window: PGTKWindow;
begin
TopList := gdk_window_get_toplevels;
List := TopList;
while List <> nil do
begin
if (List^.Data <> nil) then
begin
gdk_window_get_user_data(PGDKWindow(List^.Data), Pgpointer(@Window));
if GDK_IS_WINDOW(PGDKWindow(List^.Data)) then
begin
if gtk_is_window(Window) then
begin
if g_object_get_data(PGObject(Window),'lclhintwindow') <> nil then
begin
if g_object_get_data(PGObject(Window),'lclneedrestorevisible') <> nil then
begin
g_object_set_data(PGObject(Window),'lclneedrestorevisible', nil);
gdk_window_show(PGDKWindow(List^.Data));
end;
end;
end;
end;
end;
list := g_list_next(list);
end;
if TopList <> nil then
g_list_free(TopList);
end;
function TGtk2WidgetSet.compositeManagerRunning: Boolean;
var
XDisplay: PDisplay;
@ -5336,8 +5409,9 @@ end;
Creates an initial DC
------------------------------------------------------------------------------}
function TGtk2WidgetSet.CreateDCForWidget(AWidget: PGtkWidget; AWindow: PGdkWindow;
AWithChildWindows: Boolean; ADoubleBuffer: PGdkDrawable): HDC;
function TGtk2WidgetSet.CreateDCForWidget(AWidget: PGtkWidget;
AWindow: PGdkWindow; AWithChildWindows: Boolean; ADoubleBuffer: PgdkDrawable
): HDC;
var
DC: TGtkDeviceContext absolute Result;
begin
@ -5374,7 +5448,7 @@ end;
Dispose a GdiObject
------------------------------------------------------------------------------}
procedure TGtk2WidgetSet.DisposeGDIObject(GDIObject: PGdiObject);
procedure TGtk2WidgetSet.DisposeGDIObject(GdiObject: PGdiObject);
begin
if FGDIObjects.Contains(GDIObject) then
begin

View File

@ -940,6 +940,9 @@ begin
gtk_window_set_policy(GTK_WINDOW(p), 0, 0, 0);
gtk_window_set_focus_on_map(P, False);
// issue #24363
g_object_set_data(P,'lclhintwindow',AWinControl);
// Create the form client area
TempWidget := CreateFixedClientWidget;
gtk_container_add(p, TempWidget);