diff options
author | 2023-05-17 17:23:34 +0200 | |
---|---|---|
committer | 2023-05-17 17:23:34 +0200 | |
commit | 09c7778c402e6bc2f07d6582034fa807988a262c (patch) | |
tree | c107bedb13b1c88bd7323108bf4bbfd969dc00bf /src/application.c | |
parent | 2c08b225c0e3b8b4eea754d1ebd62be7ac06b936 (diff) | |
download | cherry-09c7778c402e6bc2f07d6582034fa807988a262c.tar.gz cherry-09c7778c402e6bc2f07d6582034fa807988a262c.zip |
Add cherry_window_set_listener() function
With this function, a CherryWindow can listen events. At the moment, just this
listener is available.
Diffstat (limited to 'src/application.c')
-rw-r--r-- | src/application.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/application.c b/src/application.c index 4f48110..444dfc7 100644 --- a/src/application.c +++ b/src/application.c @@ -32,6 +32,53 @@ cherry_application_new(const char *name) return app; } +static void +dispatch_event(CherryApplication *app, Window wnd, int event_id) { + iterator_t it = clist_iterator(&app->windows); + while (clist_iterator_has_next(it)) { + CherryWindow *w = clist_iterator_next(&it); + if (w->window_handler == wnd) { + if (w->listener != NULL) { + w->listener(w, event_id); + } else { + return; + } + } + } +} + +static void +cherry_application_main_loop(CherryApplication *app) +{ + XEvent event; + int finish = 0; + char *atom_name; + + while (finish == 0) { + XNextEvent(app->display, &event); + + switch (event.type) { + case ClientMessage: + atom_name = XGetAtomName(app->display, (Atom) event.xclient.data.l[0]); + + if (strcmp("WM_DELETE_WINDOW", atom_name) == 0) { + dispatch_event(app, event.xclient.window, DELETE_WINDOW); + } + + XFree(atom_name); + break; + case Expose: + break; + case MappingNotify: + break; + case ButtonPress: + break; + case KeyPress: + break; + } + } +} + int cherry_application_run(CherryApplication *app, int argc, char **argv) { @@ -46,10 +93,13 @@ cherry_application_run(CherryApplication *app, int argc, char **argv) if (app->listener_activate != NULL) app->listener_activate(app, app->listener_activate_data); + cherry_application_main_loop(app); + /* finalization */ iterator_t it = clist_iterator(&app->windows); while (clist_iterator_has_next(it)) { CherryWindow *w = clist_iterator_next(&it); + char *wnd_name = cherry_window_get_title(w); printf("Destroying window: %s\n", wnd_name); XFree(wnd_name); |