zeitstempel von mouseclicks aufzeichnen und noch ein paar kleinigkeiten

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
michaa7
Beiträge: 4917
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

zeitstempel von mouseclicks aufzeichnen und noch ein paar kleinigkeiten

Beitrag von michaa7 » 31.12.2020 00:54:21

Hi,

wie könnte ich mir Zeitstempel (sek:msek) oder die Zeitdifferenz zum Start für ein paar mouseclicks in einer textdatei aufzeichnen? (Vielleicht max. 30 sek.) (ob tatsächlich msek notwendig ist weiß ich nciht, aber ich denke das ist im Audiobereich so die minimal sinnvolle/ übliche Größenordnung, 1/100 täte es aber vermutl. auch))

Wie könnte man damit, also den aufgezeichneten Zeitstempeln ein deutliches optisches Signal steuern, beispielsweise den in der Regel dunklen HG eines VT kurz hell aufblinken lassen?


Am besten startet ein script eine sounddatei UND die Aufzeichnung der Mausklicks. Dann sehen wir weiter.

Code: Alles auswählen

#!/bin/bash

sleep 5

cvlc '<sounddatei.ext>'

# Hier sollte nun die Funktion stehen welche die zeitstempel von ein paar mouseclicks 
# aufzeichnet während <sounddatei.ext> abgespielt wird. Irgendwie müsste man es noch 
# schaffen, dass die programme zeitgleich oder mit definiertem Zeitunterschied starten ? 

:?


Das Ganze soll mir Unterstützung beim Abspielen von Begleitmusik bieten, wenn/falls es fertig ist/wird.
(Ich habe auch eine unfertige Version der Problemstellung in Romanlänge, wollte mich dann nach 20 Minuten Beschreibung der Aufgabenstellung doch eher kürzer fassen ... und erstmal kleinere Brötchen backen, daher diese ersten Schritte. Ich habe kaum script-Kenntnisse und es warten noch viel tolle Fragen auf euch :) :mrgreen: )
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

brummer
Beiträge: 181
Registriert: 19.02.2007 19:21:23

Re: zeitstempel von mouseclicks aufzeichnen und noch ein paar kleinigkeiten

Beitrag von brummer » 02.01.2021 10:18:45

Ich habe zwar keine Ahnung wie man das mit bash machen könnte, aber in C ist das relative einfach.
Hier ist ein kleines Programm welches dir den Zeitunterschied zwischen zwei mausklicks ausgibt.

Code: Alles auswählen

// gcc grabmouse.c -lX11 -o  grabmouse

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

int main(int argc, char *argv[])
{
  Display *dpy;
  Window win;
  int scr;
  Atom WM_DELETE_WINDOW;
  XEvent ev;
  int loop;
  int msec = 0;
  int cur_msec = 0;

  /* open connection with the server */
  dpy = XOpenDisplay(NULL);
  if (dpy == NULL) {
    fputs("Cannot open display", stderr);
    exit(1);
  }
  scr = XDefaultScreen(dpy);

  /* create window */
  win = XCreateWindow(dpy, XRootWindow(dpy, scr) , 0, 0, 1, 1, 0,
                      CopyFromParent, InputOnly, CopyFromParent,
                      CopyFromParent, 0);

  /* select kind of events we are interested in */
  XSelectInput(dpy, win, ButtonPressMask);

  /* grab button press on root window */
  XGrabButton(dpy, AnyButton, AnyModifier, DefaultRootWindow(dpy),
               True, ButtonPressMask | ButtonReleaseMask, GrabModeSync, 
               GrabModeAsync, None, None); 
 
  /* connect the close button in the window handle */
  WM_DELETE_WINDOW = XInternAtom(dpy, "WM_DELETE_WINDOW", True);
  XSetWMProtocols(dpy, win, &WM_DELETE_WINDOW, 1);

  fprintf(stderr, "Press ctrl + c to quit\n");  
  /* event loop */
  loop = 1;
  while (loop) {
    XNextEvent(dpy, &ev);
    switch (ev.type)
    {
      case ButtonPress:
        if (!msec) msec = ev.xbutton.time;
        cur_msec = ev.xbutton.time - msec;
        fprintf(stderr,"Button%i Press event received at %i msec\n", 
            ev.xbutton.button, cur_msec);
        msec = ev.xbutton.time;
        XAllowEvents(dpy, ReplayPointer, ev.xbutton.time);
        XSync(dpy, 0);
        break;
      default:
        break;
    }
  }
  XDestroyWindow(dpy, win);
  /* close connection to server */
  XCloseDisplay(dpy);
  return 0;
}

michaa7
Beiträge: 4917
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: zeitstempel von mouseclicks aufzeichnen und noch ein paar kleinigkeiten

Beitrag von michaa7 » 02.01.2021 15:07:28

brummer hat geschrieben: ↑ zum Beitrag ↑
02.01.2021 10:18:45
aber in C ist das relative einfach.
Danke für deine Mühe, bei all den vielen Zugriffen auf meinen Post wenigstens eine Antwort. Allerdings bin ich ja nicht nur script Anfänger. Mir geht es mit C so wie dem Durchschnittseuropäer mit Chinesisch: wir verwechseln das gerne mal mit Japanisch und das übersetzen geht uns nicht ganz so flüssig von der Hand ... ;-)
brummer hat geschrieben: ↑ zum Beitrag ↑
02.01.2021 10:18:45
Ich habe zwar keine Ahnung wie man das mit bash machen könnte,
Da habe ich erste Fortschrite gemacht, mit hilfe von "cnee":

Zeichnet die mouseevents auf und speichte sie in test1.xnl

Code: Alles auswählen

cnee --record --events-to-record -1 --stop-key q --mouse -o test1.xnl  -e xnee.log -v
Ergebnis zweier mouseklicks (gekürzt):
...
reply-range 0-0
extension-request-major-range 0-0
extension-request-minor-range 0-0
extension-reply-major-range 0-0
extension-reply-minor-range 0-0
delivered-event-range 0-0
device-event-range 69-71
error-range 0-0
7,4,0,0,1,0,0,13769984,9,USB OPTICAL MOUSE
6,4,0,0,1,0,0,13769984,2,Virtual core pointer
7,5,0,0,1,0,0,13770424,9,USB OPTICAL MOUSE
6,5,0,0,1,0,0,13770424,2,Virtual core pointer
7,4,0,0,1,0,0,13771816,9,USB OPTICAL MOUSE
6,4,0,0,1,0,0,13771816,2,Virtual core pointer
7,5,0,0,1,0,0,13772123,9,USB OPTICAL MOUSE
6,5,0,0,1,0,0,13772123,2,Virtual core pointer
Interessant sind für mich nur die Zeilen, die am ende "USB OPTICAL MOUSE" lauten (was sich einfach grepen läßt) ***UND*** wo die zweite kommaseparierte Reihe (wenn ich das hier mal so nennen darf) auf "4" lautet (blau fett markiert auf die betreffenden USB OPTICAL MOUSE Zeilen beschränkt), was nicht so einfach verlässlich zu grepen ist.

Reihe 8 zeigt den Zeitpunkt des Ereignisses im ms seit x-Server-Start, die Differenz dieses Wertes in der fünftletzten Zeile (grün markiert) minus achtletzten Zeile (grün markiert) = 13771816-13769984 = 1832 ms = 1,832 s .

Das hier

Code: Alles auswählen

grep "USB OPTICAL MOUSE" test1.xnl | grep ,4, | cut --delimiter=, -f 8 > neu.xnl
... tut es zwar, aber weil ",4," potentiell auch in anderen Reihen vorkommen könnte würde ich das gerne auf ",4," in der zweiten Reihe, also nach dem ersten Komma beschränken.

Wie ginge das?

Danke vorab.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: zeitstempel von mouseclicks aufzeichnen und noch ein paar kleinigkeiten

Beitrag von eggy » 02.01.2021 15:38:51

awk ist in solchen Fällen gut geeignet, weil es die Eingabe Zeilenweise bearbeitet und man ein Feldtrennzeichen bestimmen kann (-F) :

Code: Alles auswählen

awk -F"," '$2==4{print $0}' 
die Felder sind ab 1 durchnummeriert ($1, $2, ...) die ganze Zeile gibts als $0.
Das in den {} nennt man Anweisungsblock, da stehen die Befehle drin, was er mit den gefundenen Zeilen machen soll. Du könntest da jetzt die Zeit anders darstellen etc, kommt drauf an was Du haben willst. Das vor den Klammern ist das "Pattern" auf das getestet wird. Da geht auch sowas wie "$2==4 && $3==0" das würde dann schauen dass beides stimmt, könntest also Abzählen wo USB Maus drinstehen soll und das entsprechend testen.

michaa7
Beiträge: 4917
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: zeitstempel von mouseclicks aufzeichnen und noch ein paar kleinigkeiten

Beitrag von michaa7 » 02.01.2021 16:29:21

Danke. Dass awk (und/oder sed) für derartiges gut geeignet sind war mir klar ... aber auch dass das optionschaos für mich undurchdringlich ist (zumal die Baustellen für mein kleines Projekt hier viele sind). Doppelt dank daher für deine Hilfe.

Das klappt.

Code: Alles auswählen

$ awk -F"," '$9==9{print $0}' test1.xnl
7,4,0,0,1,0,0,13769984,9,USB OPTICAL MOUSE
7,5,0,0,1,0,0,13770424,9,USB OPTICAL MOUSE
7,4,0,0,1,0,0,13771816,9,USB OPTICAL MOUSE
7,5,0,0,1,0,0,13772123,9,USB OPTICAL MOUSE


Das ist zwar das ergebnis welches ich habe möchte:

Code: Alles auswählen

 awk -F"," '$2==4 && $9==9{print $8}' test1.xnl
13769984
13771816
aber das ist nur ein test mit der falschen spalte ($9)weil

Code: Alles auswählen

$ awk -F"," '$2==4 && $10==USB{print $0}' test1*.xnl
nichts ausgibt.

Irgendwas stimmt mit dem "awken" und text nicht:

Code: Alles auswählen

awk -F"," '$10==USB{print $0}' test1*
awket ***alle*** nicht CSV Zeilen der ausgabe:
...
extension-request-major-range 0-0
extension-request-minor-range 0-0
extension-reply-major-range 0-0
extension-reply-minor-range 0-0
delivered-event-range 0-0
device-event-range 66-66
error-range 0-0
# RecordRange[2]
request-range 0-0
reply-range 0-0
extension-request-major-range 0-0
extension-request-minor-range 0-0
extension-reply-major-range 0-0
...
Hast du einen Ahnung warum?
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: zeitstempel von mouseclicks aufzeichnen und noch ein paar kleinigkeiten

Beitrag von tobo » 02.01.2021 16:33:21

michaa7 hat geschrieben: ↑ zum Beitrag ↑
02.01.2021 15:07:28
Das hier

Code: Alles auswählen

grep "USB OPTICAL MOUSE" test1.xnl | grep ,4, | cut --delimiter=, -f 8 > neu.xnl
... tut es zwar, aber weil ",4," potentiell auch in anderen Reihen vorkommen könnte würde ich das gerne auf ",4," in der zweiten Reihe, also nach dem ersten Komma beschränken.

Wie ginge das?
Bezieht sich ja auf eine Zeile, kannst du also hintereinander schreiben:

Code: Alles auswählen

grep '^[0-9],4,.*USB OPTICAL MOUSE' test1.xnl

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: zeitstempel von mouseclicks aufzeichnen und noch ein paar kleinigkeiten

Beitrag von eggy » 02.01.2021 17:00:55

michaa7 hat geschrieben: ↑ zum Beitrag ↑
02.01.2021 16:29:21
aber das ist nur ein test mit der falschen spalte ($9)weil

Code: Alles auswählen

$ awk -F"," '$2==4 && $10==USB{print $0}' test1*.xnl
nichts ausgibt.
Da fragst Du nach 'Feld zwei genau 4 und Feld 10 genau USB', in Feld 10 steht aber mehr drin.
Versuchs mal mit

Code: Alles auswählen

 awk -F "," '$2==4 && $10~/USB/{print $0}' 

michaa7
Beiträge: 4917
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: zeitstempel von mouseclicks aufzeichnen und noch ein paar kleinigkeiten

Beitrag von michaa7 » 02.01.2021 17:25:51

Danke.

Ich hatte versucht das gesamte Suchkriterium einzugeben, wusste aber nicht wie ich das wg. der Leerzeichen zusammenbinden kann und habe, wie ich nun sehe fälschlicherweise " " ausgeschlossen, weil ja schon ein ' ' ganz außen herum vorhanden war. Aber so geht es doch genauso wie dein weiterer Vorschlag:

Code: Alles auswählen

$ awk -F"," '$2==4 && $10=="USB OPTICAL MOUSE"{print $8}' test1*.xnl
13769984
13771816

Code: Alles auswählen

$ awk -F"," '$2==4 && $10~/USB/{print $8}' test1*.xnl
13769984
13771816
Jetzt sollte ich mich mal mit dem Anweisungsblock beschäftigen um zusehen wie ich das am besten weiterverarbeite. In der Realität werden das ja mehr als 2 Zeitstempel mit denen ich dann noch im Script rechnen will.

Danke soweit. Jetzt muss ich erstmal anderes erledigen ...
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

Antworten