aboutsummaryrefslogtreecommitdiff
path: root/src/application.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/application.c')
-rw-r--r--src/application.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/application.c b/src/application.c
new file mode 100644
index 0000000..4f48110
--- /dev/null
+++ b/src/application.c
@@ -0,0 +1,93 @@
+/* See LICENSE file for copyright and license details. */
+
+#include <stdlib.h>
+#include <string.h>
+#include <X11/Xlib.h>
+#include <utils.h>
+#include "application.h"
+#include "event.h"
+#include "window.h"
+
+static CherryApplication *_app = NULL;
+
+CherryApplication *
+cherry_application_new(const char *name)
+{
+ if (_app != NULL)
+ return _app;
+
+ CherryApplication *app = malloc(sizeof(*app));
+ app->name = strdup(name);
+ app->display = NULL;
+ app->windows = clist_create();
+
+ app->listener_activate = NULL;
+ app->listener_activate_data = NULL;
+
+ app->listener_deactivate = NULL;
+ app->listener_deactivate_data = NULL;
+
+ _app = app;
+
+ return app;
+}
+
+int
+cherry_application_run(CherryApplication *app, int argc, char **argv)
+{
+ if (app == NULL) exit(1);
+
+ /* setup display/screen */
+ app->display = XOpenDisplay(NULL);
+ app->screen = DefaultScreen(app->display);
+ app->depth = DefaultDepth(app->display, app->screen);
+ app->visual = DefaultVisual(app->display, app->screen);
+
+ if (app->listener_activate != NULL)
+ app->listener_activate(app, app->listener_activate_data);
+
+ /* 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);
+ XDestroyWindow(app->display, w->window_handler);
+ }
+
+ XCloseDisplay(app->display);
+
+ if (app->listener_deactivate != NULL)
+ app->listener_deactivate(app, app->listener_deactivate_data);
+
+ return EXIT_SUCCESS;
+}
+
+void
+cherry_application_set_activated_listener(CherryApplication *app,
+ void (*listener_activate)(CherryApplication *, void *),
+ void *data)
+{
+ if (app == NULL) return;
+
+ app->listener_activate = listener_activate;
+ app->listener_activate_data = data;
+}
+
+void
+cherry_application_set_deactivated_listener(CherryApplication *app,
+ void (*listener_deactivate)(CherryApplication *, void *),
+ void *data)
+{
+ if (app == NULL) return;
+
+ app->listener_deactivate = listener_deactivate;
+ app->listener_deactivate_data = data;
+}
+
+CherryApplication *
+cherry_application_get_running_app(void)
+{
+ return _app;
+}