}
this->display->flush();
- // execute pending tasks, that is layout changes etc.
- // this->execute_pending();
-
return 0;
}
int App::dispatch_pending_events() {
- if (this->pending_events.load(std::memory_order_consume)) {
- this->pending_events.store(false, std::memory_order_release);
+ if (this->pop_pending_events()) {
+ assert(this->pending_events == false);
this->display->dispatch_pending();
return 0;
}
struct LayoutState state;
+ // Set by AFB API when wayland events need to be dispatched
std::atomic<bool> pending_events;
+ void set_pending_events() {
+ this->pending_events.store(true, std::memory_order_release);
+ }
+ bool pop_pending_events() {
+ bool x{true};
+ return this->pending_events.compare_exchange_strong(
+ x, false, std::memory_order_consume);
+ }
explicit App(wl::display *d);
~App();
{
STN(display_read_events);
g_afb_instance->app.display->read_events();
- g_afb_instance->app.pending_events.store(true, std::memory_order_release);
+ g_afb_instance->app.set_pending_events();
}
{
+ // We want do dispatch pending wayland events from within
+ // the API context
STN(winman_ping_api_call);
- afb_service_call("winman", "ping", json_object_new_object(), [](void *c, int st, json_object* j) {
- STN(winman_ping_api_call_return);
- }, nullptr);
+ afb_service_call("winman", "ping", json_object_new_object(),
+ [](void *c, int st, json_object *j) {
+ STN(winman_ping_api_call_return);
+ },
+ nullptr);
}
}