blob: 1f3ab7d8f7637812bf8e9cef1d5b9cd108ec0bc2 [file] [log] [blame]
Kristian Høgsbergffd710e2008-12-02 15:15:01 -05001/*
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -05002 * Copyright © 2008 Kristian Høgsberg
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that copyright
7 * notice and this permission notice appear in supporting documentation, and
8 * that the name of the copyright holders not be used in advertising or
9 * publicity pertaining to distribution of the software without specific,
10 * written prior permission. The copyright holders make no representations
11 * about the suitability of this software for any purpose. It is provided "as
12 * is" without express or implied warranty.
13 *
14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
20 * OF THIS SOFTWARE.
Kristian Høgsbergffd710e2008-12-02 15:15:01 -050021 */
22
Kristian Høgsberg96ce9682011-01-07 14:42:49 -050023#include "config.h"
24
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050025#include <stdint.h>
26#include <stdio.h>
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -050027#include <stdlib.h>
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050028#include <string.h>
29#include <fcntl.h>
30#include <unistd.h>
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -050031#include <math.h>
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050032#include <time.h>
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050033#include <glib.h>
34
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -050035#include <GL/gl.h>
Kristian Høgsberg3afd45d2010-03-03 09:54:29 -050036#include <EGL/egl.h>
37#include <EGL/eglext.h>
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050038
Kristian Høgsbergda1f30a2009-03-06 21:24:01 -050039#include "wayland-util.h"
Pekka Paalanen50719bc2011-11-22 14:18:50 +020040#include <wayland-client.h>
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050041
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050042#include "window.h"
43
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -050044struct gears {
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050045 struct window *window;
46
Kristian Høgsberg43c28ee2009-01-26 23:42:46 -050047 struct display *d;
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050048
49 EGLDisplay display;
Benjamin Franzkecff904e2011-02-18 23:00:55 +010050 EGLDisplay config;
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050051 EGLContext context;
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050052 GLfloat angle;
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050053
54 GLint gear_list[3];
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -050055};
56
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050057struct gear_template {
58 GLfloat material[4];
59 GLfloat inner_radius;
60 GLfloat outer_radius;
61 GLfloat width;
62 GLint teeth;
63 GLfloat tooth_depth;
64};
65
66const static struct gear_template gear_templates[] = {
67 { { 0.8, 0.1, 0.0, 1.0 }, 1.0, 4.0, 1.0, 20, 0.7 },
68 { { 0.0, 0.8, 0.2, 1.0 }, 0.5, 2.0, 2.0, 10, 0.7 },
69 { { 0.2, 0.2, 1.0, 1.0 }, 1.3, 2.0, 0.5, 10, 0.7 },
70};
71
72static GLfloat light_pos[4] = {5.0, 5.0, 10.0, 0.0};
73
74static void die(const char *msg)
75{
76 fprintf(stderr, "%s", msg);
77 exit(EXIT_FAILURE);
78}
79
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -050080static void
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050081make_gear(const struct gear_template *t)
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -050082{
83 GLint i;
84 GLfloat r0, r1, r2;
85 GLfloat angle, da;
86 GLfloat u, v, len;
87
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050088 glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, t->material);
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -050089
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -050090 r0 = t->inner_radius;
91 r1 = t->outer_radius - t->tooth_depth / 2.0;
92 r2 = t->outer_radius + t->tooth_depth / 2.0;
93
94 da = 2.0 * M_PI / t->teeth / 4.0;
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -050095
96 glShadeModel(GL_FLAT);
97
98 glNormal3f(0.0, 0.0, 1.0);
99
100 /* draw front face */
101 glBegin(GL_QUAD_STRIP);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500102 for (i = 0; i <= t->teeth; i++) {
103 angle = i * 2.0 * M_PI / t->teeth;
104 glVertex3f(r0 * cos(angle), r0 * sin(angle), t->width * 0.5);
105 glVertex3f(r1 * cos(angle), r1 * sin(angle), t->width * 0.5);
106 if (i < t->teeth) {
107 glVertex3f(r0 * cos(angle), r0 * sin(angle), t->width * 0.5);
108 glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), t->width * 0.5);
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500109 }
110 }
111 glEnd();
112
113 /* draw front sides of teeth */
114 glBegin(GL_QUADS);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500115 da = 2.0 * M_PI / t->teeth / 4.0;
116 for (i = 0; i < t->teeth; i++) {
117 angle = i * 2.0 * M_PI / t->teeth;
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500118
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500119 glVertex3f(r1 * cos(angle), r1 * sin(angle), t->width * 0.5);
120 glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), t->width * 0.5);
121 glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), t->width * 0.5);
122 glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), t->width * 0.5);
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500123 }
124 glEnd();
125
126 glNormal3f(0.0, 0.0, -1.0);
127
128 /* draw back face */
129 glBegin(GL_QUAD_STRIP);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500130 for (i = 0; i <= t->teeth; i++) {
131 angle = i * 2.0 * M_PI / t->teeth;
132 glVertex3f(r1 * cos(angle), r1 * sin(angle), -t->width * 0.5);
133 glVertex3f(r0 * cos(angle), r0 * sin(angle), -t->width * 0.5);
134 if (i < t->teeth) {
135 glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -t->width * 0.5);
136 glVertex3f(r0 * cos(angle), r0 * sin(angle), -t->width * 0.5);
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500137 }
138 }
139 glEnd();
140
141 /* draw back sides of teeth */
142 glBegin(GL_QUADS);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500143 da = 2.0 * M_PI / t->teeth / 4.0;
144 for (i = 0; i < t->teeth; i++) {
145 angle = i * 2.0 * M_PI / t->teeth;
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500146
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500147 glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -t->width * 0.5);
148 glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -t->width * 0.5);
149 glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -t->width * 0.5);
150 glVertex3f(r1 * cos(angle), r1 * sin(angle), -t->width * 0.5);
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500151 }
152 glEnd();
153
154 /* draw outward faces of teeth */
155 glBegin(GL_QUAD_STRIP);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500156 for (i = 0; i < t->teeth; i++) {
157 angle = i * 2.0 * M_PI / t->teeth;
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500158
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500159 glVertex3f(r1 * cos(angle), r1 * sin(angle), t->width * 0.5);
160 glVertex3f(r1 * cos(angle), r1 * sin(angle), -t->width * 0.5);
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500161 u = r2 * cos(angle + da) - r1 * cos(angle);
162 v = r2 * sin(angle + da) - r1 * sin(angle);
163 len = sqrt(u * u + v * v);
164 u /= len;
165 v /= len;
166 glNormal3f(v, -u, 0.0);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500167 glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), t->width * 0.5);
168 glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -t->width * 0.5);
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500169 glNormal3f(cos(angle), sin(angle), 0.0);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500170 glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), t->width * 0.5);
171 glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -t->width * 0.5);
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500172 u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
173 v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
174 glNormal3f(v, -u, 0.0);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500175 glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), t->width * 0.5);
176 glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -t->width * 0.5);
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500177 glNormal3f(cos(angle), sin(angle), 0.0);
178 }
179
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500180 glVertex3f(r1 * cos(0), r1 * sin(0), t->width * 0.5);
181 glVertex3f(r1 * cos(0), r1 * sin(0), -t->width * 0.5);
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500182
183 glEnd();
184
185 glShadeModel(GL_SMOOTH);
186
187 /* draw inside radius cylinder */
188 glBegin(GL_QUAD_STRIP);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500189 for (i = 0; i <= t->teeth; i++) {
190 angle = i * 2.0 * M_PI / t->teeth;
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500191 glNormal3f(-cos(angle), -sin(angle), 0.0);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500192 glVertex3f(r0 * cos(angle), r0 * sin(angle), -t->width * 0.5);
193 glVertex3f(r0 * cos(angle), r0 * sin(angle), t->width * 0.5);
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500194 }
195 glEnd();
196}
197
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500198static void
Benjamin Franzkecff904e2011-02-18 23:00:55 +0100199draw_gears(struct gears *gears)
Kristian Høgsberg2b43bd72010-11-08 15:45:55 -0500200{
Benjamin Franzkecff904e2011-02-18 23:00:55 +0100201 GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
202 struct rectangle window_allocation;
Kristian Høgsbergda846ca2011-01-11 10:00:52 -0500203 struct rectangle allocation;
Kristian Høgsberg2b43bd72010-11-08 15:45:55 -0500204
Kristian Høgsberg2b43bd72010-11-08 15:45:55 -0500205 window_draw(gears->window);
206
Kristian Høgsbergda846ca2011-01-11 10:00:52 -0500207 window_get_child_allocation(gears->window, &allocation);
Benjamin Franzkecff904e2011-02-18 23:00:55 +0100208 window_get_allocation(gears->window, &window_allocation);
Kristian Høgsberg2b43bd72010-11-08 15:45:55 -0500209
Benjamin Franzke1a89f282011-10-07 09:33:06 +0200210 if (display_acquire_window_surface(gears->d,
211 gears->window,
212 gears->context) < 0) {
213 die("Unable to acquire window surface, "
214 "compiled without cairo-egl?\n");
215 }
Benjamin Franzkecff904e2011-02-18 23:00:55 +0100216
217 glViewport(allocation.x,
218 window_allocation.height - allocation.height - allocation.x,
Kristian Høgsbergda846ca2011-01-11 10:00:52 -0500219 allocation.width, allocation.height);
Benjamin Franzkecff904e2011-02-18 23:00:55 +0100220 glScissor(allocation.x,
221 window_allocation.height - allocation.height - allocation.y,
222 allocation.width, allocation.height);
Kristian Høgsberg2b43bd72010-11-08 15:45:55 -0500223
224 glEnable(GL_SCISSOR_TEST);
Kristian Høgsberg78231c82008-11-08 15:06:01 -0500225 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Kristian Høgsbergb8bf19b2008-11-05 07:38:46 -0500226
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500227 glPushMatrix();
228
229 glTranslatef(0.0, 0.0, -50);
230
231 glRotatef(view_rotx, 1.0, 0.0, 0.0);
232 glRotatef(view_roty, 0.0, 1.0, 0.0);
233 glRotatef(view_rotz, 0.0, 0.0, 1.0);
234
235 glPushMatrix();
236 glTranslatef(-3.0, -2.0, 0.0);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500237 glRotatef(gears->angle, 0.0, 0.0, 1.0);
238 glCallList(gears->gear_list[0]);
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500239 glPopMatrix();
240
241 glPushMatrix();
242 glTranslatef(3.1, -2.0, 0.0);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500243 glRotatef(-2.0 * gears->angle - 9.0, 0.0, 0.0, 1.0);
244 glCallList(gears->gear_list[1]);
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500245 glPopMatrix();
246
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500247 glPushMatrix();
248 glTranslatef(-3.1, 4.2, 0.0);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500249 glRotatef(-2.0 * gears->angle - 25.0, 0.0, 0.0, 1.0);
250 glCallList(gears->gear_list[2]);
Kristian Høgsberg8a9cda82008-11-03 15:31:30 -0500251 glPopMatrix();
252
253 glPopMatrix();
254
255 glFlush();
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500256
Benjamin Franzke0c991632011-09-27 21:57:31 +0200257 display_release_window_surface(gears->d, gears->window);
Kristian Høgsberg2b43bd72010-11-08 15:45:55 -0500258 window_flush(gears->window);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500259}
260
261static void
Kristian Høgsbergda846ca2011-01-11 10:00:52 -0500262resize_handler(struct window *window,
263 int32_t width, int32_t height, void *data)
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500264{
265 struct gears *gears = data;
266
Kristian Høgsbergda846ca2011-01-11 10:00:52 -0500267 /* Constrain child size to be square and at least 300x300 */
268 if (width > height)
269 height = width;
270 else
271 width = height;
272 if (width < 300) {
273 width = 300;
274 height = 300;
275 }
276
277 window_set_child_size(gears->window, width, height);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500278}
279
280static void
Kristian Høgsberg9ae561d2009-09-21 13:47:53 -0400281keyboard_focus_handler(struct window *window,
Kristian Høgsberg43788b12010-07-28 23:50:12 -0400282 struct input *device, void *data)
Kristian Høgsberg9ae561d2009-09-21 13:47:53 -0400283{
284 struct gears *gears = data;
Kristian Høgsbergda846ca2011-01-11 10:00:52 -0500285 struct rectangle allocation;
Kristian Høgsberg9ae561d2009-09-21 13:47:53 -0400286
Kristian Høgsbergda846ca2011-01-11 10:00:52 -0500287 window_get_child_allocation(gears->window, &allocation);
288 resize_handler(window, allocation.width, allocation.height, gears);
Kristian Høgsberg2b43bd72010-11-08 15:45:55 -0500289}
290
291static void
Kristian Høgsberga8d1fa72011-08-23 18:14:06 -0400292frame_callback(void *data, struct wl_callback *callback, uint32_t time)
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500293{
Kristian Høgsberga8d1fa72011-08-23 18:14:06 -0400294 static const struct wl_callback_listener listener = {
295 frame_callback
296 };
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500297 struct gears *gears = data;
298
Kristian Høgsberg9d69f8e2010-09-03 14:46:38 -0400299 gears->angle = (GLfloat) (time % 8192) * 360 / 8192.0;
300
Kristian Høgsberg6da38122011-08-29 16:11:10 -0400301 draw_gears(gears);
Kristian Høgsberga8d1fa72011-08-23 18:14:06 -0400302
303 if (callback)
304 wl_callback_destroy(callback);
305
306 callback = wl_surface_frame(window_get_wl_surface(gears->window));
307 wl_callback_add_listener(callback, &listener, gears);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500308}
309
310static struct gears *
Kristian Høgsberg7824d812010-06-08 14:59:44 -0400311gears_create(struct display *display)
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500312{
Kristian Høgsberg82da52b2010-12-17 09:53:12 -0500313 const int width = 450, height = 500;
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500314 struct gears *gears;
315 int i;
316
317 gears = malloc(sizeof *gears);
318 memset(gears, 0, sizeof *gears);
Kristian Høgsberg43c28ee2009-01-26 23:42:46 -0500319 gears->d = display;
Kristian Høgsberg248c1b62011-01-21 18:03:15 -0500320 gears->window = window_create(display, width, height);
Benjamin Franzke0c991632011-09-27 21:57:31 +0200321 window_set_transparent(gears->window, 0);
Kristian Høgsberg248c1b62011-01-21 18:03:15 -0500322 window_set_title(gears->window, "Wayland Gears");
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500323
Kristian Høgsberg7824d812010-06-08 14:59:44 -0400324 gears->display = display_get_egl_display(gears->d);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500325 if (gears->display == NULL)
326 die("failed to create egl display\n");
327
Kristian Høgsbergf88ae452010-06-05 10:17:55 -0400328 eglBindAPI(EGL_OPENGL_API);
329
Benjamin Franzke0c991632011-09-27 21:57:31 +0200330 gears->config = display_get_rgb_egl_config(gears->d);
Benjamin Franzkecff904e2011-02-18 23:00:55 +0100331
332 gears->context = eglCreateContext(gears->display, gears->config,
333 EGL_NO_CONTEXT, NULL);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500334 if (gears->context == NULL)
335 die("failed to create context\n");
336
Kristian Høgsberga341fa02010-01-24 18:10:15 -0500337 if (!eglMakeCurrent(gears->display, NULL, NULL, gears->context))
338 die("faile to make context current\n");
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500339
340 for (i = 0; i < 3; i++) {
341 gears->gear_list[i] = glGenLists(1);
342 glNewList(gears->gear_list[i], GL_COMPILE);
343 make_gear(&gear_templates[i]);
344 glEndList();
345 }
346
347 glEnable(GL_NORMALIZE);
348
349 glMatrixMode(GL_PROJECTION);
350 glLoadIdentity();
351 glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 200.0);
352 glMatrixMode(GL_MODELVIEW);
353
354 glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
355 glEnable(GL_CULL_FACE);
356 glEnable(GL_LIGHTING);
357 glEnable(GL_LIGHT0);
358 glEnable(GL_DEPTH_TEST);
359 glClearColor(0, 0, 0, 0.92);
360
Kristian Høgsbergc8c37342010-06-25 11:19:22 -0400361 window_set_user_data(gears->window, gears);
362 window_set_resize_handler(gears->window, resize_handler);
363 window_set_keyboard_focus_handler(gears->window, keyboard_focus_handler);
Kristian Høgsberg9d69f8e2010-09-03 14:46:38 -0400364
Kristian Høgsberga8d1fa72011-08-23 18:14:06 -0400365 frame_callback(gears, NULL, 0);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500366
367 return gears;
368}
369
370int main(int argc, char *argv[])
371{
Kristian Høgsberg43c28ee2009-01-26 23:42:46 -0500372 struct display *d;
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500373
Kristian Høgsberg9de79a92011-08-24 11:09:53 -0400374 d = display_create(&argc, &argv, NULL);
Yuval Fledele9f5e362010-11-22 21:34:19 +0200375 if (d == NULL) {
376 fprintf(stderr, "failed to create display: %m\n");
377 return -1;
378 }
Kristian Høgsberg00439612011-01-25 15:16:01 -0500379 gears_create(d);
Kristian Høgsberg7824d812010-06-08 14:59:44 -0400380 display_run(d);
Kristian Høgsberg0c4457f2008-12-07 19:59:11 -0500381
382 return 0;
383}