mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-31 10:00:32 +02:00
Fixes showing the popup menu on gtk1 trayicon (bug #10700)
git-svn-id: trunk@14037 -
This commit is contained in:
parent
952291e8bc
commit
7d16c56822
@ -28,12 +28,6 @@ type
|
||||
|
||||
TGtk1TrayIconHandle = class(TObject)
|
||||
private
|
||||
function GetCanvas: TCanvas;
|
||||
function NotifyExpose(Event: PGdkEventExpose; Widget: PGtkWidget): Boolean; cdecl;
|
||||
function NotifyMouseMove(Event: PGdkEventMotion; Widget: PGtkWidget): Boolean; cdecl;
|
||||
function NotifyMouseDown(Event: PGdkEventButton; Widget: PGtkWidget): Boolean; cdecl;
|
||||
function NotifyMouseUp(Event: PGdkEventButton; Widget: PGtkWidget): Boolean; cdecl;
|
||||
public
|
||||
plug: PGtkWidget;
|
||||
drawingarea: PGtkWidget;
|
||||
fDisplay: PDisplay;
|
||||
@ -45,14 +39,22 @@ type
|
||||
fEmbedded: Boolean;
|
||||
fMsgCount: Integer;
|
||||
fTrayIcon: TCustomTrayIcon;
|
||||
function Send_Message(window: TWindow; msg: Integer;data1, data2,data3: Integer): boolean;
|
||||
function TrayParent(UseCachedValue: Boolean = True): TWindow;
|
||||
destructor Destroy; override;
|
||||
procedure SetEmbedded;
|
||||
procedure Hide;
|
||||
procedure CreateForm(id: Integer);
|
||||
procedure SetMinSize(AWidth, AHeight: Integer);
|
||||
function GetCanvas: TCanvas;
|
||||
function NotifyExpose(Event: PGdkEventExpose; Widget: PGtkWidget): Boolean; cdecl;
|
||||
function NotifyMouseMove(Event: PGdkEventMotion; Widget: PGtkWidget): Boolean; cdecl;
|
||||
function NotifyMouseDown(Event: PGdkEventButton; Widget: PGtkWidget): Boolean; cdecl;
|
||||
function NotifyMouseUp(Event: PGdkEventButton; Widget: PGtkWidget): Boolean; cdecl;
|
||||
procedure PaintForm(Sender: TObject);
|
||||
function Send_Message(window: TWindow; msg: Integer;data1, data2,data3: Integer): boolean;
|
||||
public
|
||||
destructor Destroy; override;
|
||||
procedure CreateForm(id: Integer);
|
||||
function GetPosition: TPoint;
|
||||
procedure Hide;
|
||||
procedure SetEmbedded;
|
||||
procedure SetMinSize(AWidth, AHeight: Integer);
|
||||
function TrayParent(UseCachedValue: Boolean = True): TWindow;
|
||||
public
|
||||
property Canvas: TCanvas read GetCanvas;
|
||||
end;
|
||||
|
||||
@ -70,8 +72,8 @@ end;
|
||||
|
||||
function TGtk1TrayIconHandle.GetCanvas: TCanvas;
|
||||
begin
|
||||
if Assigned(FCanvas) then
|
||||
Exit(FCanvas);
|
||||
if Assigned(FCanvas) then Exit(FCanvas);
|
||||
|
||||
Result := TCanvas.Create;
|
||||
Result.Handle:= GetDC(HWND(drawingarea));
|
||||
FCanvas := Result;
|
||||
@ -80,14 +82,16 @@ end;
|
||||
function TGtk1TrayIconHandle.NotifyExpose(Event: PGdkEventExpose;
|
||||
Widget: PGtkWidget): Boolean; cdecl;
|
||||
begin
|
||||
Result:=false;
|
||||
Result := False;
|
||||
|
||||
PaintForm(fTrayIcon);
|
||||
end;
|
||||
|
||||
function TGtk1TrayIconHandle.NotifyMouseMove(Event: PGdkEventMotion;
|
||||
Widget: PGtkWidget): Boolean; cdecl;
|
||||
begin
|
||||
Result:=false;
|
||||
Result := False;
|
||||
|
||||
if Assigned(fTrayIcon.OnMouseMove) then
|
||||
fTrayIcon.OnMouseMove(fTrayIcon, [], Trunc(Event^.x), Trunc(Event^.y));
|
||||
end;
|
||||
@ -97,7 +101,8 @@ function TGtk1TrayIconHandle.NotifyMouseDown(Event: PGdkEventButton;
|
||||
var
|
||||
Button: TMouseButton;
|
||||
begin
|
||||
Result:=false;
|
||||
Result := False;
|
||||
|
||||
case Event^.button of
|
||||
GDK_RIGHTBUTTON: Button := mbRight;
|
||||
GDK_MIDDLEBUTTON: Button := mbMiddle;
|
||||
@ -113,7 +118,8 @@ function TGtk1TrayIconHandle.NotifyMouseUp(Event: PGdkEventButton;
|
||||
var
|
||||
Button: TMouseButton;
|
||||
begin
|
||||
Result:=false;
|
||||
Result := False;
|
||||
|
||||
case Event^.button of
|
||||
3: Button := mbRight;
|
||||
2: Button := mbMiddle;
|
||||
@ -130,13 +136,15 @@ begin
|
||||
fTrayIcon.OnDblClick(fTrayIcon);
|
||||
end;
|
||||
|
||||
|
||||
{ Just using GetPosition to get the screen position and then add
|
||||
Event^.x and Event^.y to it won't work. It seams that this will
|
||||
cause a small difference with Mouse.CursorPos, and using
|
||||
TPopupMenu.PopUp will result in a wrong position for the menu }
|
||||
if (Button = mbRight) and (fTrayIcon.PopUpMenu <> nil) then
|
||||
fTrayIcon.PopUpMenu.PopUp(-1,-1);
|
||||
fTrayIcon.PopUpMenu.PopUp(Mouse.CursorPos.X, Mouse.CursorPos.Y);
|
||||
|
||||
if Assigned(fTrayIcon.OnMouseUp) then
|
||||
if Assigned(fTrayIcon.OnMouseUp) then
|
||||
fTrayIcon.OnMouseUp(fTrayIcon, Button, [], Trunc(Event^.x), Trunc(Event^.y));
|
||||
|
||||
end;
|
||||
|
||||
{*******************************************************************
|
||||
@ -144,10 +152,6 @@ end;
|
||||
*
|
||||
* DESCRIPTION: Sends a message to the X client
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURNS: Nothing
|
||||
*
|
||||
*******************************************************************}
|
||||
function TGtk1TrayIconHandle.Send_Message(window: TWindow; msg: Integer;data1, data2,data3: Integer): boolean;
|
||||
var
|
||||
@ -215,10 +219,6 @@ end;
|
||||
*
|
||||
* DESCRIPTION:
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURNS: Nothing
|
||||
*
|
||||
*******************************************************************}
|
||||
procedure TGtk1TrayIconHandle.SetEmbedded;
|
||||
var
|
||||
@ -264,10 +264,6 @@ end;
|
||||
*
|
||||
* DESCRIPTION:
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURNS: Nothing
|
||||
*
|
||||
*******************************************************************}
|
||||
procedure TGtk1TrayIconHandle.CreateForm(id: Integer);
|
||||
begin
|
||||
@ -288,15 +284,32 @@ begin
|
||||
GetCanvas;
|
||||
end;
|
||||
|
||||
{*******************************************************************
|
||||
* TGtk1TrayIconHandle.GetPosition ()
|
||||
*
|
||||
* DESCRIPTION: Returns the (x, y) position of the icon on the screen
|
||||
*
|
||||
*******************************************************************}
|
||||
function TGtk1TrayIconHandle.GetPosition: TPoint;
|
||||
var
|
||||
WindowHandle: PGDKWindow;
|
||||
begin
|
||||
Result := Point(0, 0);
|
||||
|
||||
if not Assigned(plug) then Exit;
|
||||
|
||||
WindowHandle := plug^.window;
|
||||
|
||||
if not Assigned(WindowHandle) then Exit;
|
||||
|
||||
gdk_window_get_origin(WindowHandle, @Result.X, @Result.Y);
|
||||
end;
|
||||
|
||||
{*******************************************************************
|
||||
* TGtk1TrayIconHandle.SetMinSize ()
|
||||
*
|
||||
* DESCRIPTION: Attemps to avoid problems on Gnome
|
||||
*
|
||||
* PARAMETERS:
|
||||
*
|
||||
* RETURNS: Nothing
|
||||
*
|
||||
*******************************************************************}
|
||||
procedure TGtk1TrayIconHandle.SetMinSize(AWidth, AHeight: Integer);
|
||||
begin
|
||||
@ -308,10 +321,6 @@ end;
|
||||
*
|
||||
* DESCRIPTION: Paint method of the Icon Window
|
||||
*
|
||||
* PARAMETERS: Sender of the event
|
||||
*
|
||||
* RETURNS: Nothing
|
||||
*
|
||||
*******************************************************************}
|
||||
procedure TGtk1TrayIconHandle.PaintForm(Sender: TObject);
|
||||
begin
|
||||
@ -378,10 +387,6 @@ end;
|
||||
* DESCRIPTION: Makes modifications to the Icon while running
|
||||
* i.e. without hiding it and showing again
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURNS: Nothing
|
||||
*
|
||||
*******************************************************************}
|
||||
class procedure TGtkWSCustomTrayIcon.InternalUpdate(const ATrayIcon: TCustomTrayIcon);
|
||||
var
|
||||
@ -390,9 +395,6 @@ begin
|
||||
TrayIconHandle := TGtk1TrayIconHandle(ATrayIcon.Handle);
|
||||
|
||||
if not Assigned(TrayIconHandle) then Exit;
|
||||
|
||||
//if Assigned(TrayIconHandle.GtkForm) then
|
||||
// TrayIconHandle.GtkForm.PopupMenu := ATrayIcon.PopUpMenu;
|
||||
end;
|
||||
|
||||
{*******************************************************************
|
||||
@ -402,19 +404,21 @@ end;
|
||||
* This function is utilized to show message boxes near
|
||||
* the icon
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURNS: Nothing
|
||||
*
|
||||
*******************************************************************}
|
||||
class function TGtkWSCustomTrayIcon.GetPosition(const ATrayIcon: TCustomTrayIcon): TPoint;
|
||||
var
|
||||
TrayIconHandle: TGtk1TrayIconHandle;
|
||||
begin
|
||||
Result.X := 0;
|
||||
Result.Y := 0;
|
||||
Result := Point(0, 0);
|
||||
|
||||
TrayIconHandle := TGtk1TrayIconHandle(ATrayIcon.Handle);
|
||||
|
||||
if not Assigned(TrayIconHandle) then Exit;
|
||||
|
||||
Result := TrayIconHandle.GetPosition;
|
||||
end;
|
||||
|
||||
class function TGtkWSCustomTrayIcon.GetCanvas(const ATrayIcon: TCustomTrayIcon
|
||||
): TCanvas;
|
||||
class function TGtkWSCustomTrayIcon.GetCanvas(const ATrayIcon: TCustomTrayIcon): TCanvas;
|
||||
var
|
||||
TrayIconHandle: TGtk1TrayIconHandle;
|
||||
begin
|
||||
|
Loading…
Reference in New Issue
Block a user