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 demoapp *app = data; struct rectangle winrect; if (state == WL_KEYBOARD_KEY_STATE_RELEASED) return; switch (sym) { case XKB_KEY_space: app->animate = !app->animate; window_schedule_redraw(window); break; case XKB_KEY_Up: window_get_allocation(window, &winrect); winrect.height -= 100; if (winrect.height < 150) winrect.height = 150; window_schedule_resize(window, winrect.width, winrect.height); break; case XKB_KEY_Down: window_get_allocation(window, &winrect); winrect.height += 100; if (winrect.height > 600) winrect.height = 600; window_schedule_resize(window, winrect.width, winrect.height); break; case XKB_KEY_Escape: display_exit(app->display); break; } }
static void draw_gears(struct gears *gears) { GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0; struct rectangle window_allocation; struct rectangle allocation; window_draw(gears->window); window_get_child_allocation(gears->window, &allocation); window_get_allocation(gears->window, &window_allocation); display_acquire_window_surface(gears->d, gears->window, gears->context); glViewport(allocation.x, window_allocation.height - allocation.height - allocation.x, allocation.width, allocation.height); glScissor(allocation.x, window_allocation.height - allocation.height - allocation.y, allocation.width, allocation.height); glEnable(GL_SCISSOR_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(0.0, 0.0, -50); glRotatef(view_rotx, 1.0, 0.0, 0.0); glRotatef(view_roty, 0.0, 1.0, 0.0); glRotatef(view_rotz, 0.0, 0.0, 1.0); glPushMatrix(); glTranslatef(-3.0, -2.0, 0.0); glRotatef(gears->angle, 0.0, 0.0, 1.0); glCallList(gears->gear_list[0]); glPopMatrix(); glPushMatrix(); glTranslatef(3.1, -2.0, 0.0); glRotatef(-2.0 * gears->angle - 9.0, 0.0, 0.0, 1.0); glCallList(gears->gear_list[1]); glPopMatrix(); glPushMatrix(); glTranslatef(-3.1, 4.2, 0.0); glRotatef(-2.0 * gears->angle - 25.0, 0.0, 0.0, 1.0); glCallList(gears->gear_list[2]); glPopMatrix(); glPopMatrix(); glFlush(); display_release(gears->d); window_flush(gears->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 resizor *resizor = data; struct rectangle allocation; if (state == WL_KEYBOARD_KEY_STATE_RELEASED) return; window_get_allocation(resizor->window, &allocation); resizor->width.current = allocation.width; if (spring_done(&resizor->width)) resizor->width.target = allocation.width; resizor->height.current = allocation.height; if (spring_done(&resizor->height)) resizor->height.target = allocation.height; switch (sym) { case XKB_KEY_Up: if (allocation.height < 400) break; resizor->height.target = allocation.height - 200; break; case XKB_KEY_Down: if (allocation.height > 1000) break; resizor->height.target = allocation.height + 200; break; case XKB_KEY_Left: if (allocation.width < 400) break; resizor->width.target = allocation.width - 200; break; case XKB_KEY_Right: if (allocation.width > 1000) break; resizor->width.target = allocation.width + 200; break; case XKB_KEY_Escape: display_exit(resizor->display); break; } if (!resizor->frame_callback) frame_callback(resizor, NULL, 0); }
static void button_handler(struct widget *widget, struct input *input, uint32_t time, uint32_t button, enum wl_pointer_button_state state, void *data) { struct resizor *resizor = data; struct rectangle allocation; struct wl_surface *surface; struct wl_callback *callback; if (button == BTN_RIGHT && state == WL_POINTER_BUTTON_STATE_PRESSED) { show_menu(resizor, input, time); } else if (button == BTN_LEFT && state == WL_POINTER_BUTTON_STATE_PRESSED) { window_get_allocation(resizor->window, &allocation); resizor->width.current = allocation.width; resizor->width.previous = allocation.width; resizor->width.target = allocation.width; resizor->height.current = allocation.height; resizor->height.previous = allocation.height; resizor->height.target = allocation.height; window_lock_pointer(resizor->window, input); window_set_pointer_locked_handler(resizor->window, handle_pointer_locked, handle_pointer_unlocked); resizor->locked_input = input; if (resizor->locked_frame_callback_registered) return; surface = window_get_wl_surface(resizor->window); callback = wl_surface_frame(surface); wl_callback_add_listener(callback, &locked_pointer_frame_listener, resizor); resizor->locked_frame_callback_registered = true; } else if (button == BTN_LEFT && state == WL_POINTER_BUTTON_STATE_RELEASED) { input_set_pointer_image(input, CURSOR_LEFT_PTR); window_unlock_pointer(resizor->window); } }
static void redraw_handler(struct widget *widget, void *data) { struct ModeInfo *mi = data; struct wscreensaver *wscr = mi->priv; struct rectangle drawarea; struct rectangle winarea; struct wl_callback *callback; int bottom; mi->swap_buffers = 0; widget_get_allocation(mi->widget, &drawarea); window_get_allocation(mi->window, &winarea); if (display_acquire_window_surface(wscr->display, mi->window, mi->eglctx) < 0) { fprintf(stderr, "%s: unable to acquire window surface", progname); return; } bottom = winarea.height - (drawarea.height + drawarea.y); glViewport(drawarea.x, bottom, drawarea.width, drawarea.height); glScissor(drawarea.x, bottom, drawarea.width, drawarea.height); glEnable(GL_SCISSOR_TEST); if (mi->width != drawarea.width || mi->height != drawarea.height) { mi->width = drawarea.width; mi->height = drawarea.height; wscr->plugin->reshape(mi, mi->width, mi->height); } wscr->plugin->draw(mi); if (mi->swap_buffers == 0) fprintf(stderr, "%s: swapBuffers not called\n", progname); display_release_window_surface(wscr->display, mi->window); callback = wl_surface_frame(window_get_wl_surface(mi->window)); wl_callback_add_listener(callback, &listener, mi); }
static void redraw_handler(struct widget *widget, void *data) { struct rectangle window_allocation; struct rectangle allocation; struct wl_callback *callback; struct gears *gears = data; widget_get_allocation(gears->widget, &allocation); window_get_allocation(gears->window, &window_allocation); if (display_acquire_window_surface(gears->d, gears->window, gears->context) < 0) { die("Unable to acquire window surface, " "compiled without cairo-egl?\n"); } glViewport(allocation.x, window_allocation.height - allocation.height - allocation.y, allocation.width, allocation.height); glScissor(allocation.x, window_allocation.height - allocation.height - allocation.y, allocation.width, allocation.height); glEnable(GL_SCISSOR_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(0.0, 0.0, -50); glRotatef(gears->view.rotx, 1.0, 0.0, 0.0); glRotatef(gears->view.roty, 0.0, 1.0, 0.0); glPushMatrix(); glTranslatef(-3.0, -2.0, 0.0); glRotatef(gears->angle, 0.0, 0.0, 1.0); glCallList(gears->gear_list[0]); glPopMatrix(); glPushMatrix(); glTranslatef(3.1, -2.0, 0.0); glRotatef(-2.0 * gears->angle - 9.0, 0.0, 0.0, 1.0); glCallList(gears->gear_list[1]); glPopMatrix(); glPushMatrix(); glTranslatef(-3.1, 4.2, 0.0); glRotatef(-2.0 * gears->angle - 25.0, 0.0, 0.0, 1.0); glCallList(gears->gear_list[2]); glPopMatrix(); glPopMatrix(); glFlush(); display_release_window_surface(gears->d, gears->window); callback = wl_surface_frame(window_get_wl_surface(gears->window)); wl_callback_add_listener(callback, &listener, gears); }