2019-08-10 21:15:25 +02:00
|
|
|
#include <lorie-compositor.hpp>
|
|
|
|
#include <lorie-client.hpp>
|
|
|
|
#include <lorie-renderer.hpp>
|
|
|
|
|
2019-08-20 17:45:35 +02:00
|
|
|
void LorieSurface::request_attach(struct wl_resource *buffer, int32_t x, int32_t y) {
|
2019-08-10 21:15:25 +02:00
|
|
|
if (client == nullptr) return;
|
2019-08-20 17:45:35 +02:00
|
|
|
LorieRenderer* renderer = &(*client)->compositor.renderer;
|
|
|
|
this->buffer = buffer;
|
2019-08-10 21:15:25 +02:00
|
|
|
struct wl_shm_buffer *shm_buffer = wl_shm_buffer_get (buffer);
|
|
|
|
if (shm_buffer == NULL) {
|
2019-08-20 17:45:35 +02:00
|
|
|
texture.set_data(renderer, 0, 0, nullptr);
|
2019-08-10 21:15:25 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-08-20 17:45:35 +02:00
|
|
|
uint32_t width = (uint32_t) wl_shm_buffer_get_width (shm_buffer);
|
|
|
|
uint32_t height = (uint32_t) wl_shm_buffer_get_height (shm_buffer);
|
|
|
|
void *data = wl_shm_buffer_get_data(shm_buffer);
|
2019-08-10 21:15:25 +02:00
|
|
|
|
2019-08-20 17:45:35 +02:00
|
|
|
texture.set_data(renderer, width, height, data);
|
2019-08-10 21:15:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void LorieSurface::request_damage(int32_t x, int32_t y, int32_t width, int32_t height) {
|
|
|
|
if (client == nullptr) return;
|
2019-08-20 17:45:35 +02:00
|
|
|
|
|
|
|
texture.damage(x, y, width, height);
|
2019-08-10 21:15:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void LorieSurface::request_frame(uint32_t callback) {
|
|
|
|
frame_callback = wl_resource_create (client, &::wl_callback_interface, 1, callback);
|
|
|
|
}
|
|
|
|
|
|
|
|
void LorieSurface::request_commit() {
|
2019-08-20 20:21:46 +02:00
|
|
|
if (!buffer) return;
|
|
|
|
wl_buffer_send_release (buffer);
|
2019-08-10 21:15:25 +02:00
|
|
|
|
|
|
|
if (frame_callback) {
|
|
|
|
wl_callback_send_done (frame_callback, LorieUtils::timestamp());
|
|
|
|
wl_resource_destroy (frame_callback);
|
|
|
|
frame_callback = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void LorieShellSurface::request_set_toplevel() {
|
|
|
|
if (client == nullptr || surface == nullptr) return;
|
|
|
|
|
|
|
|
(*client)->compositor.set_toplevel(surface);
|
|
|
|
(*client)->pointer.send_enter();
|
|
|
|
(*client)->keyboard.send_enter();
|
|
|
|
|
|
|
|
send_configure(0, (*client)->compositor.renderer.width, (*client)->compositor.renderer.height);
|
|
|
|
}
|
|
|
|
|