diff options
-rw-r--r-- | src/corelib/gdi/gfx_gdi.pas | 47 | ||||
-rw-r--r-- | src/corelib/gfx_widget.pas | 3 | ||||
-rw-r--r-- | src/corelib/gfxbase.pas | 6 | ||||
-rw-r--r-- | src/corelib/x11/gfx_x11.pas | 61 |
4 files changed, 74 insertions, 43 deletions
diff --git a/src/corelib/gdi/gfx_gdi.pas b/src/corelib/gdi/gfx_gdi.pas index eb211bb3..dca5ce15 100644 --- a/src/corelib/gdi/gfx_gdi.pas +++ b/src/corelib/gdi/gfx_gdi.pas @@ -127,6 +127,7 @@ type FParentWinHandle: TfpgWinHandle; procedure DoAllocateWindowHandle(AParent: TfpgWindowBase); override; procedure DoReleaseWindowHandle; override; + procedure DoSetWindowVisible(const AValue: Boolean); override; function HandleIsValid: boolean; override; procedure DoUpdateWindowPosition(aleft, atop, awidth, aheight: TfpgCoord); override; procedure DoMoveWindow(const x: TfpgCoord; const y: TfpgCoord); override; @@ -853,24 +854,6 @@ begin // the forms require some adjustments before the Window appears SetWindowParameters; - - BringWindowToTop(FWinHandle); - - if FWindowType in [wtPopup] then - Windows.ShowWindow(FWinHandle, SW_SHOWNOACTIVATE) - else - Windows.ShowWindow(FWinHandle, SW_SHOWNORMAL); - - if (waAutoPos in FWindowAttributes) or - (waScreenCenterPos in FWindowAttributes) then - begin - GetWindowRect(FWinHandle, r); - FLeft := r.Left; - FTop := r.Top; - end; - - // send the first paint message - Windows.UpdateWindow(FWinHandle); end; procedure TfpgWindowImpl.DoReleaseWindowHandle; @@ -881,6 +864,34 @@ begin FWinHandle := 0; end; +procedure TfpgWindowImpl.DoSetWindowVisible(const AValue: Boolean); +var + r: TRect; +begin + if AValue then begin + BringWindowToTop(FWinHandle); + + if FWindowType in [wtPopup] then + Windows.ShowWindow(FWinHandle, SW_SHOWNOACTIVATE) + else + Windows.ShowWindow(FWinHandle, SW_SHOWNORMAL); + + if (waAutoPos in FWindowAttributes) or + (waScreenCenterPos in FWindowAttributes) then + begin + GetWindowRect(FWinHandle, r); + FLeft := r.Left; + FTop := r.Top; + end; + + Windows.UpdateWindow(FWinHandle); + end + else begin + Windows.ShowWindow(FWinHandle, SW_HIDE); + end; + +end; + procedure TfpgWindowImpl.DoMoveWindow(const x: TfpgCoord; const y: TfpgCoord); begin if HandleIsValid then diff --git a/src/corelib/gfx_widget.pas b/src/corelib/gfx_widget.pas index 5cb5281d..dcb4a133 100644 --- a/src/corelib/gfx_widget.pas +++ b/src/corelib/gfx_widget.pas @@ -364,7 +364,8 @@ begin if FVisible then begin AllocateWindowHandle; - + DoSetWindowVisible(True); + for n := 0 to ComponentCount - 1 do begin c := Components[n]; diff --git a/src/corelib/gfxbase.pas b/src/corelib/gfxbase.pas index 5687daf9..0d85a642 100644 --- a/src/corelib/gfxbase.pas +++ b/src/corelib/gfxbase.pas @@ -307,6 +307,7 @@ type procedure DoUpdateWindowPosition(aleft, atop, awidth, aheight: TfpgCoord); virtual; abstract; procedure DoAllocateWindowHandle(AParent: TfpgWindowBase); virtual; abstract; procedure DoReleaseWindowHandle; virtual; abstract; + procedure DoSetWindowVisible(const AValue: Boolean); virtual; abstract; procedure DoMoveWindow(const x: TfpgCoord; const y: TfpgCoord); virtual; abstract; function DoWindowToScreen(ASource: TfpgWindowBase; const AScreenPos: TPoint): TPoint; virtual; abstract; procedure DoSetWindowTitle(const ATitle: string); virtual; abstract; @@ -342,17 +343,12 @@ type end; - { TfpgApplicationBase } - TfpgApplicationBase = class(TObject) - private - FTopModalForm: TfpgWindowBase; protected FIsInitialized: Boolean; public constructor Create(const AParams: string); virtual; abstract; property IsInitialized: boolean read FIsInitialized; - property TopModalForm: TfpgWindowBase read FTopModalForm write FTopModalForm; end; diff --git a/src/corelib/x11/gfx_x11.pas b/src/corelib/x11/gfx_x11.pas index 0a763d63..53b8c12c 100644 --- a/src/corelib/x11/gfx_x11.pas +++ b/src/corelib/x11/gfx_x11.pas @@ -41,6 +41,11 @@ type end; type + + TXWindowStateFlag = (xwsfMapped); + + TXWindowStateFlags = set of TXWindowStateFlag; + TfpgWindowImpl = class; @@ -121,10 +126,12 @@ type TfpgWindowImpl = class(TfpgWindowBase) protected + FWinFlags : TXWindowStateFlags; FWinHandle: TfpgWinHandle; FModalForWin: TfpgWindowImpl; procedure DoAllocateWindowHandle(AParent: TfpgWindowBase); override; procedure DoReleaseWindowHandle; override; + procedure DoSetWindowVisible(const AValue: Boolean); override; function HandleIsValid: boolean; override; procedure DoSetWindowTitle(const ATitle: string); override; procedure DoMoveWindow(const x: TfpgCoord; const y: TfpgCoord); override; @@ -610,20 +617,15 @@ begin xfd := XConnectionNumber(display); repeat - if (atimeoutms >= 0) and (XPending(display) <= 0) then + if (atimeoutms > 0) and (XPending(display) <= 0) then begin // waiting some event for the given timeout // this Select handles only the first 256 file descriptors // poll would be better but FPC has no official poll interface (if I'm right) - if atimeoutms > 0 then - begin - fpFD_ZERO(rfds); - fpFD_SET(xfd, rfds); - r := fpSelect(xfd + 1, @rfds, nil, nil, atimeoutms); - end - else - r := 0; + fpFD_ZERO(rfds); + fpFD_SET(xfd, rfds); + r := fpSelect(xfd + 1, @rfds, nil, nil, atimeoutms); if r <= 0 then Exit; // no event received. @@ -689,11 +691,11 @@ begin msgp.mouse.shiftstate := ConvertShiftState(ev.xbutton.state); w := FindWindowByHandle(ev.xbutton.window); - if xapplication.TopModalForm <> nil then + if fpgTopModalForm <> nil then begin // This is ugly!!!!!!!!!!!!!!! ew := TfpgWindowImpl(WidgetParentForm(TfpgWidget(w))); - if (ew <> nil) and (xapplication.TopModalForm <> ew) then + if (ew <> nil) and (fpgTopModalForm <> ew) then blockmsg := true; end; @@ -756,11 +758,11 @@ begin until not XCheckTypedWindowEvent(display, ev.xbutton.window, X.MotionNotify, @ev); w := FindWindowByHandle(ev.xany.window); - if xapplication.TopModalForm <> nil then + if fpgTopModalForm <> nil then begin // This is ugly!!!!!!!!!!!!!!! ew := TfpgWindowImpl(WidgetParentForm(TfpgWidget(w))); - if (ew <> nil) and (xapplication.TopModalForm <> ew) then + if (ew <> nil) and (fpgTopModalForm <> ew) then blockmsg := true; end; @@ -778,11 +780,11 @@ begin X.ClientMessage: begin w := FindWindowByHandle(ev.xany.window); - if xapplication.TopModalForm <> nil then + if fpgTopModalForm <> nil then begin // This is ugly!!!!!!!!!!!!!!! ew := TfpgWindowImpl(WidgetParentForm(TfpgWidget(w))); - if (ew <> nil) and (xapplication.TopModalForm <> ew) then + if (ew <> nil) and (fpgTopModalForm <> ew) then blockmsg := true; end; @@ -848,11 +850,19 @@ begin X.LeaveNotify: fpgPostMessage(nil, FindWindowByHandle(ev.xany.window), FPGM_MOUSEEXIT); - { We handle these two event manually in the TfpgForm class } - X.MapNotify, + X.MapNotify: + begin + w := FindWindowByHandle(ev.xmap.window); + if w <> nil then begin + Include(w.FWinFlags, xwsfMapped); + end; + end; X.UnmapNotify: begin - //Writeln('UnmapNotify'); + w := FindWindowByHandle(ev.xunmap.window); + if w <> nil then begin + Exclude(w.FWinFlags, xwsfMapped); + end; end; { We handle this event manually as well. } @@ -987,7 +997,7 @@ begin StructureNotifyMask); SetWindowParameters; - XMapWindow(xapplication.Display, wh); + AddWindowLookup(self); end; @@ -1002,6 +1012,19 @@ begin FWinHandle := 0; end; +procedure TfpgWindowImpl.DoSetWindowVisible(const AValue: Boolean); +begin + if AValue then begin + if not HandleIsValid then AllocateWindowHandle; + XMapWindow(xapplication.Display, FWinHandle); + Include(FWinFlags, xwsfMapped); + end + else begin + if HandleIsValid and (xwsfMapped in FWinFlags) then + XUnmapWindow(xapplication.Display, FWinHandle); + end; +end; + function TfpgWindowImpl.HandleIsValid: boolean; begin Result := (FWinHandle > 0); |