anchor.diff:    FMouseCursorIsDirty := False;
   end;
   
  +procedure TfpgX11Window.DoEnableDrops(const AValue: boolean);
  +begin
  +  // notify XDND protocol that we can handle DND
  +  if AValue then
  +  begin
  +    if HasHandle then
  +      XChangeProperty(xapplication.Display, WinHandle, xapplication.XdndAware, XA_ATOM, 32, PropModeReplace, @FPG_XDND_VERSION, 1)
  +    else
  +      QueueEnabledDrops := True; // we need to do this once we have a winhandle
  +  end
  +  else
  +    XDeleteProperty(xapplication.Display, WinHandle, xapplication.XdndAware);
  +end;
  +
   procedure TfpgX11Window.DoSetWindowTitle(const ATitle: string);
   var
     tp: TXTextProperty;
  
positive.code:   procedure ReportLostWindow(const event: TXEvent);
    begin
      {$IFDEF DEBUG}
      writeln('fpGFX/X11: ', GetXEventName(event._type), ' can''t find <',
          IntToHex(event.xany.window, 9), '>');
      {$ENDIF}
    end;
  
negative.code:     FComposeBuffer: TfpgString;
      FComposeStatus: TStatus;
      FEventFilter: TX11EventFilter;
      { all XDND atoms }
      XdndAware: TAtom;
      XdndTypeList: TAtom;
      XdndSelection: TAtom;
      { XDND client messages }
      XdndEnter: TAtom;
      XdndPosition: TAtom;
      XdndStatus: TAtom;
      XdndLeave: TAtom;
      XdndDrop: TAtom;
      XdndFinished: TAtom;
      { XDND actions }
      XdndActionCopy: TAtom;
      XdndActionMove: TAtom;
      XdndActionLink: TAtom;
      XdndActionAsk: TAtom;
      XdndActionPrivate: TAtom;
      function    ConvertShiftState(AState: Cardinal): TShiftState;
      function    KeySymToKeycode(KeySym: TKeySym): Word;
      function    StartComposing(const Event: TXEvent): TKeySym;
      procedure   XdndInit;
    protected
      FDisplay: PXDisplay;
      DisplayDepth: integer;
  