1
0
mirror of https://github.com/moparisthebest/Simba synced 2024-11-11 03:45:06 -05:00
Simba/Units/MMLAddon/windowselector.pas

157 lines
3.3 KiB
ObjectPascal

unit windowselector;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils,
ctypes,
window, windowutil,
controls,
graphics,
forms,
{$IFNDEF MSWINDOWS}x, xlib
{$ELSE}
windows
{$ENDIF}
;
type
TMWindowSelector = class(TObject)
constructor Create(aWindow: TMWindow);
destructor Destroy; override;
{$IFDEF LINUX}
function Drag: x.TWindow;
{$ELSE}
function Drag: Hwnd;
{$ENDIF}
public
Window: TMWindow;
end;
implementation
constructor TMWindowSelector.Create(aWindow: TMWindow);
begin
inherited create;
Self.Window := aWindow;
end;
destructor TMWindowSelector.Destroy;
begin
inherited;
end;
{$IFDEF LINUX}
function TMWindowSelector.Drag: x.TWindow;
var
Tempwindow : x.TWindow;
root : x.TWindow;
subwindow : x.TWindow;
x_root, y_root : cint;
xmask : cuint;
x, y : cint;
Old_Handler : TXErrorHandler;
begin
Old_Handler := XSetErrorHandler(@MufasaXErrorHandler);
Result := 0;
repeat
XQueryPointer(Window.XDisplay, Window.DesktopWindow, @root,
@Tempwindow, @x_root, @y_root,
@x, @y, @xmask);
subwindow:= Tempwindow;
while subwindow <> 0 do
begin
Tempwindow := subwindow;
XQueryPointer(Window.XDisplay, Tempwindow, @root,
@subwindow, @x_root, @y_root,
@x, @y, @xmask);
end;
if Result <> Tempwindow then
begin
WriteLn('Changing Window to: ' + IntToStr(Tempwindow));
Result := Tempwindow;
end;
Sleep(16);
until (xmask and Button1Mask) = 0;
XSetErrorHandler(Old_handler);
end;
{$ELSE}
function TMWindowSelector.Drag: Hwnd;
var
TargetRect: TRect;
DC: HDC;
OldPen, Pen: hPen;
OldBrush : hBrush;
BrushHandle : THandle;
Cursor : TCursor;
TempHandle : Hwnd;
Handle : Hwnd;
begin;
Pen := CreatePen(PS_SOLID, GetSystemMetrics(SM_CXBORDER)*5, clred);
BrushHandle := GetStockObject(Null_Brush);
Cursor:= Screen.Cursor;
Screen.Cursor:= crCross;
TempHandle := GetDesktopWindow;
while GetAsyncKeyState(VK_LBUTTON) <> 0 do
begin;
Handle:= WindowFromPoint(Mouse.CursorPos);
if Handle <> TempHandle then
begin;
if TempHandle <> 0 then
begin;
Invalidaterect(temphandle, nil, true);
UpdateWindow(temphandle);
{$IFDEF MSWINDOWS}
RedrawWindow(TempHandle, nil, 0, RDW_Frame or RDW_Invalidate or RDW_Updatenow or RDW_Allchildren);
{$ENDIF}
end;
if Handle <> 0 then
begin;
GetWindowRect(Handle, TargetRect);
DC := Windows.GetWindowDC(Handle);
OldPen := SelectObject(DC, Pen);
OldBrush := SelectObject(DC, BrushHandle);
Rectangle(DC, 0, 0, TargetRect.Right - TargetRect.Left, TargetRect.Bottom - TargetRect.Top);
SelectObject(DC, OldBrush);
SelectObject(DC, OldPen);
ReleaseDC(Handle, DC);
end;
TempHandle := Handle;
end;
Sleep(64);
end;
Result := TempHandle;
Screen.Cursor:= cursor;
Invalidaterect(temphandle, nil, true);
UpdateWindow(temphandle);
RedrawWindow(TempHandle, nil, 0, RDW_Frame or RDW_Invalidate or RDW_Updatenow or RDW_Allchildren);
DeleteObject(Pen);
end;
{$ENDIF}
end.