Подготовлены файлы фигуры
This commit is contained in:
21
wayland/include/figure.h
Normal file
21
wayland/include/figure.h
Normal file
@@ -0,0 +1,21 @@
|
||||
#ifndef FIGURE_H
|
||||
#define FIGURE_H
|
||||
|
||||
#include "geomerty.h"
|
||||
|
||||
enum figure_type
|
||||
{
|
||||
FIGURE_CIRCLE = 0,
|
||||
FIGURE_TRIANGLE = 1,
|
||||
FIGURE_SQUARE = 2
|
||||
};
|
||||
|
||||
struct figure_info {
|
||||
enum figure_type type;
|
||||
struct vec2 position;
|
||||
struct vec2 velocity;
|
||||
float rotation;
|
||||
float rotation_speed;
|
||||
};
|
||||
|
||||
#endif
|
||||
9
wayland/include/geomerty.h
Normal file
9
wayland/include/geomerty.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#ifndef GEOMETRY_H
|
||||
#define GEOMETRY_H
|
||||
|
||||
struct vec2 {
|
||||
float x;
|
||||
float y;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -2,6 +2,15 @@
|
||||
#define WAYLAND_WINDOW_H
|
||||
|
||||
#include <wayland-client.h>
|
||||
#include "figure.h"
|
||||
|
||||
struct window_draw_info {
|
||||
uint8_t *data;
|
||||
int32_t width;
|
||||
int32_t height;
|
||||
uint8_t color;
|
||||
struct figure_info figure;
|
||||
};
|
||||
|
||||
/* Данные одного Wayland-окна (одна поверхность) */
|
||||
struct wayland_window {
|
||||
@@ -12,13 +21,11 @@ struct wayland_window {
|
||||
struct xdg_surface *xdg_surface;
|
||||
struct xdg_toplevel *xdg_toplevel;
|
||||
struct wl_event_queue *queue; /* очередь событий для окна */
|
||||
uint8_t *data;
|
||||
int32_t width;
|
||||
int32_t height;
|
||||
struct window_draw_info draw_info;
|
||||
int need_close;
|
||||
uint8_t color;
|
||||
};
|
||||
|
||||
|
||||
/* Инициализация окна; структура предоставляется вызывающим */
|
||||
int window_init(struct wl_display *display, struct wl_event_queue *queue, struct wayland_window *win);
|
||||
|
||||
|
||||
@@ -44,8 +44,9 @@ static void destroy_frame_callback(struct wayland_window *win)
|
||||
|
||||
static void resize_canvas(struct wayland_window *win)
|
||||
{
|
||||
size_t stride = win->width * 4;
|
||||
size_t size = stride * win->height;
|
||||
struct window_draw_info* draw_info = &win->draw_info;
|
||||
size_t stride = draw_info->width * 4;
|
||||
size_t size = stride * draw_info->height;
|
||||
int32_t fd = alloc_shm(size);
|
||||
if (fd == -1)
|
||||
return;
|
||||
@@ -64,42 +65,46 @@ static void resize_canvas(struct wayland_window *win)
|
||||
}
|
||||
struct wl_shm *shm = registry_get_shm();
|
||||
struct wl_shm_pool *pool = wl_shm_create_pool(shm, fd, size);
|
||||
win->buffer = wl_shm_pool_create_buffer(pool, 0, win->width, win->height, stride, WL_SHM_FORMAT_ARGB8888);
|
||||
win->buffer = wl_shm_pool_create_buffer(pool, 0, draw_info->width, draw_info->height, stride, WL_SHM_FORMAT_ARGB8888);
|
||||
wl_shm_pool_destroy(pool);
|
||||
close(fd);
|
||||
|
||||
win->data = map;
|
||||
draw_info->data = map;
|
||||
}
|
||||
|
||||
static void resize_new(struct wayland_window *win, int32_t w, int32_t h)
|
||||
{
|
||||
if (!w || !h)
|
||||
return;
|
||||
if (win->width != w || win->height != h)
|
||||
struct window_draw_info* draw_info = &win->draw_info;
|
||||
|
||||
if (draw_info->width != w || draw_info->height != h)
|
||||
{
|
||||
if (win->data)
|
||||
if (draw_info->data)
|
||||
{
|
||||
munmap(win->data, win->width * win->height * 4);
|
||||
win->data = NULL;
|
||||
munmap(draw_info->data, draw_info->width * draw_info->height * 4);
|
||||
draw_info->data = NULL;
|
||||
}
|
||||
win->width = w;
|
||||
win->height = h;
|
||||
draw_info->width = w;
|
||||
draw_info->height = h;
|
||||
resize_canvas(win);
|
||||
}
|
||||
}
|
||||
|
||||
static void draw(struct wayland_window *win)
|
||||
{
|
||||
size_t stride = win->width * 4;
|
||||
size_t size = stride * win->height;
|
||||
struct window_draw_info* draw_info = &win->draw_info;
|
||||
|
||||
if (!win->data || !win->buffer)
|
||||
size_t stride = draw_info->width * 4;
|
||||
size_t size = stride * draw_info->height;
|
||||
|
||||
if (!draw_info->data || !win->buffer)
|
||||
return;
|
||||
|
||||
memset(win->data, win->color++, size);
|
||||
memset(draw_info->data, draw_info->color++, size);
|
||||
|
||||
wl_surface_attach(win->wl_surface, win->buffer, 0, 0);
|
||||
wl_surface_damage_buffer(win->wl_surface, 0, 0, win->width, win->height);
|
||||
wl_surface_damage_buffer(win->wl_surface, 0, 0, draw_info->width, draw_info->height);
|
||||
wl_surface_commit(win->wl_surface);
|
||||
}
|
||||
|
||||
@@ -107,7 +112,7 @@ static void xdg_surface_conf(void *data, struct xdg_surface *xdg_surface_local,
|
||||
{
|
||||
xdg_surface_ack_configure(xdg_surface_local, serial);
|
||||
struct wayland_window *win = data;
|
||||
if (!win->data)
|
||||
if (!win->draw_info.data)
|
||||
resize_canvas(win);
|
||||
|
||||
draw(win);
|
||||
@@ -202,17 +207,17 @@ int window_init(struct wl_display *display, struct wl_event_queue *queue, struct
|
||||
|
||||
wl_surface_commit(win->wl_surface);
|
||||
|
||||
/* wm_base — глобальный объект, listener в registry */
|
||||
struct window_draw_info* draw_info = &win->draw_info;
|
||||
|
||||
/* Инициализация состояния */
|
||||
win->id = id++;
|
||||
win->width = 400;
|
||||
win->height = 250;
|
||||
win->data = NULL;
|
||||
draw_info->width = 400;
|
||||
draw_info->height = 250;
|
||||
draw_info->data = NULL;
|
||||
win->buffer = NULL;
|
||||
win->frame_callback = NULL;
|
||||
win->need_close = 0;
|
||||
win->color = 0;
|
||||
draw_info->color = 0;
|
||||
|
||||
xdg_toplevel_set_app_id(win->xdg_toplevel, "my-wayland-window");
|
||||
xdg_toplevel_set_title(win->xdg_toplevel, "Custom Title");
|
||||
@@ -236,6 +241,6 @@ void window_destroy(struct wayland_window *win)
|
||||
xdg_surface_destroy(win->xdg_surface);
|
||||
if (win->wl_surface)
|
||||
wl_surface_destroy(win->wl_surface);
|
||||
if (win->data)
|
||||
munmap(win->data, win->width * win->height * 4);
|
||||
if (win->draw_info.data)
|
||||
munmap(win->draw_info.data, win->draw_info.width * win->draw_info.height * 4);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user