Samuel fiedler: Perl Maus Events über ANSI-Escapesequenzen auslesen

Hallo an alle!

Ich lese mich gerade in Perl ein. Ich wollte einen Taschenrechner schreiben.
Dies habe ich (noch) nicht getan. Erstmal habe ich überlegt, dass ich sehr wahrscheinlich Mouse Events wie in JavaScript bräuchte. Soweit ich weiß, gibt es viele Module dafür. Ich würde aber lieber die ANSI-Escapesequenz für Mouse-Events benutzen, da ich finde, dass ein Modul (meistens für GUI) zu viel ist, um ganz simpel einen Mausklick festzustellen.

Ich habe schon recht viel recherchiert und ich finde so gut wie nichts oder mir sagen die Ergebnisse nichts.

Ich wäre für einen Tipp (oder ein kleines Beispiel) dankbar.

Au revoir Bonjour,
Samuel Fiedler

  1. Hallo Samuel,

    ANSI-Escapesequenz für Mouse-Events

    So was gibt's?

    Für ein Projekt zum Einstieg vielleicht etwas komplex...

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo,

      ANSI-Escapesequenz für Mouse-Events

      So was gibt's?

      genau das hab ich mich auch gerade staunend gefragt.

      Für ein Projekt zum Einstieg vielleicht etwas komplex...

      Kommt drauf an. Wenn es wirklich ein Modul gibt, das Maus-Events in Steuerzeichen-Sequenzen umwandelt und in stdin zur Verfügung stellt, eventuell für Semi-GUI-Anwendungen mit ncurses oder so ... dann könnte es vielleicht auch recht überschaubar bleiben.

      Ich habe aber im Moment nicht die geringste Vorstellung, ob es das wirklich gibt und wenn ja, wie's funktioniert.

      Immer eine Handbreit Wasser unterm Kiel
       Martin

      --
      Wenn ich den See seh, brauch ich kein Meer mehr.
  2. Hi,

    Ich lese mich gerade in Perl ein. Ich wollte einen Taschenrechner schreiben.
    Dies habe ich (noch) nicht getan. Erstmal habe ich überlegt, dass ich sehr wahrscheinlich Mouse Events wie in JavaScript bräuchte.

    Erste Überlegung sollte sein: wie soll die Bedien-Oberfläche gestaltet werden?

    Damit meine ich jetzt nicht, welches Bedien-Element wo platziert wird, sondern die Technik.

    Also ob Du z.B. Perl/Tk Widgets benutzen willst oder wxPerl oder etwas anderes.

    Daraus ergibt sich dann ggf., wie Du auf Maus-Events reagieren kannst.

    cu,
    Andreas a/k/a MudGuard

    1. Hallo MudGuard!

      Erste Überlegung sollte sein: wie soll die Bedien-Oberfläche gestaltet werden?

      Ich wollte den Taschenrechner mit ASCII-Art (oder mit <STDIN>) bauen.

      Au revoir,
      Samuel Fiedler

  3. Hallo Samuel fiedler!

    Ich habe eine mögliche Lösung in einer Man Page gefunden: console_codes(4) - Linux manual page (Abschnitt “Mouse tracking“)

    Ich experimentiere mal rum.

    Au revoir,
    Samuel Fiedler

  4. Hallo Samuel fiedler!

    Kaum experimentiert man herum, kommt das nächste Problem:
    Ich habe es jetzt prinzipiell geschafft, dass das Terminal (da der Taschenrechner in ASCII-Art gebaut ist) alle Mausklicks zum Standard Input sendet. Nun stehe ich vor dem nächsten Problem:
    Wie kann ich in Perl die Eingabe, nachdem ich (bzw. das Terminal) eine bestimmte Zahl an Zeichen eingegeben habe (bzw. hat), abschicken?

    Au revoir,
    Samuel Fiedler

    1. Hallo Samuel,

      auf Konsolenebene ist es normalerweise so, dass es zwei Betriebsarten gibt: Line und Character (wie auch immer die im jeweiligen Kontext konkret heißen).

      Im Line Mode sammelt das Betriebssystem oder die Shell die Zeichen ein, ermöglicht ggf. eine Nachbearbeitung und wenn man ENTER drückt, gibt's für das Programm eine Zeile vonn Eingaben.

      Im Character Mode wird jedes Zeichen sofort an das Programm geschickt. Hat Vor- und Nachteile. Man kann auf jeden Tastendruck sofort reagieren - muss es aber eben auch. Eine zeilenweise Eingabe programmiert man dann selbst. Aber die brauchst Du für deinen Taschenrechner ja eher nicht.

      Die Konsole ist in den meisten Programmierumgebungen zwischen diesen Modi umschaltbar. Wie das auf deinem Betriebssystem mit Perl geht, müsstest Du bitte selbst herausfinden. Ich bin dagegen imprägniert: es perlt von mir ab.

      Je nach Betriebsart der Konsole muss man zumeist auch andere Funktionen verwenden, um davon zu lesen. Auch da müsstest Du recherchieren, wie das in Perl zu tun ist.

      Rolf (nicht Rost)

      --
      sumpsi - posui - obstruxi
      1. Hallo Rolf B!

        Vielen Dank für die Idee, dass man die Modi erstmal umschalten müsste.
        Sogleich habe ich dafür auch eine ANSI-Escapesequenz gefunden [1].

        Nun arbeite ich weiter. Bisher läuft alles gut.

        Ich wollte eine Eingabe machen, die genau 6 Zeichen lang ist, weil das Terminal die Maus-Events mit einer Länge von 6 Zeichen absendet. Die 6 Zeichen bedeuten:

        1. Das Escapezeichen (^[)
        2. Das Zeichen danach, was irgendeine Funktion aufruft ([)
        3. Ein Zeichen, um die Funktion zu definieren (in diesem Fall, sonst ist dieses Zeichen ja immer nach den Parametern) (M)
        4. Ein Zeichen, was die Maustaste bestimmt (das Zeichen muss im ASCII-Standard minus 32 gerechnet werden, beispielsweise = 32 - 32 = 0). Für den Fall, dass die Maustaste nicht 0 entspricht, wird alles übersprungen. Damit habe ich den Fehler behoben, dass ich bei einem Klick auf eine Zahl die Zahl zweimal verwendet wird (MouseUp & MouseDown).
        5. Ein Zeichen, was die X-Koordinate bestimmt (für weitere Informationen über den ASCII-Zeichensatz siehe Punkt 4). Dort wäre dann " eine 2. (" = 34 - 32 = 2)
        6. Ein Zeichen, was die Y-Koordinate bestimmt (für weitere Informationen über den ASCII-Zeichensatz siehe Punkt 4). Dort wäre dann ( eine 8. (" = 34 - 32 = 2)

        Die Kombination aus einer 2 und einer 8 wäre der Button 1 bei folgendem Display:

        TASCHENRECHNER
        ==============
        
        +---------------+
        |               |
        |               |
        +---+---+---+---+
        | 1 | 2 | 3 | + |
        +---+---+---+---+
        | 4 | 5 | 6 | - |
        +---+---+---+---+
        | 7 | 8 | 9 | * |
        +---+---+---+---+
        | . | 0 | = | / |
        +---+---+---+---+
        |    BEENDEN    |
        +---------------+
        
        2022 von Samuel Fiedler
        

        Au revoir,
        Samuel Fiedler


        1. Irgendwie finde ich ANSI-Escapesequenzen toll. ↩︎

        1. Hallo Samuel,

          ich hatte eher die Perl-Seite im Sinn. Kurzes Fragen bei Tante Google lieferte mir diesen Stackoverflow Thread:

          https://stackoverflow.com/questions/8676026/how-can-i-have-perl-take-input-from-stdin-one-character-at-a-time

          Rolf

          --
          sumpsi - posui - obstruxi