← Dolaima← Docs indexGetting messages原文中文

Getting messages

How to receive touch / key / timer messages.

For the full list see "UI development". Each call below comes with a one-line usage note and an example; signatures come from Lib/c/vml_ui.h (the authoritative source).

ui_msg_get_a(void)

The first argument of the current message (the touch x, the key code, the timer id...).

int x = ui_msg_get_a();

ui_msg_get_b(void)

The second argument of the current message (the touch y...).

int y = ui_msg_get_b();

ui_msg_clear(void)

Empties the message queue (use it when switching scenes or starting a new round, so keystrokes from the previous round are not eaten by this one).

ui_msg_clear();

ui_msg_get_count(void)

How many messages are still queued (a glance at it tells you when to drop a backlog).

if (ui_msg_get_count() > 8) ui_msg_clear();

ui_msg_get_type(void)

The type of the current message (so you do not have to keep msg[0] in your head).

if (ui_msg_get_type() == VML_MSG_TOUCHDOWN) { /* handle it */ }

ui_msg_read(int* msg)

Does not wait: returns VML_MSG_NONE when there is no message. Use this for continuous animation (with your own pacing); event-driven programs use ui_msg_wait (which saves power the rest of the time). Note: it takes only int* msg - there is no timeout, so do not write it the way you write ui_msg_wait.

int m[4];
while (ui_win_is_closed() == 0) {
    if (ui_msg_read(m) == VML_MSG_TOUCHDOWN) { /* handle it */ }
    /* draw a frame */
    ui_2d_present();
}

ui_msg_read_ex(int* msg, int keep)

The version of ui_msg_read that lets you choose whether the message is kept or consumed after reading.

int m[4];
ui_msg_read_ex(m, VML_MSG_CONSUME);

ui_msg_fetch(void)

The pointer-free version (for languages that cannot get an array pointer): returns VML_MSG_NONE when there is nothing, and the arguments are read with ui_msg_get_a() / ui_msg_get_b().

if (ui_msg_fetch() == VML_MSG_TOUCHDOWN) { int x = ui_msg_get_a(); int y = ui_msg_get_b(); }

ui_msg_wait(int* msg, int timeout_ms)

Waits for one message; the argument is int msg[4]. Returns the message type (see the table below); timeout=0 means wait forever.

int m[4];
int t = ui_msg_wait(m, 0);   /* wait forever */

ui_msg_wait_ex(int* msg, int timeout_ms, int keep)

The same; the third argument decides whether the message is kept or consumed after it is read (VML_MSG_KEEP / VML_MSG_CONSUME).

int m[4];
ui_msg_wait_ex(m, 0, VML_MSG_KEEP);   /* do not pop it after reading */

ui_msg_fetch_wait(int timeout_ms)

The pointer-free waiting version: returns the type when one arrives, or VML_MSG_NONE on timeout.

if (ui_msg_fetch_wait(500) == VML_MSG_TIMER) { /* one tick has passed */ }