From df5e7aa81eba2bf6991762bb616e03f988ce212e Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 27 Sep 2007 09:23:06 +0000 Subject: [PATCH] gtk: - separate SM_CXSCREEN and SM_CXVIRTUALSCREEN for gtk2 (affects TForm.ScreenPosition screen/desktop center) - implement SetCursorPos for gtk2 (if version >= 2.8) git-svn-id: trunk@12196 - --- lcl/interfaces/gtk/gtkdefines.inc | 1 + lcl/interfaces/gtk/gtkwinapi.inc | 45 +++++++++++++++++++++-------- lcl/interfaces/gtk2/gtk2extrah.inc | 4 +++ lcl/interfaces/gtk2/gtk2int.pas | 2 ++ lcl/interfaces/gtk2/gtk2winapi.inc | 10 +++++++ lcl/interfaces/gtk2/gtk2winapih.inc | 1 + 6 files changed, 51 insertions(+), 12 deletions(-) diff --git a/lcl/interfaces/gtk/gtkdefines.inc b/lcl/interfaces/gtk/gtkdefines.inc index bf1ca67d7b..016a1985d3 100644 --- a/lcl/interfaces/gtk/gtkdefines.inc +++ b/lcl/interfaces/gtk/gtkdefines.inc @@ -79,6 +79,7 @@ // not supported {$fatal X is required for GTK1} {$endif} + {$define GTK_2_8} {$endif} diff --git a/lcl/interfaces/gtk/gtkwinapi.inc b/lcl/interfaces/gtk/gtkwinapi.inc index 4c53e1017d..6fab68cdba 100644 --- a/lcl/interfaces/gtk/gtkwinapi.inc +++ b/lcl/interfaces/gtk/gtkwinapi.inc @@ -3307,8 +3307,10 @@ begin end; FontList := TStringlist.Create; try - if Family<>'' then Tmp := '-*-'+Family+'-*-*-*-*-*-*-*-*-*-*-*-*' - else Tmp := '-*'; // get rid of aliases + if Family<>'' then + Tmp := '-*-'+Family+'-*-*-*-*-*-*-*-*-*-*-*-*' + else + Tmp := '-*'; // get rid of aliases {$ifdef VerboseEnumFonts} WriteLn('Looking for fonts matching: ', tmp); {$endif} @@ -5697,11 +5699,15 @@ var P: Pointer; ax,ay,ah,aw: gint; auw, auh: guint; - {$ifndef GTK2}{$ifdef HasX} + {$ifdef GTK2} + display: PGdkDisplay; + {$else} + {$ifdef HasX} XDisplay: PDisplay; XScreen: PScreen; XWindow: TWindow; - {$endif}{$endif} + {$endif} + {$endif} begin Assert(False, Format('Trace:> [TGtkWidgetSet.GetSystemMetrics] %d', [nIndex])); case nIndex of @@ -5820,15 +5826,19 @@ begin SM_CXMAXIMIZED: begin {$IFDEF HasX} - if XGetWorkarea(ax,ay,aw,ah)>=0 then result:=aw - else getSystemMetrics(SM_CXSCREEN); + if XGetWorkarea(ax,ay,aw,ah)>=0 then + Result := aw + else + Result := getSystemMetrics(SM_CXSCREEN); {$ENDIF} end; SM_CYMAXIMIZED: begin {$IFDEF HasX} - if XGetWorkarea(ax,ay,aw,ah)>=0 then result:=ah - else getSystemMetrics(SM_CYSCREEN); + if XGetWorkarea(ax,ay,aw,ah)>=0 then + Result := ah + else + Result := getSystemMetrics(SM_CYSCREEN); {$ENDIF} end; SM_CXMAXTRACK: @@ -5887,8 +5897,7 @@ begin begin Assert(False, 'Trace:TODO: [TGtkWidgetSet.GetSystemMetrics] --> SM_CYMINTRACK '); end; - SM_CXSCREEN, - SM_CXVIRTUALSCREEN: + SM_CXSCREEN: begin {$IFDEF GTK1} { Partial fix for multi monitor systems - force use of first one } {$IFDEF UseXinerama} @@ -5899,6 +5908,18 @@ begin {$ENDIF} result := gdk_Screen_Width; end; + SM_CXVIRTUALSCREEN: + begin + {$ifdef GTK2} + aw := 0; + display := gdk_display_get_default(); + for ax := 0 to gdk_display_get_n_screens(display) - 1 do + inc(aw, gdk_screen_get_width(gdk_display_get_screen(display, ax))); + Result := ax; + {$else} + Result := getSystemMetrics(SM_CXSCREEN); + {$endif} + end; SM_CYSCREEN, SM_CYVIRTUALSCREEN: begin @@ -8433,13 +8454,13 @@ begin {$IFDEF DebugGDKTraps}EndGDKErrorTrap;{$ENDIF} end; end; -{$ELSE UNIX} +{$ELSE HasX} begin Result := False; DebugLn('TGtkWidgetSet.SetCursorPos not implemented for this platform'); // Can this call TWin32WidgetSet.SetCursorPos? end; -{$ENDIF UNIX} +{$ENDIF HasX} {------------------------------------------------------------------------------ Function: SetFocus diff --git a/lcl/interfaces/gtk2/gtk2extrah.inc b/lcl/interfaces/gtk2/gtk2extrah.inc index 23a951b122..a6ee7388e8 100644 --- a/lcl/interfaces/gtk2/gtk2extrah.inc +++ b/lcl/interfaces/gtk2/gtk2extrah.inc @@ -66,6 +66,10 @@ function gdk_cursor_new_from_pixbuf(display: PGdkDisplay; pixbuf: PGdkPixbuf; x, function gdk_display_get_default_cursor_size(display: PGdkDisplay): guint; cdecl; external gdklib; procedure gdk_display_get_maximal_cursor_size(display: PGdkDisplay; w, h: pguint); cdecl; external gdklib; +{$ifdef GTK_2_8} +// gdk 2.8 +procedure gdk_display_warp_pointer(display: PGdkDisplay; screen: PGdkScreen; x, y: gint); cdecl; external gdklib; +{$endif} { for future use function gdk_display_supports_cursor_alpha(display: PGdkDisplay): gBoolean; cdecl; external gdklib; function gdk_display_supports_cursor_color(display: PGdkDisplay): gBoolean; cdecl; external gdklib; diff --git a/lcl/interfaces/gtk2/gtk2int.pas b/lcl/interfaces/gtk2/gtk2int.pas index 0c00d4ecd0..9490ef6b80 100644 --- a/lcl/interfaces/gtk2/gtk2int.pas +++ b/lcl/interfaces/gtk2/gtk2int.pas @@ -31,6 +31,8 @@ interface {$ASSERTIONS ON} {$endif} +//{$I gtkdefines.inc} + uses Types, Classes, SysUtils, {$IfNDef GTK2_2} diff --git a/lcl/interfaces/gtk2/gtk2winapi.inc b/lcl/interfaces/gtk2/gtk2winapi.inc index 096de9e323..e5a7ebbf54 100644 --- a/lcl/interfaces/gtk2/gtk2winapi.inc +++ b/lcl/interfaces/gtk2/gtk2winapi.inc @@ -481,6 +481,16 @@ begin end; end; +function TGtk2WidgetSet.SetCursorPos(X, Y: Integer): Boolean; +begin +{$ifdef GTK_2_8} + gdk_display_warp_pointer(gdk_display_get_default(), gdk_screen_get_default(), X, Y); + Result := True; +{$else} + Result:=inherited SetCursorPos(X, Y); +{$endif} +end; + {------------------------------------------------------------------------------ function ShowWindow(hWnd: HWND; nCmdShow: Integer): Boolean; diff --git a/lcl/interfaces/gtk2/gtk2winapih.inc b/lcl/interfaces/gtk2/gtk2winapih.inc index ead0b12843..a7c27381e6 100644 --- a/lcl/interfaces/gtk2/gtk2winapih.inc +++ b/lcl/interfaces/gtk2/gtk2winapih.inc @@ -44,6 +44,7 @@ function ExtTextOut(DC: HDC; X, Y: Integer; Options: Longint; Rect: PRect; Str: function GetCursorPos(var lpPoint: TPoint ): Boolean; override; function GetTextExtentPoint(DC: HDC; Str: PChar; Count: Integer; var Size: TSize): Boolean; override; +function SetCursorPos(X, Y: Integer): Boolean; override; function ShowWindow(hWnd: HWND; nCmdShow: Integer): Boolean; override; function TextOut(DC: HDC; X,Y : Integer; Str : Pchar; Count: Integer) : Boolean; override;