static void output_handler(struct window *window, struct output *output, int enter, void *data) { if (!enter) return; window_set_buffer_transform(window, output_get_transform(output)); window_set_buffer_scale(window, output_get_scale(output)); window_schedule_redraw(window); }
static void key_handler(struct window *window, struct input *input, uint32_t time, uint32_t key, uint32_t sym, enum wl_keyboard_key_state state, void *data) { int transform, scale; if (state == WL_KEYBOARD_KEY_STATE_RELEASED) return; transform = window_get_buffer_transform (window); scale = window_get_buffer_scale (window); switch (sym) { case XKB_KEY_Left: if (transform == 0) transform = 3; else if (transform == 4) transform = 7; else transform--; break; case XKB_KEY_Right: if (transform == 3) transform = 0; else if (transform == 7) transform = 4; else transform++; break; case XKB_KEY_space: if (transform >= 4) transform -= 4; else transform += 4; break; case XKB_KEY_z: if (scale == 1) scale = 2; else scale = 1; break; } printf ("setting buffer transform to %d\n", transform); printf ("setting buffer scale to %d\n", scale); window_set_buffer_transform(window, transform); window_set_buffer_scale(window, scale); window_schedule_redraw(window); }
static void key_handler(struct window *window, struct input *input, uint32_t time, uint32_t key, uint32_t sym, enum wl_keyboard_key_state state, void *data) { struct fullscreen *fullscreen = data; int transform, scale; static int current_size = 0; struct fs_output *fsout; struct wl_output *wl_output; int widths[] = { 640, 320, 800, 400 }; int heights[] = { 480, 240, 600, 300 }; if (state == WL_KEYBOARD_KEY_STATE_RELEASED) return; switch (sym) { case XKB_KEY_t: transform = window_get_buffer_transform (window); transform = (transform + 1) % 8; window_set_buffer_transform(window, transform); window_schedule_redraw(window); break; case XKB_KEY_s: scale = window_get_buffer_scale (window); if (scale == 1) scale = 2; else scale = 1; window_set_buffer_scale(window, scale); window_schedule_redraw(window); break; case XKB_KEY_z: current_size = (current_size + 1) % 4; fullscreen->width = widths[current_size]; fullscreen->height = heights[current_size]; window_schedule_resize(fullscreen->window, fullscreen->width, fullscreen->height); break; case XKB_KEY_m: if (!fullscreen->fshell) break; wl_output = NULL; if (fullscreen->current_output) wl_output = output_get_wl_output(fullscreen->current_output->output); fullscreen->present_method = (fullscreen->present_method + 1) % 5; _wl_fullscreen_shell_present_surface(fullscreen->fshell, window_get_wl_surface(fullscreen->window), fullscreen->present_method, wl_output); window_schedule_redraw(window); break; case XKB_KEY_o: if (!fullscreen->fshell) break; fsout = fullscreen->current_output; wl_output = fsout ? output_get_wl_output(fsout->output) : NULL; /* Clear the current presentation */ _wl_fullscreen_shell_present_surface(fullscreen->fshell, NULL, 0, wl_output); if (fullscreen->current_output) { if (fullscreen->current_output->link.next == &fullscreen->output_list) fsout = NULL; else fsout = wl_container_of(fullscreen->current_output->link.next, fsout, link); } else { fsout = wl_container_of(fullscreen->output_list.next, fsout, link); } fullscreen->current_output = fsout; wl_output = fsout ? output_get_wl_output(fsout->output) : NULL; _wl_fullscreen_shell_present_surface(fullscreen->fshell, window_get_wl_surface(fullscreen->window), fullscreen->present_method, wl_output); window_schedule_redraw(window); break; case XKB_KEY_w: if (!fullscreen->fshell || !fullscreen->current_output) break; wl_output = NULL; if (fullscreen->current_output) wl_output = output_get_wl_output(fullscreen->current_output->output); _wl_fullscreen_shell_mode_feedback_destroy( _wl_fullscreen_shell_present_surface_for_mode(fullscreen->fshell, window_get_wl_surface(fullscreen->window), wl_output, 0)); window_schedule_redraw(window); break; case XKB_KEY_f: if (fullscreen->fshell) break; fullscreen->fullscreen ^= 1; window_set_fullscreen(window, fullscreen->fullscreen); break; case XKB_KEY_q: exit (0); break; } }
int main(int argc, char *argv[]) { struct box box; struct display *d; struct timeval tv; int i; d = display_create(&argc, argv); if (d == NULL) { fprintf(stderr, "failed to create display: %m\n"); return -1; } box.mode = MODE_SRC_DST; for (i = 1; i < argc; i++) { if (strcmp("-s", argv[i]) == 0) box.mode = MODE_SRC_ONLY; else if (strcmp("-d", argv[i]) == 0) box.mode = MODE_DST_ONLY; else if (strcmp("-b", argv[i]) == 0) box.mode = MODE_SRC_DST; else if (strcmp("-n", argv[i]) == 0) box.mode = MODE_NO_VIEWPORT; else { usage(argv[0]); exit(1); } } gettimeofday(&tv, NULL); srandom(tv.tv_usec); box.width = BUFFER_WIDTH / BUFFER_SCALE; box.height = BUFFER_HEIGHT / BUFFER_SCALE; box.display = d; box.window = window_create(d); box.widget = window_add_widget(box.window, &box); window_set_title(box.window, "Scaler Test Box"); window_set_buffer_scale(box.window, BUFFER_SCALE); widget_set_resize_handler(box.widget, resize_handler); widget_set_redraw_handler(box.widget, redraw_handler); widget_set_button_handler(box.widget, button_handler); widget_set_default_cursor(box.widget, CURSOR_HAND1); widget_set_touch_down_handler(box.widget, touch_down_handler); window_schedule_resize(box.window, box.width, box.height); display_set_user_data(box.display, &box); display_set_global_handler(box.display, global_handler); display_run(d); widget_destroy(box.widget); window_destroy(box.window); display_destroy(d); return 0; }