renderer: Render whole keyboard the same way as pressed buttons
Removed window size dependent surface.
This commit is contained in:
@ -52,7 +52,6 @@ typedef struct _EekRendererPrivate
|
|||||||
gint origin_y;
|
gint origin_y;
|
||||||
|
|
||||||
PangoFontDescription *font; // owned reference
|
PangoFontDescription *font; // owned reference
|
||||||
cairo_surface_t *keyboard_surface;
|
|
||||||
|
|
||||||
} EekRendererPrivate;
|
} EekRendererPrivate;
|
||||||
|
|
||||||
@ -62,7 +61,6 @@ G_DEFINE_TYPE_WITH_PRIVATE (EekRenderer, eek_renderer, G_TYPE_OBJECT)
|
|||||||
static void eek_renderer_render_button_label (EekRenderer *self, cairo_t *cr, GtkStyleContext *ctx,
|
static void eek_renderer_render_button_label (EekRenderer *self, cairo_t *cr, GtkStyleContext *ctx,
|
||||||
const struct squeek_button *button);
|
const struct squeek_button *button);
|
||||||
|
|
||||||
static void invalidate (EekRenderer *renderer);
|
|
||||||
void eek_render_button (EekRenderer *self,
|
void eek_render_button (EekRenderer *self,
|
||||||
cairo_t *cr, const struct squeek_button *button,
|
cairo_t *cr, const struct squeek_button *button,
|
||||||
gboolean pressed, gboolean locked);
|
gboolean pressed, gboolean locked);
|
||||||
@ -75,91 +73,6 @@ struct _CreateKeyboardSurfaceCallbackData {
|
|||||||
};
|
};
|
||||||
typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData;
|
typedef struct _CreateKeyboardSurfaceCallbackData CreateKeyboardSurfaceCallbackData;
|
||||||
|
|
||||||
static void
|
|
||||||
create_keyboard_surface_button_callback (struct squeek_button *button,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
CreateKeyboardSurfaceCallbackData *data = user_data;
|
|
||||||
EekBounds bounds = squeek_button_get_bounds(button);
|
|
||||||
|
|
||||||
cairo_save (data->cr);
|
|
||||||
|
|
||||||
cairo_translate (data->cr, bounds.x, bounds.y);
|
|
||||||
cairo_rectangle (data->cr,
|
|
||||||
0.0,
|
|
||||||
0.0,
|
|
||||||
bounds.width,
|
|
||||||
bounds.height);
|
|
||||||
cairo_clip (data->cr);
|
|
||||||
|
|
||||||
eek_render_button (data->renderer, data->cr, button, FALSE, FALSE);
|
|
||||||
|
|
||||||
cairo_restore (data->cr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
create_keyboard_surface_row_callback (struct squeek_row *row,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
CreateKeyboardSurfaceCallbackData *data = user_data;
|
|
||||||
|
|
||||||
EekBounds bounds = squeek_row_get_bounds(row);
|
|
||||||
|
|
||||||
cairo_save (data->cr);
|
|
||||||
cairo_translate (data->cr, bounds.x, bounds.y);
|
|
||||||
|
|
||||||
gint angle = squeek_row_get_angle (row);
|
|
||||||
cairo_rotate (data->cr, angle * G_PI / 180);
|
|
||||||
|
|
||||||
data->row = row;
|
|
||||||
squeek_row_foreach(row, create_keyboard_surface_button_callback, data);
|
|
||||||
|
|
||||||
cairo_restore (data->cr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
render_keyboard_surface (EekRenderer *renderer, struct squeek_view *view)
|
|
||||||
{
|
|
||||||
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
|
|
||||||
|
|
||||||
CreateKeyboardSurfaceCallbackData data = {
|
|
||||||
.cr = cairo_create (priv->keyboard_surface),
|
|
||||||
.renderer = renderer,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Paint the background covering the entire widget area */
|
|
||||||
gtk_render_background (priv->view_context,
|
|
||||||
data.cr,
|
|
||||||
0, 0,
|
|
||||||
priv->allocation_width, priv->allocation_height);
|
|
||||||
gtk_render_frame (priv->view_context,
|
|
||||||
data.cr,
|
|
||||||
0, 0,
|
|
||||||
priv->allocation_width, priv->allocation_height);
|
|
||||||
|
|
||||||
GdkRGBA color = {0};
|
|
||||||
gtk_style_context_get_color (priv->view_context, GTK_STATE_FLAG_NORMAL, &color);
|
|
||||||
cairo_set_source_rgba (data.cr,
|
|
||||||
color.red,
|
|
||||||
color.green,
|
|
||||||
color.blue,
|
|
||||||
color.alpha);
|
|
||||||
|
|
||||||
cairo_save (data.cr);
|
|
||||||
|
|
||||||
EekBounds bounds = squeek_view_get_bounds (view);
|
|
||||||
cairo_translate (data.cr, bounds.x, bounds.y);
|
|
||||||
|
|
||||||
/* draw rows */
|
|
||||||
squeek_view_foreach(view,
|
|
||||||
create_keyboard_surface_row_callback,
|
|
||||||
&data);
|
|
||||||
|
|
||||||
cairo_restore (data.cr);
|
|
||||||
|
|
||||||
cairo_destroy (data.cr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
render_outline (cairo_t *cr,
|
render_outline (cairo_t *cr,
|
||||||
GtkStyleContext *ctx,
|
GtkStyleContext *ctx,
|
||||||
@ -431,21 +344,17 @@ eek_renderer_render_keyboard (EekRenderer *self,
|
|||||||
g_return_if_fail (priv->allocation_width > 0.0);
|
g_return_if_fail (priv->allocation_width > 0.0);
|
||||||
g_return_if_fail (priv->allocation_height > 0.0);
|
g_return_if_fail (priv->allocation_height > 0.0);
|
||||||
|
|
||||||
|
/* Paint the background covering the entire widget area */
|
||||||
|
gtk_render_background (priv->view_context,
|
||||||
|
cr,
|
||||||
|
0, 0,
|
||||||
|
priv->allocation_width, priv->allocation_height);
|
||||||
|
|
||||||
cairo_save(cr);
|
cairo_save(cr);
|
||||||
cairo_translate (cr, priv->origin_x, priv->origin_y);
|
cairo_translate (cr, priv->origin_x, priv->origin_y);
|
||||||
cairo_scale (cr, priv->scale, priv->scale);
|
cairo_scale (cr, priv->scale, priv->scale);
|
||||||
if (priv->keyboard_surface)
|
|
||||||
cairo_surface_destroy (priv->keyboard_surface);
|
|
||||||
|
|
||||||
priv->keyboard_surface = cairo_surface_create_for_rectangle (
|
|
||||||
cairo_get_target (cr), 0, 0,
|
|
||||||
priv->allocation_width, priv->allocation_height);
|
|
||||||
|
|
||||||
render_keyboard_surface (self, squeek_layout_get_current_view(priv->keyboard->layout));
|
|
||||||
|
|
||||||
cairo_set_source_surface (cr, priv->keyboard_surface, 0.0, 0.0);
|
|
||||||
cairo_paint (cr);
|
|
||||||
|
|
||||||
|
squeek_draw_layout_base_view(priv->keyboard->layout, self, cr);
|
||||||
squeek_layout_draw_all_changed(priv->keyboard->layout, self, cr);
|
squeek_layout_draw_all_changed(priv->keyboard->layout, self, cr);
|
||||||
cairo_restore (cr);
|
cairo_restore (cr);
|
||||||
}
|
}
|
||||||
@ -476,6 +385,7 @@ eek_renderer_get_property (GObject *object,
|
|||||||
GValue *value,
|
GValue *value,
|
||||||
GParamSpec *pspec)
|
GParamSpec *pspec)
|
||||||
{
|
{
|
||||||
|
(void)value;
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
@ -497,8 +407,7 @@ eek_renderer_dispose (GObject *object)
|
|||||||
priv->pcontext = NULL;
|
priv->pcontext = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* this will release all allocated surfaces and font if any */
|
// this is where renderer-specific surfaces would be released
|
||||||
invalidate (EEK_RENDERER(object));
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (eek_renderer_parent_class)->dispose (object);
|
G_OBJECT_CLASS (eek_renderer_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
@ -577,7 +486,6 @@ eek_renderer_init (EekRenderer *self)
|
|||||||
priv->scale = 1.0;
|
priv->scale = 1.0;
|
||||||
priv->scale_factor = 1;
|
priv->scale_factor = 1;
|
||||||
priv->font = NULL;
|
priv->font = NULL;
|
||||||
priv->keyboard_surface = NULL;
|
|
||||||
|
|
||||||
GtkIconTheme *theme = gtk_icon_theme_get_default ();
|
GtkIconTheme *theme = gtk_icon_theme_get_default ();
|
||||||
|
|
||||||
@ -586,17 +494,6 @@ eek_renderer_init (EekRenderer *self)
|
|||||||
priv->css_provider = squeek_load_style();
|
priv->css_provider = squeek_load_style();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
invalidate (EekRenderer *renderer)
|
|
||||||
{
|
|
||||||
EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
|
|
||||||
|
|
||||||
if (priv->keyboard_surface) {
|
|
||||||
cairo_surface_destroy (priv->keyboard_surface);
|
|
||||||
priv->keyboard_surface = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
EekRenderer *
|
EekRenderer *
|
||||||
eek_renderer_new (LevelKeyboard *keyboard,
|
eek_renderer_new (LevelKeyboard *keyboard,
|
||||||
PangoContext *pcontext)
|
PangoContext *pcontext)
|
||||||
@ -667,7 +564,8 @@ eek_renderer_set_allocation_size (EekRenderer *renderer,
|
|||||||
/* Set the rendering offset in widget coordinates to center the keyboard */
|
/* Set the rendering offset in widget coordinates to center the keyboard */
|
||||||
priv->origin_x = (gint)floor((width - (scale * w)) / 2);
|
priv->origin_x = (gint)floor((width - (scale * w)) / 2);
|
||||||
priv->origin_y = (gint)floor((height - (scale * h)) / 2);
|
priv->origin_y = (gint)floor((height - (scale * h)) / 2);
|
||||||
invalidate (renderer);
|
|
||||||
|
// This is where size-dependent surfaces would be released
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@ -75,6 +75,31 @@ mod c {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C"
|
||||||
|
fn squeek_draw_layout_base_view(
|
||||||
|
layout: *mut Layout,
|
||||||
|
renderer: EekRenderer,
|
||||||
|
cr: *mut cairo_sys::cairo_t,
|
||||||
|
) {
|
||||||
|
let layout = unsafe { &mut *layout };
|
||||||
|
let cr = unsafe { cairo::Context::from_raw_none(cr) };
|
||||||
|
let view = layout.get_current_view();
|
||||||
|
let view_position = view.bounds.get_position();
|
||||||
|
for row in &view.rows {
|
||||||
|
for button in &row.buttons {
|
||||||
|
let position = &view_position
|
||||||
|
+ row.bounds.clone().unwrap().get_position()
|
||||||
|
+ button.bounds.get_position();
|
||||||
|
render_button_at_position(
|
||||||
|
renderer, &cr,
|
||||||
|
position, button.as_ref(),
|
||||||
|
keyboard::PressType::Released, false,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Renders a button at a position (button's own bounds ignored)
|
/// Renders a button at a position (button's own bounds ignored)
|
||||||
|
|||||||
11
src/layout.h
11
src/layout.h
@ -21,11 +21,6 @@ int32_t squeek_row_get_angle(const struct squeek_row*);
|
|||||||
|
|
||||||
EekBounds squeek_row_get_bounds(const struct squeek_row*);
|
EekBounds squeek_row_get_bounds(const struct squeek_row*);
|
||||||
|
|
||||||
typedef void (*ButtonCallback) (struct squeek_button *button, gpointer user_data);
|
|
||||||
void squeek_row_foreach(struct squeek_row*,
|
|
||||||
ButtonCallback callback,
|
|
||||||
gpointer user_data);
|
|
||||||
|
|
||||||
EekBounds squeek_button_get_bounds(const struct squeek_button*);
|
EekBounds squeek_button_get_bounds(const struct squeek_button*);
|
||||||
const char *squeek_button_get_label(const struct squeek_button*);
|
const char *squeek_button_get_label(const struct squeek_button*);
|
||||||
const char *squeek_button_get_icon_name(const struct squeek_button*);
|
const char *squeek_button_get_icon_name(const struct squeek_button*);
|
||||||
@ -37,11 +32,6 @@ void squeek_button_print(const struct squeek_button* button);
|
|||||||
|
|
||||||
EekBounds squeek_view_get_bounds(const struct squeek_view*);
|
EekBounds squeek_view_get_bounds(const struct squeek_view*);
|
||||||
|
|
||||||
typedef void (*RowCallback) (struct squeek_row *row, gpointer user_data);
|
|
||||||
void squeek_view_foreach(struct squeek_view*,
|
|
||||||
RowCallback callback,
|
|
||||||
gpointer user_data);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
squeek_layout_place_contents(struct squeek_layout*);
|
squeek_layout_place_contents(struct squeek_layout*);
|
||||||
struct squeek_view *squeek_layout_get_current_view(struct squeek_layout*);
|
struct squeek_view *squeek_layout_get_current_view(struct squeek_layout*);
|
||||||
@ -65,4 +55,5 @@ void squeek_layout_drag(struct squeek_layout *layout, struct zwp_virtual_keyboar
|
|||||||
struct transformation widget_to_layout,
|
struct transformation widget_to_layout,
|
||||||
uint32_t timestamp, EekGtkKeyboard *ui_keyboard);
|
uint32_t timestamp, EekGtkKeyboard *ui_keyboard);
|
||||||
void squeek_layout_draw_all_changed(struct squeek_layout *layout, EekRenderer* renderer, cairo_t *cr);
|
void squeek_layout_draw_all_changed(struct squeek_layout *layout, EekRenderer* renderer, cairo_t *cr);
|
||||||
|
void squeek_draw_layout_base_view(struct squeek_layout *layout, EekRenderer* renderer, cairo_t *cr);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -43,10 +43,6 @@ pub mod c {
|
|||||||
use std::ops::Add;
|
use std::ops::Add;
|
||||||
|
|
||||||
// The following defined in C
|
// The following defined in C
|
||||||
|
|
||||||
#[repr(transparent)]
|
|
||||||
pub struct UserData(*const c_void);
|
|
||||||
|
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct EekGtkKeyboard(pub *const gtk_sys::GtkWidget);
|
pub struct EekGtkKeyboard(pub *const gtk_sys::GtkWidget);
|
||||||
@ -130,9 +126,6 @@ pub mod c {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type ButtonCallback = unsafe extern "C" fn(button: *mut ::layout::Button, data: *mut UserData);
|
|
||||||
type RowCallback = unsafe extern "C" fn(row: *mut ::layout::Row, data: *mut UserData);
|
|
||||||
|
|
||||||
// The following defined in Rust. TODO: wrap naked pointers to Rust data inside RefCells to prevent multiple writers
|
// The following defined in Rust. TODO: wrap naked pointers to Rust data inside RefCells to prevent multiple writers
|
||||||
|
|
||||||
@ -142,20 +135,6 @@ pub mod c {
|
|||||||
unsafe { &*view }.bounds.clone()
|
unsafe { &*view }.bounds.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C"
|
|
||||||
fn squeek_view_foreach(
|
|
||||||
view: *mut ::layout::View,
|
|
||||||
callback: RowCallback,
|
|
||||||
data: *mut UserData,
|
|
||||||
) {
|
|
||||||
let view = unsafe { &mut *view };
|
|
||||||
for row in view.rows.iter_mut() {
|
|
||||||
let row = row.as_mut() as *mut ::layout::Row;
|
|
||||||
unsafe { callback(row, data) };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C"
|
pub extern "C"
|
||||||
fn squeek_row_get_angle(row: *const ::layout::Row) -> i32 {
|
fn squeek_row_get_angle(row: *const ::layout::Row) -> i32 {
|
||||||
@ -172,20 +151,6 @@ pub mod c {
|
|||||||
None => panic!("Row doesn't have any bounds yet"),
|
None => panic!("Row doesn't have any bounds yet"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C"
|
|
||||||
fn squeek_row_foreach(
|
|
||||||
row: *mut ::layout::Row,
|
|
||||||
callback: ButtonCallback,
|
|
||||||
data: *mut UserData,
|
|
||||||
) {
|
|
||||||
let row = unsafe { &mut *row };
|
|
||||||
for button in row.buttons.iter_mut() {
|
|
||||||
let button = button.as_mut() as *mut ::layout::Button;
|
|
||||||
unsafe { callback(button, data) };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C"
|
pub extern "C"
|
||||||
|
|||||||
Reference in New Issue
Block a user