{ ------------------------------------------------------------------- }
{ Dieser Quelltext ist urheberrechtlich geschuetzt.                   }
{ (c) 1991-1999 Peter Mandrella                                       }
{ (c) 2000-2001 OpenXP-Team                                           }
{ (c) 2002-2024 FreeXP, http://www.freexp.de                          }
{ CrossPoint ist eine eingetragene Marke von Peter Mandrella.         }
{                                                                     }
{ Die Nutzungsbedingungen fuer diesen Quelltext finden Sie in der     }
{ Datei SLIZENZ.TXT oder auf http://www.crosspoint.de/oldlicense.html }
{ ------------------------------------------------------------------- }

{ CrossPoint - Hauptmen }

{ variable Menpunkte setzen }
procedure enabledisable;
const Nachricht = 3;     { /Nachricht }
      Unvers    = 4;     { Nachricht / Unversandt }
      Suchen    = 5;     { Nachricht / Suchen }
      Wartung   = 7;     { /Wartung }
      Anzeige   = 9;     { Config / Anzeige }
      Export    = 36;    { XPoint / Export }
      Extrakt   = 12;    { Nachricht / Extrakt }
      Alle      = 14;    { Nachricht / Alle }
      Edit      = 16;    { /Edit }
      Maps      = 19;    { Nachricht / Brettmanager }
      Weiter    = 21;    { Nachricht / Weiterleiten }
      Fileliste = 27;    { Fileserver-Listen }
      Sonstiges = 33;    { Wartung / Sonstiges }
      PGP       = 40;    { Nachricht / PGP }
      Hilfe     = 41;    { /? }
      Spezial   = 42;    { ? / Spezielle Themen }
var
    unversandt : byte;
    nachrichten: boolean;
    uvse,uvsl  : boolean;
    mtyp       : char;
    _brett     : string[5];

begin
  nachrichten:= (dispmode>=10) and (dispmode<=19);
  setenable(Nachricht,1,not markaktiv or (dispmode=11));  { Suchen }
  setenable(Nachricht,2,(dispmode<>1) and (dispmode<>2) and not empty);
  setenable(Nachricht,4,not empty and nachrichten);
  setenable(Nachricht,5,not empty and nachrichten);
  setenable(Nachricht,6,not empty and nachrichten);

  uvse:=true; uvsl:=true;
  setenable(Weiter,10,true);
  if (dispmode=10) and not empty then begin
    dbReadN(mbase,mb_brett,_brett);
    if _brett[1]='U' then setenable(Weiter,10,false);    { PM-Archiv }
    dbReadN(mbase,mb_unversandt,unversandt);
    dbReadN(mbase,mb_typ,mtyp);
    if unversandt and 1=0 then begin
      uvsl:=false; uvse:=false; end
    else
      if mtyp='B' then uvse:=false;
    end;
  if empty or (dispmode<10) or (dispmode>19) then begin
    uvse:=false; uvsl:=false; end;
  setenable(Unvers,1,uvse);
  setenable(Unvers,2,uvsl);
  setenable(Unvers,3,uvsl);
  setenable(Unvers,5,dispmode<>11);
  setenable(Wartung,1,dispmode<>11);
  setenable(Wartung,9,dispmode<>12);
  setenable(Anzeige,5,not ParLCD);    { Config/Anzeige/Zeilen }

  setenable(Extrakt,1,nachrichten);
  setenable(Extrakt,2,nachrichten);
  setenable(Extrakt,3,dispmode<>11);
  setenable(Extrakt,4,dispmode=12);
  setenable(Extrakt,7,nachrichten);
  setenable(Suchen,6,markanz<>0);
  setenable(Suchen,7,markanz<>0);
  setenable(Alle,3,dispmode<>11);
  setenable(Alle,4,dispmode<>11);
{  setenable(Alle,5,(dispmode<>10) or (rdmode<>1));  /N/A/Lesen }
  setenable(Maps,6,not empty and nachrichten);    { Brettliste }
  setenable(Fileliste,2,not empty and nachrichten);
  setenable(sonstiges,3,dispmode<>11);

  setenable(Edit,6,dispmode<>20);
  setenable(Export,3,nachrichten);
  setenable(PGP,2,nachrichten and not empty);
  setenable(PGP,3,nachrichten and not empty);
  setenable(PGP,4,nachrichten and not empty);
end;


procedure Reorg_Stat(stat,repair:boolean);
var brk : boolean;
begin
  MsgReorgScan(not stat,repair,brk);
  if stat then signal;
  if not stat and not brk then begin
    MsgReorg;
    if (dispmode>10) and (dispmode<=19) then disprec[1]:=0;
    aufbau:=true;
    end;
end;

procedure Breorg(user,adrbuch:boolean);
begin
  BU_reorg(user,adrbuch);
  signal;
  disprec[1]:=0;
  aufbau:=true;
end;

                         { Ausgeklammert, siehe auch xp4o2.pas und xp2.pas }
procedure _SetLanguage;
begin
  SetLanguage;
  setmainkeys(dispmode);
end;

procedure menuopt(t:taste);
const
  lastmenusel : integer = 0;
var m,m1      : integer;
    nix       : string[20];
    adr       : string[20];
    oldlines  : byte;
    longmenu  : boolean;

begin
  menurestart:=false;
  repeat
   if (t=keyf4) and (lastmenusel>0) and       { v- Menpunkt nicht disabled }
      (menable[lastmenusel div 16] and (1 shl (lastmenusel and 15))=0) then
      m:=lastmenusel
    else begin
      m:=getmenu(0,t,0,0);
      if m>0 then lastmenusel:=m;
      end;
    menurestart:=false;
    mauszuo:=true; mauszuu:=true;
    nix:='';
    m1:=m and 15;
    longmenu:=false;
    if m >=$1000 then begin   { m= $1xxx: Menuepunkt ueber 13 }
      dec(m,$1000);
      inc(m1,4);                       
      longmenu:=true;
      end;
    case m div 16 of
      1 : case m1 of           { XPoint }
            1 : license;
            5 : terminal(true);
            6 : dosshell;
            8 : if AskSave then quit:=true;
          end;

      2 : case m1 of           { Zusatz }
               1 : kalender;
               2 : FileArcViewer('');
           5..24 : begin
                     getfilename:=_getfilename;
                     isempty:=empty; _p:=p;
                     prog_call(iif(longmenu,4,0),m1-4);
                   end;
          end;

      3 : case m1 of           { Nachricht }
            11 : msgdirect;
          end;

      4 : case m1 of           { Unversandt }
            1 : Unversandt(true,true);
            2 : Unversandt(true,false);
            3 : Unversandt(false,false);
            4 : UV_Stat;
            5 : Zeige_Unversandt;
          end;

      5 : case m1 of           { Suchen }
            1 : if Suche(getres(414),'','') then select(11);         { 'Volltext' }
            2 : if Suche(getres(415),'Betreff','') then select(11);  { 'Betreff' }
            3 : if Suche(getres(416),'Absender','') then select(11); { 'User' }
            4 : if Suche(getres(417),'*','') then select(11);        { 'Spezial' }
            5 : SucheWiedervorlage;
            6 : if markanz=0 then
                  rfehler(415)   { 'Keine Nachrichten markiert!' }
                else
                  select(11);
            7 : begin
                  markanz:=0;
                  aufbau:=true;
                end;
 	    8 : if Suche(getres(437),'MsgID','') then select(11); { 'MessageID' }
          end;

      6 : case m1 of           { Config }
            3 : path_config;
            6 : DruckConfig;
            8 : begin EditFkeys(0); menurestart:=true; end;
            9 : CfgSave;
          end;

      7 : case m1 of           { Wartung }
            1 : Reorg_Stat(false,false);
            2 : PackAll(false);
            3 : Breorg(false,false);
            4 : Breorg(true,false);
            5 : Breorg(true,true);
            6 : DupeKill (false);
            8 : ChangePollbox;
          end;

   {  8 in Xp1Menu.inc/Menu_keep  ( Edit/Schablonen )} 

      9 : case m1 of             { Anzeige }
            1 : CfgColors;
            2 : brett_config;    { Bretter }
            3 : NachrichtenanzeigeCfg;
            4 : begin UniEdit(4); menurestart:=true; end;
            6 : MiscAnzeigeCfg;  { Screen-Saver u.a. }
            7 : begin
                  shell('zconfig.exe',200,1);
                  menurestart:=true;
                end;
            8 : AccessibilityOptions;
          end;

     10 : case m1 of           { Import }
            1 : readpuffer;
            2 : Readfremdpuffer;
            3 : ImportUserliste;
            4 : ImportBrettliste;
            6 : ImportYuppiebase;
          end;

     11 : begin                { Anzeige/Zeilen }
            ParZeilen:=0;
            oldlines:=screenlines;
            newscreenlines(m1);
            showscreen(false);
         (* XPhilite:=0; *)
            showlastkeys;
            aufbau:=true;
            if screenlines<>oldlines then
            begin
              GlobalModified;
              zusatz_menue;
            end;
          end;

     12 : case m1 of
            1 : extrakt(1,aktdispmode,rdmode);    { Nachricht/Extrakt }
            2 : uudecode;
            7 : mimedecode;
            3 : extrakt(2,aktdispmode,rdmode);
            4 : extrakt(4,aktdispmode,rdmode);
            5 : extrakt(3,aktdispmode,rdmode);
          end;

   { 13 in xp1menu.inc/Menu_keep    (Extrakt/Als...) }

     14 : case m1 of
            8 : msgall(9,aktdispmode,rdmode);       { Nachricht/Alle }
          else  msgall(m1,aktdispmode,rdmode);
          end;

     15 : case m1 of                          { Netcall }
            1 : begin
                  NodelistBrowserButtonsDisabled:=true;
                  EinzelNetcall('');                         { Einzeln }
                  NodelistBrowserButtonsDisabled:=false;
                end;
            2 : begin
                  NodelistBrowserButtonsDisabled:=true;
                  AutoTiming(0,true,false,false,1);          { Alle    }
                  NodelistBrowserButtonsDisabled:=false;
                end;
            3 : AnrufStat;                                   { Letzte Anrufe }
            4 : netcall_at('','');                           { Uhrzeit }
            5 : begin
                  NodelistBrowserButtonsDisabled:=true;
                  netcall(true,'',false,true,false);         { Relogin }
                  NodelistBrowserButtonsDisabled:=false;
                end;
            6 : begin
                  NodelistBrowserButtonsDisabled:=true;
                  netcall(false,'',false,false,false);       { Online  }
                  NodelistBrowserButtonsDisabled:=false;
                end;
            8 : begin
                  NodelistBrowserButtonsDisabled:=true;
                  AutoTiming(0,true,false,true,1);           { Spezial }
                  NodelistBrowserButtonsDisabled:=false;
                end;
            9 : EditNetcallDat;                              { Spezial-Liste }
           11 : begin
                  NodelistBrowserButtonsDisabled:=true;
                  AutoTiming(0,false,false,false,1);         { Bereitschaft }
                  NodelistBrowserButtonsDisabled:=false;
                end;
           12 : UniEdit(1);                                  { Timing-Liste }
          end;

     16 : case m1 of                                  { Edit }
            2..5 : if UniSel(m1-1,true,'')='' then;
            6    : begin
                     select(20);    { AutoVersand }
                     ShowMain(0);
                   end;
            7    : EditText;
            8    : if UniSel(5,true,'')='' then;
          end;

     17 : case m1 of           { Statistik }
            1 : MemStat;
            2 : Reorg_Stat(true,false);
            3 : DatabaseStat;
            5 : GruppenStat;
            6 : MultiStat(0);
            7 : MultiStat(1);
           10 : FragStat;
          end;

     18 : case m1 of
            1..4 : ModemConfig(m1);
{$IFDEF CAPI }
            5    : IsdnConfig;
{$ENDIF CAPI }
          end;

     19 : case m1 of           { MAPS }
            1 : MapsBrettliste(0);
            2 : if dispmode=0 then
                  if dbEOF(bbase) then  { noch keine Bretter angelegt }
                    MapsDelbrett('U')   { .. erzwingt Listenauswahl }
                  else
                    MapsDelBrett(iifs(bmarkanz=0,dbReadStrN(bbase,bb_brettname),''))
                else begin
                  dbSeek(bbase,biBrett,ustr(dispspec));
                  MapsDelBrett(dispspec);
                  end;
            3 : MapsCommands(1);
            4 : MapsCommands(0);
            6 : MapsReadList;
            7 : MapsReadFile;
            8 : MausEditInfos;
          end;

     20 : case m1 of           { Fileserver }
            1 : FS_command('',1);
            2 : FS_command('SENDEN',0);
            4 : FS_command('HILFE',0);
            5 : FS_command('',2);
            6 : FS_command('SERVICE',0);
          end;

     21 : case m1 of           { Weiterleiten }
            1     : begin
                      NodelistBrowserButtonsDisabled:=true;
                      Weiterleit(1,true);                    { Kopie     }
                      NodelistBrowserButtonsDisabled:=false;
                    end;
            2     : begin
                      NodelistBrowserButtonsDisabled:=true;
                      Weiterleit(7,true);                    { Original  }
                      NodelistBrowserButtonsDisabled:=false;
                    end;
            3     : begin
                      NodelistBrowserButtonsDisabled:=true;
                      Weiterleit(2,true);                    { EditTo    }
                      NodelistBrowserButtonsDisabled:=false;
                    end;
            4     : begin
                      NodelistBrowserButtonsDisabled:=true;
                      Weiterleit(3,true);                    { QuoteTo   }
                      NodelistBrowserButtonsDisabled:=false;
                    end;
            6     : empfang_bestaetigen(nix);
            7     : CancelMessage;
            8     : begin
                      NodelistBrowserButtonsDisabled:=true;
                      ErsetzeMessage;
                      NodelistBrowserButtonsDisabled:=false;
                    end;
            9     : begin
                      NodelistBrowserButtonsDisabled:=true;
                      Weiterleit(4,true);                    { Erneut    }
                      NodelistBrowserButtonsDisabled:=false;
                    end;
           10     : begin
                      NodelistBrowserButtonsDisabled:=true;
                      Weiterleit(5,true);                    { Archiv    }
                      NodelistBrowserButtonsDisabled:=false;
                    end;
           11     : begin
                      NodelistBrowserButtonsDisabled:=true;
                      pm_archiv(false);
                      NodelistBrowserButtonsDisabled:=false;
                    end;
         end;

     22 : if not (dispmode in [10..19]) then
            rfehler(442)    { 'Nur in der Nachrichtenbersicht mglich.' }
          else
            case m1 of           { ndern }
              1 : begin
                    NodelistBrowserButtonsDisabled:=true;
                    ModiBetreff;
                    NodelistBrowserButtonsDisabled:=false;
                  end;
              2 : begin
                    NodelistBrowserButtonsDisabled:=true;
                    ModiEmpfdatum;
                    NodelistBrowserButtonsDisabled:=false;
                  end;
              3 : begin
                    NodelistBrowserButtonsDisabled:=true;
                    ModiRot13;
                    NodelistBrowserButtonsDisabled:=false;
                  end;
              4 : begin
                    NodelistBrowserButtonsDisabled:=true;
                    ModiText;
                    NodelistBrowserButtonsDisabled:=false;
                  end;
              5 : ModiTyp;
              6 : ModiGelesen;
              7 : ModiHighlite;
            end;

     23 : begin
            case m1 of
              1..3 : EditFkeys(m1);      { F-Tasten }
              4    : UniEdit(2);         { Makros }
            end;
            menurestart:=true;
          end;

     24 : case m1 of               { Extern }
            1 : xlistoptions;
            2 : editoptions;
            3 : shelloptions;
            4 : ArcOptions;
            5 : pmcOptions;
            6 : PGP_Options;
          { 7 : ViewerOptions;   - nicht mehr verwenden: knnte noch }
          {                        in keydef.cfg stehen              }
          end;

     26 : GebuehrenZaehler(m1=1);    { Zusatz/Gebhren }

     27 : case m1 of          { Fileserver-Liste }
            1 : FS_command('FILES',0);
            2 : FS_ReadList(true);
            3 : FS_ReadList(false);
          end;

     28 : case m1 of          { Optionen }
            1 : options;
            2 : UI_options;
            3 : ListOptions;
           13 : Editor_options;
           14 : ViewerOptions;   
            4 : msgoptions;
           12 : adroptions;
            6 : netcalloptions;
            9 : EditPassword;
           10 : _SetLanguage;
           11 : TerminalOptions;
          end;

     29 : case m1 of          { Brettindex }
            1 : ReorgBrettindex;
            2 : _AlphaBrettindex;
          end;

     30 : case m1 of          { Fido/Nodelisten }
            1 : UniEdit(5);
            2 : ManualDiff;
            3 : SetShrinkNodelist;
            4 : NodelistIndex;
            6 : NodeStatistik;
            7 : NodelistBrowser(false);
            8 : NodelistBrowser(true);
          end;

     31 : case m1 of          { Fido }
            1 : begin
                  NodelistBrowserButtonsDisabled:=true;
                  AutoCrash:=FidoRequest('','');
                  NodelistBrowserButtonsDisabled:=false;
                end;
            4 : begin
                  NodelistBrowserButtonsDisabled:=true;
                  if netcall(true,'',false,false,true) then;   { Crash   }
                  if (autocrash=' alle ') or (autocrash=CrashTemp) then begin
                    AutoTiming(iif(autocrash=CrashTemp,1,0),false,true,false,1);
                    autocrash:='';
                    end;
                  NodelistBrowserButtonsDisabled:=false;
                end;
            6 : FidoOptions;
          end;

     32 : case m1 of          { Fido/Fileliste }
            1 : ReadFidolist;
            2 : DelFidolist;
            3 : begin
                  NodelistBrowserButtonsDisabled:=true;
                  adr:=FidoSeekfile;
                  if (adr<>'') and netcall(true,adr,false,false,true) then;
                  NodelistBrowserButtonsDisabled:=false;
                end;
          end;

     33 : case m1 of          { Wartung / Sonstiges }
            1 : BezugNeuaufbau;
            2 : BezugReadmids;
            3 : Reorg_Stat(true,true);
            4 : bd_setzen(true);     { Datumsbezge wiederherstellen }
          end;

     36 : case m1 of           { Export }
            1 : ExportUB(true);
            2 : ExportUB(false);
            3 : MsgAll(8,aktdispmode,rdmode);
            4 : ScreenShot;
          end;

     37 : case m1 of          { Config/Optionen/Netze }
            1 : NetOptions;
            2 : SizeOptions;
            3 : NetEnable;
          end;

     38 : case m1 of          { Fido/Filescan }
            1 : AddFileechos;
            2 : RemoveFileechos;
            3 : FilescanCommands(1);
            4 : FilescanReadlist;
            5 : FilescanReadFile;
            6 : FilescanCommands(0);
          end;

     39 : begin
            case m1 of          { Config/Gebhren }
              1 : UniEdit(3);
              2 : UniEdit(6);
              3 : begin
                    Pushhp(979);
                    EditFile(FeierDat,false,false,false,0,false);
                    pophp;
                  end;
              4 : GebuehrOptions;
            end;
            menurestart:=true;
          end;

     40 : case m1 of            { Nachricht/PGP }
            1 : PGP_RequestKey;
            2 : PGP_ImportKey(false);
            3 : PGP_DecodeMsg(false);
            4 : PGP_DecodeMsg(true);
            6 : PGP_EditKey;
            7 : PGP_RemoveID;
          end;
     41 : begin                 { ? }
            case m1 of  
              1 : begin 
                    pushkey(keyesc);
                    pushkey(keyf1);
                    end;
              2 : hilfealt;
              3 : do_help(2);
              4 : do_help(3);
              5 : do_help(13);
              6 : begin
                    pushkey(keyesc);
                    pushkey(keyF6);
                    end; 
              8 : About;
            end;
            menurestart:=true;
          end;
     42 : begin                    { Spezielle Themen }
            case m1 of  
              1 : do_help(8079);   { MIME-Multipart-Anhnge }
              2 : do_help(1010);   { PGP-Verschlsselung }
              3 : do_help(12);     { XP und Mailinglisten }
              4 : do_help(30100);  { Netztyp RFC/Client }
              5 : do_help(11);     { XP als Windows-Mailer }
            end;
            menurestart:=true;
          end;

    end;
  until leaveconfig or not menurestart or (t=keyf4);
end;


procedure Maus_Auswertung(ya:shortint; var t:taste);
const lasty  : integer = 0;
      shortp : shortint = 0;
var x,y : integer;
    n,i : shortint;

  procedure page;
  begin
    if t=mauslmoved then begin
      if not keypressed then
        if y>lasty then t:=keypgdn
        else if y<lasty then t:=keypgup;
      end
    else
      if y<screenlines div 2 then t:=keypgup
      else t:=keypgdn;
  end;

  function shortkeypos(x:integer):shortint;
  var i : integer;
  begin
    i:=1;
    while (i<=shortkeys) and (x>shortkey[i].keypos+shortkey[i].keylen) do
      inc(i);
    if (i<=shortkeys) and (x>=shortkey[i].keypos-1) and
       (x<=shortkey[i].keypos+shortkey[i].keylen) then
      shortkeypos:=i
    else
      shortkeypos:=0;
  end;

  procedure dispshort(high:boolean);
  var x,c1,c2 : byte;
      ofs     : word;
      ks1,ks2 : byte;
  begin
    c1:=iif(high,col.colkeysact,col.colkeys);
    c2:=iif(high,col.colkeysacthi,col.colkeyshigh);
    with shortkey[shortp] do begin
      if keyspot>0 then begin
        ks1:=keyspot; ks2:=keyspot; end
      else begin
        ks1:=1; ks2:=-keyspot;
        end;
      if shortp<=maxskeys then ofs:=155+2*keypos 
      else begin
        ofs:=160*(screenlines-1)+2*keypos-1;
        if keypos=0 then ks1:=0;
        end;
      moff;
      for x:=1 to keylen+2 do
        if (x>ks1) and (x-1<=ks2) then
          mem[base:ofs+2*x]:=c2
        else
          mem[base:ofs+2*x]:=c1;
      mon;
      end;
  end;

  { Funktionstastenhandling fuer letzte Bildschirmzeile }

  function getfkeyfromscreen(x,y,mode:byte):byte; assembler;
  asm
         push ds 
         mov ds,vbase
         xor bx,bx  
         mov bl,x
         dec bx
         shl bx,1                 { BX=(X-1)*2 }
         mov al,y
         dec ax
         mov ah,160
         mul ah
         mov di,ax                { DI=160*(y-1) }
         cmp byte ptr [bx+di],' '
         jne @1
   @bye: mov ax,0
         jmp @end

   @1:   mov al,[bx+di]           { Es wurde auf Zeichen geklickt }
         cmp al,' '                   
         je @2
         sub bx,2
         jns @1
    
   @2:   cmp mode,0               { Schalter-Anfang gefunden } 
         je @getkey 
         mov ah,' '
         cmp mode,1
         je @getlen
         mov ah,'-'
         cmp mode,2
         je @getlen 


   @getpos:                       { Modus 3 : Anfangsposition }
         cmp bl,0
         jnl @@2
         mov bx,0 
   @@2:  shr bx,1
         mov al,bl
         jmp @end
    

   @getlen:                       { Modus 2 : Hotkeylaenge / Modus 1 : Highlightlaenge }
         mov al,-1 
         cmp bl,-2
         jne @@1 
         dec ax 
   @@1:  add bx,2
         inc al
         cmp byte ptr [bx+di],ah
         jne @@1
         jmp @end


   @getkey:                       { Modus 0 : Taste Zurueckliefern }
         mov ah,[bx+di+2]
         mov al,[bx+di+4]
         mov cl,[bx+di+6]
         mov ch,[bx+di+8]
          mov dl,58           {  59+x = Fx }
         cmp ah,'F'
         je @3   
         mov dl,83            {  83+x = ShiftFx }
         cmp ah,'S'
         je @3
         mov dl,93            {  93+x = CtrlFx } 
         cmp ah,'C'
         je @3
         mov dl,103
         cmp ah,'A'           { 103+x = AltFx }
         jne  @bye

   @3:   cmp al,'1'           { erste Ziffer }
         jb @bye
         cmp al,'9'
         ja @bye
         and al,0fh
         cmp cl,'-'
         je @4
         cmp ch,'-'
         jne @bye
    
         cmp cl,'0'           { evtl. 2. Ziffer }
         jb @bye
         cmp cl,'9'
         ja @bye
         and cl,0fh        
         mov ah,al            
         mov al,cl
         aad

   @4:   add al,dl            
         mov ah,0
   @end: pop ds 
  end;  
   
begin
  maus_gettext(x,y);
  if y=2 then begin                                                 {2. Menueleiste }
    n:=ShortkeyPos(x);
    if t=mausunleft then begin
      if (n>0) and (n=shortp) then t:=shortkey[n].key;
      if shortp>0 then begin
        dispshort(false); shortp:=0;
        end;
      end else
    if (t=mausleft) or (t=mausldouble) or ((t=mauslmoved) and (shortp>0))
    then begin
      if t=mauslmoved then dispshort(false);
      if n>0 then begin
        shortp:=n;
        dispshort(true);
        end;
      end else
  {  if (t=mauslmoved) and (shortp>0) then
      dispshort(n=shortp); }
    end
 
 else if y=screenlines then                                      { untere Menueleiste } 
  begin
   if (t=mausunright) and (shortp=maxskeys+1) then begin         {Rechtsklick}
      dispshort(false); shortp:=0; 
      if XPdisplayed and (x>(screenwidth-length(xp_display))) then begin
        if (shortkey[maxskeys+1].key='?') then About;
        end
     else begin
       n:=getfkeyfromscreen(x,y,0);
       if n>(screenwidth+3) then begin
         for i:=0 to ((n-4) mod 10)-1 do pushkey(keydown); 
         pushkey(keycr); 
         EditFkeys(((n-4) div 10)-7);
         end;
       end
     end else

   if (t=mausunleft) and (shortp=maxskeys+1) then begin          {Linksklick}
      dispshort(false); shortp:=0;
      if (XPdisplayed) and (x>(screenwidth-length(xp_display))) then begin
        if (shortkey[maxskeys+1].key='?') then pushkey(keyaltc);
        end
      else begin
        t:=#0+char(getfkeyfromscreen(x,y,0));
        if t<>shortkey[maxskeys+1].key then t:=#0#0;
        if (t=keyf1) or (t=keyF9)
        then begin
          pushkey(t);
          t:=#0#0;
          end;
        end;
      end else
    if (t=mausleft) or (t=mausright) or ((shortp=maxskeys+1)    {Rechts/Links gehalten}
        and ((t=mauslmoved) or (t=mausrmoved)))
    then begin
      if (t=mauslmoved) or (t=mausrmoved) then dispshort(false);
      if XPdisplayed and (x>(screenwidth-length(xp_display))) then begin
        shortp:=maxskeys+1;
        shortkey[maxskeys+1].key:='?';
        shortkey[maxskeys+1].keylen:=length(xp_display)+1;
        shortkey[maxskeys+1].keyspot:=0;
        shortkey[maxskeys+1].keypos:=(screenwidth-1)-length(xp_display);
        dispshort(true);
        end
      else if getfkeyfromscreen(x,y,0)>0 then begin
        shortp:=maxskeys+1;
        shortkey[maxskeys+1].key:=#0+char(getfkeyfromscreen(x,y,0));
        shortkey[maxskeys+1].keylen:=getfkeyfromscreen(x,y,1);
        shortkey[maxskeys+1].keyspot:=-getfkeyfromscreen(x,y,2);
        shortkey[maxskeys+1].keypos:=getfkeyfromscreen(x,y,3);
        dispshort(true);
        end;
      end;
    end

  else begin                                                        { Hauptfenster }
    if shortp<>0 then begin
      dispshort(false);
      if t=mausunleft then
        shortp:=0;
      end;

    if (y>=4+ya) and (y<screenlines-1) then begin
      if (t=mausright) {or (t=mausrmoved)} then t:=keyesc else
      if (t=mausleft) or (t=mauslmoved) then
        if (x>2) and (x<79) then p:=y-3-ya
        else page
      else
        if t=mausldouble then
          if (x>2) and (x<79) then
            if dispext and (dispmode in [0,1,2,20]) then
              t:='e'
            else
              t:=keycr
          else page;
      end else
    if (t=mausleft) then begin
      if y=1 then t:=mainkey(x);
      end;
    end;
  lasty:=y;
  mauskey:=(t<mausfirstkey) or (t>mauslastkey);
end;
