aboutsummaryrefslogtreecommitdiff
path: root/src/application.c
blob: 4f4811093f9c8bbad9896411804f97e1fa90e278 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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;
}