Software > Coding

Hilfe! evnt_multi() ignoriert Mausklick

(1/5) > >>

Count:
Hallo zusammen,

ich stehe mal wieder vor einem Rätsel und vielleicht kann mir einer von euch auf die Sprünge helfen, wonach ich suchen muss.

Und zwar habe ich ein GEM-Programm, um verschiedene Daten zu verwalten. Dafür gibt es unterschiedliche Eingabemasken, die in einem Fenster dargestellt werden. Die Masken können über das Pulldown-Menü aufgerufen werden oder auch über Hotkeys. Zu Beginn ist keine Maske geöffnet.

Rufe ich die erste Maske über das Pulldown-Menü auf, ist alles in Ordnung. Verwende ich dafür einen Hotkey, habe ich den Effekt, dass der erste Mausklick nicht erkannt wird. Dabei ist es unerheblich, ob ich vor dem Öffnen der Maske auf dem leeren Desktop rumgeklickt habe oder nicht.

Im Grunde ist es egal, ob ich die Maske über das Pulldown-Menü oder über den Hotkey aufrufe. Der Effekt tritt schlicht dann nicht auf, wenn ich vor dem ersten Öffnen einer Maske irgendwie das Pulldown-Menü aktiviert und die Maustaste gedrückt habe.

Das ganze passiert nur beim ersten Mal. D.h. wenn ich in eine andere Maske wechsle, tritt der Effekt nicht mehr auf.

Hier ist stark vereinfacht die Hauptschleife des Programms. Ich habe mir evnt_ret mal in eine Datei ausgeben lassen und es ist wirklich so, dass MU_BUTTON erst ab dem zweiten Drücken der Maustaste zurückgeliefert wird. Wie gesagt: Es sei denn, ich habe vorher das Pulldown-Menü verwendet und dort bereits einmal die Maustaste gedrückt.


--- Code: ---do {
    short evnt_ret;
    short msg[8];
    short mx, my, mk, key, kstat;

    evnt_ret = evnt_multi(MU_MESAG | MU_TIMER | MU_BUTTON | MU_KEYBD,
                          1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, msg, CURSOR_BLINK_RATE,
                          &mx, &my, &mk, &kstat, &key, NULL
                         );

    if ((evnt_ret & MU_TIMER) == MU_TIMER) {
        cursor_blink();
        continue;
    }

    if ((evnt_ret & MU_MESAG) != 0) {
        event_handling(msg);
    }

    if ((evnt_ret & MU_KEYBD) != 0) {
        DO_SOMETHING
    }

    if ((evnt_ret & MU_BUTTON) != 0) {
        DO_SOMETHING
    }
} while (...);
--- Ende Code ---

Was kann die Ursache sein?

KarlMüller:

--- Zitat von: Count am Mo 22.02.2021, 19:25:09 ---Was kann die Ursache sein?

--- Ende Zitat ---
Ist ein wenig schwierig zu sagen. Was meinst Du mit "Pulldown-Menü"? Eine mit menu_bar angemeldete Menüzeile?

Welche Lib benutzt Du denn?
Die Zeit für ein MU_TIMER Ereignis wird normalerweise mit zwei Werten angeben. ev_mtlocount, ev_mthicount, wie bei evnt_timer. Bei Dir sehe ich nur CURSOR_BLINK_RATE.

Chocco:
Mir fällt nur auf, dass nach Abfrage des Timer Event mit continue ans Ende der Schleife gesprungen wird. Da in einem Event durchaus mehrere Ereignisse zurückgegeben werden können, wird ein zusätzlich zu MU_TIMER gegebenes Ereignis hier ignoriert.

mfro:

--- Zitat von: KarlMüller am Mo 22.02.2021, 19:56:52 ---
--- Zitat von: Count am Mo 22.02.2021, 19:25:09 ---Was kann die Ursache sein?

--- Ende Zitat ---
Ist ein wenig schwierig zu sagen. Was meinst Du mit "Pulldown-Menü"? Eine mit menu_bar angemeldete Menüzeile?

Welche Lib benutzt Du denn?
Die Zeit für ein MU_TIMER Ereignis wird normalerweise mit zwei Werten angeben. ev_mtlocount, ev_mthicount, wie bei evnt_timer. Bei Dir sehe ich nur CURSOR_BLINK_RATE.

--- Ende Zitat ---

die mintlib für gcc will an dieser Stelle einen LONG-Wert anstatt der zwei WORDs sehen. Das passt schon.


--- Zitat von: Chocco am Mo 22.02.2021, 20:06:49 ---Mir fällt nur auf, dass nach Abfrage des Timer Event mit continue ans Ende der Schleife gesprungen wird. Da in einem Event durchaus mehrere Ereignisse zurückgegeben werden können, wird ein zusätzlich zu MU_TIMER gegebenes Ereignis hier ignoriert.

--- Ende Zitat ---
+1

Count:
Das mit dem Timer-Event passt schon:

(evnt_ret & MU_TIMER) == MU_TIMER

Also nur, wenn ausschließlich das Timer-Event aufgetreten ist.

@KarlMüller: Wie @mfro erwähnt, verwende ich Mintlib.

Kann es vielleicht mit wind_update()-Aufrufen zusammenhängen? Vielleicht mehr Begins als Ends? Das könnte ich noch überprüfen.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln