2 * Copyright © 2008 Kristian Høgsberg
3 * Copyright © 2012 Intel Corporation
5 * Permission to use, copy, modify, distribute, and sell this software and its
6 * documentation for any purpose is hereby granted without fee, provided that
7 * the above copyright notice appear in all copies and that both that copyright
8 * notice and this permission notice appear in supporting documentation, and
9 * that the name of the copyright holders not be used in advertising or
10 * publicity pertaining to distribution of the software without specific,
11 * written prior permission. The copyright holders make no representations
12 * about the suitability of this software for any purpose. It is provided "as
13 * is" without express or implied warranty.
15 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
17 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
18 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
19 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
20 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
31 #include <linux/input.h>
32 #include <wayland-client.h>
36 struct display *display;
37 struct window *window;
38 struct widget *widget;
41 enum wl_shell_surface_fullscreen_method fullscreen_method;
45 draw_stuff(cairo_t *cr, int width, int height)
48 cairo_get_matrix (cr, &m);
50 cairo_translate(cr, width / 2, height / 2);
51 cairo_scale(cr, width / 2, height / 2);
53 cairo_set_source_rgba(cr, 0, 0, 0.3, 1.0);
54 cairo_set_source_rgba(cr, 0, 0, 0, 1.0);
55 cairo_rectangle(cr, -1, -1, 2, 2);
58 cairo_set_source_rgb(cr, 1, 0, 0);
59 cairo_move_to(cr, 0, 0);
60 cairo_line_to(cr, 0, -1);
63 cairo_set_matrix(cr, &m);
64 cairo_set_line_width(cr, 2.0);
68 cairo_set_source_rgb(cr, 0, 1, 0);
69 cairo_move_to(cr, 0, 0);
70 cairo_line_to(cr, 1, 0);
73 cairo_set_matrix(cr, &m);
74 cairo_set_line_width(cr, 2.0);
78 cairo_set_source_rgb(cr, 1, 1, 1);
79 cairo_move_to(cr, 0, 0);
80 cairo_line_to(cr, 0, 1);
81 cairo_move_to(cr, 0, 0);
82 cairo_line_to(cr, -1, 0);
85 cairo_set_matrix(cr, &m);
86 cairo_set_line_width(cr, 2.0);
94 fullscreen_handler(struct window *window, void *data)
96 struct transformed *transformed = data;
98 transformed->fullscreen ^= 1;
99 window_set_fullscreen(window, transformed->fullscreen);
103 resize_handler(struct widget *widget, int width, int height, void *data)
105 struct transformed *transformed = data;
107 if (transformed->fullscreen_method !=
108 WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT)
109 widget_set_size(widget, transformed->width, transformed->height);
113 redraw_handler(struct widget *widget, void *data)
115 struct transformed *transformed = data;
116 struct rectangle allocation;
117 cairo_surface_t *surface;
120 surface = window_get_surface(transformed->window);
121 if (surface == NULL ||
122 cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS) {
123 fprintf(stderr, "failed to create cairo egl surface\n");
127 widget_get_allocation(transformed->widget, &allocation);
129 cr = widget_cairo_create(widget);
130 draw_stuff(cr, allocation.width, allocation.height);
132 cairo_surface_destroy(surface);
136 output_handler(struct window *window, struct output *output, int enter,
142 window_set_buffer_transform(window, output_get_transform(output));
143 window_set_buffer_scale(window, output_get_scale(output));
144 window_schedule_redraw(window);
148 key_handler(struct window *window, struct input *input, uint32_t time,
149 uint32_t key, uint32_t sym, enum wl_keyboard_key_state state,
152 int transform, scale;
154 if (state == WL_KEYBOARD_KEY_STATE_RELEASED)
157 transform = window_get_buffer_transform (window);
158 scale = window_get_buffer_scale (window);
163 else if (transform == 4)
172 else if (transform == 7)
193 printf ("setting buffer transform to %d\n", transform);
194 printf ("setting buffer scale to %d\n", scale);
195 window_set_buffer_transform(window, transform);
196 window_set_buffer_scale(window, scale);
197 window_schedule_redraw(window);
201 button_handler(struct widget *widget,
202 struct input *input, uint32_t time,
203 uint32_t button, enum wl_pointer_button_state state, void *data)
205 struct transformed *transformed = data;
209 if (state == WL_POINTER_BUTTON_STATE_PRESSED)
210 window_move(transformed->window, input,
211 display_get_serial(transformed->display));
214 if (state == WL_POINTER_BUTTON_STATE_PRESSED)
215 widget_schedule_redraw(widget);
218 if (state == WL_POINTER_BUTTON_STATE_PRESSED)
219 window_show_frame_menu(transformed->window, input, time);
225 touch_handler(struct widget *widget, struct input *input,
226 uint32_t serial, uint32_t time, int32_t id,
227 float x, float y, void *data)
229 struct transformed *transformed = data;
230 window_move(transformed->window, input, display_get_serial(transformed->display));
234 usage(int error_code)
236 fprintf(stderr, "Usage: transformed [OPTIONS]\n\n"
237 " -d\t\tUse \"driver\" fullscreen method\n"
238 " -w <width>\tSet window width to <width>\n"
239 " -h <height>\tSet window height to <height>\n"
240 " --help\tShow this help text\n\n");
245 int main(int argc, char *argv[])
247 struct transformed transformed;
251 transformed.width = 500;
252 transformed.height = 250;
253 transformed.fullscreen = 0;
254 transformed.fullscreen_method =
255 WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT;
257 for (i = 1; i < argc; i++) {
258 if (strcmp(argv[i], "-d") == 0) {
259 transformed.fullscreen_method =
260 WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER;
261 } else if (strcmp(argv[i], "-w") == 0) {
265 transformed.width = atol(argv[i]);
266 } else if (strcmp(argv[i], "-h") == 0) {
270 transformed.height = atol(argv[i]);
271 } else if (strcmp(argv[i], "--help") == 0)
277 d = display_create(&argc, argv);
279 fprintf(stderr, "failed to create display: %m\n");
283 transformed.display = d;
284 transformed.window = window_create(d);
286 window_add_widget(transformed.window, &transformed);
288 window_set_title(transformed.window, "Transformed");
289 window_set_fullscreen_method(transformed.window,
290 transformed.fullscreen_method);
292 widget_set_transparent(transformed.widget, 0);
293 widget_set_default_cursor(transformed.widget, CURSOR_BLANK);
295 widget_set_resize_handler(transformed.widget, resize_handler);
296 widget_set_redraw_handler(transformed.widget, redraw_handler);
297 widget_set_button_handler(transformed.widget, button_handler);
299 widget_set_touch_down_handler(transformed.widget, touch_handler);
301 window_set_key_handler(transformed.window, key_handler);
302 window_set_fullscreen_handler(transformed.window, fullscreen_handler);
303 window_set_output_handler(transformed.window, output_handler);
305 window_set_user_data(transformed.window, &transformed);
306 window_schedule_resize(transformed.window,
307 transformed.width, transformed.height);