blob: d68533004a4dab5bf949032a1939daabe90ada91 [file] [log] [blame]
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +02001/*
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +02002 * Copyright © 2008 Kristian Høgsberg
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +02003 * Copyright © 2012 Intel Corporation
4 *
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.
14 *
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
21 * OF THIS SOFTWARE.
22 */
23
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +020024#include <stdint.h>
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +020025#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +020028#include <math.h>
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +020029#include <cairo.h>
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +020030
31#include <linux/input.h>
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +020032#include <wayland-client.h>
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +020033#include "window.h"
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +020034
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +020035struct transformed {
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +020036 struct display *display;
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +020037 struct window *window;
38 struct widget *widget;
39 int width, height;
40 int fullscreen;
Ander Conselvan de Oliveirab77aa062012-12-14 13:37:24 -020041 enum wl_shell_surface_fullscreen_method fullscreen_method;
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +020042};
43
44static void
Alexander Larssonfd456fb2013-05-22 14:41:26 +020045draw_stuff(cairo_t *cr, int width, int height)
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +020046{
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +020047 cairo_matrix_t m;
Alexander Larssonfd456fb2013-05-22 14:41:26 +020048 cairo_get_matrix (cr, &m);
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +020049
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +020050 cairo_translate(cr, width / 2, height / 2);
51 cairo_scale(cr, width / 2, height / 2);
52
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +020053 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);
56 cairo_fill(cr);
57
58 cairo_set_source_rgb(cr, 1, 0, 0);
59 cairo_move_to(cr, 0, 0);
60 cairo_line_to(cr, 0, -1);
61
62 cairo_save(cr);
Alexander Larssonfd456fb2013-05-22 14:41:26 +020063 cairo_set_matrix(cr, &m);
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +020064 cairo_set_line_width(cr, 2.0);
65 cairo_stroke(cr);
66 cairo_restore(cr);
67
68 cairo_set_source_rgb(cr, 0, 1, 0);
69 cairo_move_to(cr, 0, 0);
70 cairo_line_to(cr, 1, 0);
71
72 cairo_save(cr);
Alexander Larssonfd456fb2013-05-22 14:41:26 +020073 cairo_set_matrix(cr, &m);
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +020074 cairo_set_line_width(cr, 2.0);
75 cairo_stroke(cr);
76 cairo_restore(cr);
77
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);
83
84 cairo_save(cr);
Alexander Larssonfd456fb2013-05-22 14:41:26 +020085 cairo_set_matrix(cr, &m);
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +020086 cairo_set_line_width(cr, 2.0);
87 cairo_stroke(cr);
88 cairo_restore(cr);
89
90 cairo_destroy(cr);
91}
92
93static void
94fullscreen_handler(struct window *window, void *data)
95{
96 struct transformed *transformed = data;
97
98 transformed->fullscreen ^= 1;
99 window_set_fullscreen(window, transformed->fullscreen);
100}
101
102static void
Ander Conselvan de Oliveirab77aa062012-12-14 13:37:24 -0200103resize_handler(struct widget *widget, int width, int height, void *data)
104{
105 struct transformed *transformed = data;
106
107 if (transformed->fullscreen_method !=
108 WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT)
109 widget_set_size(widget, transformed->width, transformed->height);
110}
111
112static void
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200113redraw_handler(struct widget *widget, void *data)
114{
115 struct transformed *transformed = data;
116 struct rectangle allocation;
117 cairo_surface_t *surface;
Alexander Larssonfd456fb2013-05-22 14:41:26 +0200118 cairo_t *cr;
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200119
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");
124 return;
125 }
126
127 widget_get_allocation(transformed->widget, &allocation);
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200128
Alexander Larssonfd456fb2013-05-22 14:41:26 +0200129 cr = widget_cairo_create(widget);
130 draw_stuff(cr, allocation.width, allocation.height);
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200131
132 cairo_surface_destroy(surface);
133}
134
135static void
136output_handler(struct window *window, struct output *output, int enter,
137 void *data)
138{
139 if (!enter)
140 return;
141
142 window_set_buffer_transform(window, output_get_transform(output));
Alexander Larsson01441292013-05-22 14:41:30 +0200143 window_set_buffer_scale(window, output_get_scale(output));
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200144 window_schedule_redraw(window);
145}
146
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200147static void
148button_handler(struct widget *widget,
149 struct input *input, uint32_t time,
150 uint32_t button, enum wl_pointer_button_state state, void *data)
151{
152 struct transformed *transformed = data;
153
154 switch (button) {
155 case BTN_LEFT:
156 if (state == WL_POINTER_BUTTON_STATE_PRESSED)
157 window_move(transformed->window, input,
158 display_get_serial(transformed->display));
159 break;
160 case BTN_MIDDLE:
161 if (state == WL_POINTER_BUTTON_STATE_PRESSED)
162 widget_schedule_redraw(widget);
163 break;
164 case BTN_RIGHT:
165 if (state == WL_POINTER_BUTTON_STATE_PRESSED)
166 window_show_frame_menu(transformed->window, input, time);
167 break;
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +0200168 }
169}
170
Ander Conselvan de Oliveirab77aa062012-12-14 13:37:24 -0200171static void
172usage(int error_code)
173{
174 fprintf(stderr, "Usage: transformed [OPTIONS]\n\n"
175 " -d\t\tUse \"driver\" fullscreen method\n"
176 " -w <width>\tSet window width to <width>\n"
177 " -h <height>\tSet window height to <height>\n"
178 " --help\tShow this help text\n\n");
179
180 exit(error_code);
181}
182
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200183int main(int argc, char *argv[])
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +0200184{
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200185 struct transformed transformed;
186 struct display *d;
Ander Conselvan de Oliveirab77aa062012-12-14 13:37:24 -0200187 int i;
188
189 transformed.width = 500;
190 transformed.height = 250;
191 transformed.fullscreen = 0;
192 transformed.fullscreen_method =
193 WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT;
194
195 for (i = 1; i < argc; i++) {
196 if (strcmp(argv[i], "-d") == 0) {
197 transformed.fullscreen_method =
198 WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER;
199 } else if (strcmp(argv[i], "-w") == 0) {
200 if (++i >= argc)
201 usage(EXIT_FAILURE);
202
203 transformed.width = atol(argv[i]);
204 } else if (strcmp(argv[i], "-h") == 0) {
205 if (++i >= argc)
206 usage(EXIT_FAILURE);
207
208 transformed.height = atol(argv[i]);
209 } else if (strcmp(argv[i], "--help") == 0)
210 usage(EXIT_SUCCESS);
211 else
212 usage(EXIT_FAILURE);
213 }
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +0200214
Kristian Høgsberg4172f662013-02-20 15:27:49 -0500215 d = display_create(&argc, argv);
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200216 if (d == NULL) {
217 fprintf(stderr, "failed to create display: %m\n");
218 return -1;
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +0200219 }
220
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200221 transformed.display = d;
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200222 transformed.window = window_create(d);
223 transformed.widget =
224 window_add_widget(transformed.window, &transformed);
Ander Conselvan de Oliveirab77aa062012-12-14 13:37:24 -0200225
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200226 window_set_title(transformed.window, "Transformed");
Ander Conselvan de Oliveirab77aa062012-12-14 13:37:24 -0200227 window_set_fullscreen_method(transformed.window,
228 transformed.fullscreen_method);
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +0200229
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200230 widget_set_transparent(transformed.widget, 0);
Kristian Høgsbergbf74d522012-11-30 14:54:35 -0500231 widget_set_default_cursor(transformed.widget, CURSOR_BLANK);
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +0200232
Ander Conselvan de Oliveirab77aa062012-12-14 13:37:24 -0200233 widget_set_resize_handler(transformed.widget, resize_handler);
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200234 widget_set_redraw_handler(transformed.widget, redraw_handler);
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200235 widget_set_button_handler(transformed.widget, button_handler);
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +0200236
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200237 window_set_fullscreen_handler(transformed.window, fullscreen_handler);
238 window_set_output_handler(transformed.window, output_handler);
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +0200239
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200240 window_set_user_data(transformed.window, &transformed);
241 window_schedule_resize(transformed.window,
242 transformed.width, transformed.height);
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +0200243
Ander Conselvan de Oliveiraa06a8602012-11-30 17:34:26 +0200244 display_run(d);
Ander Conselvan de Oliveira1b4312d2012-11-27 17:03:44 +0200245
246 return 0;
247}