diya-shell/src/widgets/cairo-window.c
2024-04-22 00:31:57 +02:00

139 lines
4.2 KiB
C

#include <assert.h>
#include "cairo-window.h"
#include "cairo-image.h"
/*
enum
{
NO_PROP,
BOX_MODE,
N_PROPERTIES
};
static GParamSpec *g_prop[N_PROPERTIES] = {0};
*/
struct _DiyaCairoWindow
{
DiyaCairoWidget parent_object;
DiyaCairoWidget * root;
gpointer background;
};
G_DEFINE_FINAL_TYPE(DiyaCairoWindow, diya_cairo_window, DIYA_TYPE_CAIRO_WIDGET)
static void diya_cairo_window_dispose(GObject * object)
{
g_debug("diya_cairo_window_dispose: %s", diya_object_to_string(object));
DiyaCairoWindow * window = DIYA_CAIRO_WINDOW(object);
if(window->root)
{
g_object_unref(window->root);
}
if(window->background)
{
g_object_unref(window->background);
}
G_OBJECT_CLASS(diya_cairo_window_parent_class)->dispose(object);
}
static void diya_cairo_window_init(DiyaCairoWindow * window)
{
window->root = NULL;
window->background = NULL;
}
static gboolean cairo_window_draw(gpointer object, cairo_t * cairo)
{
DiyaCairoWindow * window = DIYA_CAIRO_WINDOW(object);
DIYA_CAIRO_WIDGET_CLASS(diya_cairo_window_parent_class)->draw(object, cairo);
if(window->background)
{
g_warning("drawing background");
assert(DIYA_IS_CAIRO_IMAGE(window->background));
DIYA_CAIRO_WIDGET_GET_CLASS(DIYA_CAIRO_WIDGET(window->background))->draw(window->background, cairo);
}
if(window->root)
{
DIYA_CAIRO_WIDGET_GET_CLASS(DIYA_CAIRO_WIDGET(window->root))->draw(window->root, cairo);
}
return TRUE;
}
static void cairo_window_update(gpointer object)
{
g_warning("Updating cairo window");
DiyaCairoWindow * self = DIYA_CAIRO_WINDOW(object);
DIYA_CAIRO_WIDGET_CLASS(diya_cairo_window_parent_class)->update(object);
if(self->background)
{
g_warning("Updating cairo image");
assert(DIYA_IS_CAIRO_IMAGE(self->background));
DIYA_CAIRO_WIDGET_GET_CLASS(DIYA_CAIRO_WIDGET(self->background))->update(self->background);
}
if(self->root)
{
g_warning("Updating root");
DIYA_CAIRO_WIDGET_GET_CLASS(DIYA_CAIRO_WIDGET(self->root))->update(self->root);
}
}
static void diya_cairo_window_class_init(DiyaCairoWindowClass* class)
{
GObjectClass *gobject_class = G_OBJECT_CLASS(class);
DiyaCairoWidgetClass *wclass = DIYA_CAIRO_WIDGET_CLASS(class);
wclass->draw = cairo_window_draw;
wclass->update = cairo_window_update;
// wclass->alloc_space = cairo_window_allocate_space;
DIYA_CAIRO_WIDGET_SET_NAME(class, "DiyaCairoWindow");
gobject_class->dispose = diya_cairo_window_dispose;
}
void diya_cairo_window_set_root(gpointer object, gpointer root)
{
assert(DIYA_IS_CAIRO_WINDOW(object));
assert(DIYA_IS_CAIRO_WIDGET(root));
DiyaCairoWindow * window = DIYA_CAIRO_WINDOW(object);
window->root = DIYA_CAIRO_WIDGET(root);
diya_rect_t extent = diya_cairo_widget_get_extent(window);
g_object_set(root,
"parent", window,
"default-extent", &extent,
"vspace", DIYA_CAIRO_WIDGET_FILL_EXTEND,
"hspace", DIYA_CAIRO_WIDGET_FILL_EXTEND,
NULL
);
}
void diya_cairo_window_render(gpointer object, cairo_surface_t * surface)
{
assert(DIYA_IS_CAIRO_WINDOW(object));
DiyaCairoWidget * widget = DIYA_CAIRO_WIDGET(object);
cairo_t *cr = cairo_create(surface);
DIYA_CAIRO_WIDGET_GET_CLASS(widget)->draw(object,cr);
cairo_destroy(cr);
}
void diya_cairo_window_update(gpointer object)
{
assert(DIYA_IS_CAIRO_WINDOW(object));
g_warning("update and damaged widget");
DiyaCairoWidget * widget = DIYA_CAIRO_WIDGET(object);
assert(DIYA_IS_CAIRO_WIDGET(widget));
DIYA_CAIRO_WIDGET_GET_CLASS(widget)->update(object);
}
void diya_cairo_window_set_background_image(gpointer object, const char* path, gboolean scale_to_fit)
{
assert(DIYA_IS_CAIRO_WINDOW(object));
DiyaCairoWindow * self = DIYA_CAIRO_WINDOW(object);
self->background = g_object_new(DIYA_TYPE_CAIRO_IMAGE,
"file",path, "parent", object,
"scale-to-fit", scale_to_fit,
"hspace", DIYA_CAIRO_WIDGET_FILL_EXTEND,
"vspace", DIYA_CAIRO_WIDGET_FILL_EXTEND,
"halign", DIYA_CAIRO_WIDGET_ALIGN_START,
"valign", DIYA_CAIRO_WIDGET_ALIGN_START,
NULL);
}