Merge branch 'buttonlists' into reparse
This commit is contained in:
		@ -62,14 +62,14 @@ G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_A
 | 
			
		||||
 | 
			
		||||
static void       on_button_pressed          (struct squeek_button *button, struct squeek_view *view,
 | 
			
		||||
                                              EekGtkKeyboard *self);
 | 
			
		||||
static void       on_button_released         (struct squeek_button *button,
 | 
			
		||||
static void       on_button_released         (const struct squeek_button *button,
 | 
			
		||||
                                              struct squeek_view *view,
 | 
			
		||||
                                              EekGtkKeyboard *self);
 | 
			
		||||
static void       render_pressed_button      (GtkWidget *widget, struct button_place *place);
 | 
			
		||||
static void       render_locked_button       (GtkWidget *widget,
 | 
			
		||||
                                              struct button_place *place);
 | 
			
		||||
static void       render_released_button     (GtkWidget *widget,
 | 
			
		||||
                                              struct squeek_button *button);
 | 
			
		||||
                                              const struct squeek_button *button);
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eek_gtk_keyboard_real_realize (GtkWidget      *self)
 | 
			
		||||
@ -111,10 +111,10 @@ eek_gtk_keyboard_real_draw (GtkWidget *self,
 | 
			
		||||
    struct squeek_view *view = squeek_layout_get_current_view(priv->keyboard->layout);
 | 
			
		||||
 | 
			
		||||
    /* redraw pressed key */
 | 
			
		||||
    const GList *list = priv->keyboard->pressed_buttons;
 | 
			
		||||
    const GList *list = priv->keyboard->pressed_keys;
 | 
			
		||||
    for (const GList *head = list; head; head = g_list_next (head)) {
 | 
			
		||||
        struct button_place place = squeek_view_find_key(
 | 
			
		||||
            view, squeek_button_get_key(head->data)
 | 
			
		||||
            view, head->data
 | 
			
		||||
        );
 | 
			
		||||
        if (place.button)
 | 
			
		||||
            render_pressed_button (self, &place);
 | 
			
		||||
@ -157,7 +157,11 @@ static void depress(EekGtkKeyboard *self,
 | 
			
		||||
    struct squeek_button *button = eek_renderer_find_button_by_position (priv->renderer, view, x, y);
 | 
			
		||||
 | 
			
		||||
    if (button) {
 | 
			
		||||
        eek_keyboard_press_button(priv->keyboard, button, time);
 | 
			
		||||
        eek_keyboard_press_key(
 | 
			
		||||
            priv->keyboard,
 | 
			
		||||
            squeek_button_get_key(button),
 | 
			
		||||
            time
 | 
			
		||||
        );
 | 
			
		||||
        on_button_pressed(button, view, self);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -170,29 +174,42 @@ static void drag(EekGtkKeyboard *self,
 | 
			
		||||
    struct squeek_button *button = eek_renderer_find_button_by_position (priv->renderer, view, x, y);
 | 
			
		||||
    GList *list, *head;
 | 
			
		||||
 | 
			
		||||
    list = g_list_copy(priv->keyboard->pressed_buttons);
 | 
			
		||||
    list = g_list_copy(priv->keyboard->pressed_keys);
 | 
			
		||||
 | 
			
		||||
    if (button) {
 | 
			
		||||
        gboolean found = FALSE;
 | 
			
		||||
 | 
			
		||||
        for (head = list; head; head = g_list_next (head)) {
 | 
			
		||||
            if (head->data == button) {
 | 
			
		||||
            struct squeek_key *key = head->data;
 | 
			
		||||
            if (squeek_button_has_key(button, key)) {
 | 
			
		||||
                found = TRUE;
 | 
			
		||||
            } else {
 | 
			
		||||
                eek_keyboard_release_button(priv->keyboard, head->data, time);
 | 
			
		||||
                on_button_released(button, view, self);
 | 
			
		||||
                eek_keyboard_release_key(priv->keyboard, key, time);
 | 
			
		||||
                // The released handler proceeds to ignore this info...
 | 
			
		||||
                // let's do this for consistency nevertheless
 | 
			
		||||
                struct button_place place = squeek_view_find_key(view, key);
 | 
			
		||||
                on_button_released(place.button, view, self);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        g_list_free (list);
 | 
			
		||||
 | 
			
		||||
        if (!found) {
 | 
			
		||||
            eek_keyboard_press_button(priv->keyboard, button, time);
 | 
			
		||||
            eek_keyboard_press_key(
 | 
			
		||||
                priv->keyboard,
 | 
			
		||||
                squeek_button_get_key(button),
 | 
			
		||||
                time
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            on_button_pressed(button, view, self);
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        for (head = list; head; head = g_list_next (head)) {
 | 
			
		||||
            eek_keyboard_release_button(priv->keyboard, head->data, time);
 | 
			
		||||
            on_button_released(head->data, view, self);
 | 
			
		||||
            struct squeek_key *key = head->data;
 | 
			
		||||
            eek_keyboard_release_key(priv->keyboard, key, time);
 | 
			
		||||
            // The released handler proceeds to ignore this info...
 | 
			
		||||
            // let's do this for consistency nevertheless
 | 
			
		||||
            struct button_place place = squeek_view_find_key(view, key);
 | 
			
		||||
            on_button_released(place.button, view, self);
 | 
			
		||||
        }
 | 
			
		||||
        g_list_free (list);
 | 
			
		||||
    }
 | 
			
		||||
@ -204,11 +221,14 @@ static void release(EekGtkKeyboard *self, guint32 time)
 | 
			
		||||
 | 
			
		||||
    struct squeek_view *view = level_keyboard_current(priv->keyboard);
 | 
			
		||||
 | 
			
		||||
    GList *list = g_list_copy(priv->keyboard->pressed_buttons);
 | 
			
		||||
    GList *list = g_list_copy(priv->keyboard->pressed_keys);
 | 
			
		||||
    for (GList *head = list; head; head = g_list_next (head)) {
 | 
			
		||||
        struct squeek_button *button = head->data;
 | 
			
		||||
        eek_keyboard_release_button(priv->keyboard, button, time);
 | 
			
		||||
        on_button_released(button, view, self);
 | 
			
		||||
        struct squeek_key *key = head->data;
 | 
			
		||||
        eek_keyboard_release_key(priv->keyboard, key, time);
 | 
			
		||||
        // The released handler proceeds to ignore this info...
 | 
			
		||||
        // let's do this for consistency nevertheless
 | 
			
		||||
        struct button_place place = squeek_view_find_key(view, key);
 | 
			
		||||
        on_button_released(place.button, view, self);
 | 
			
		||||
    }
 | 
			
		||||
    g_list_free (list);
 | 
			
		||||
}
 | 
			
		||||
@ -287,11 +307,11 @@ eek_gtk_keyboard_real_unmap (GtkWidget *self)
 | 
			
		||||
    if (priv->keyboard) {
 | 
			
		||||
        GList *head;
 | 
			
		||||
 | 
			
		||||
        for (head = priv->keyboard->pressed_buttons; head; head = g_list_next (head)) {
 | 
			
		||||
        for (head = priv->keyboard->pressed_keys; head; head = g_list_next (head)) {
 | 
			
		||||
            /* Unlike other places where we call this, we don't call
 | 
			
		||||
               on_button_released afterwards since we don't want to queue a
 | 
			
		||||
               redraw. */
 | 
			
		||||
            eek_keyboard_release_button(priv->keyboard, head->data,
 | 
			
		||||
            eek_keyboard_release_key(priv->keyboard, head->data,
 | 
			
		||||
                                        gdk_event_get_time(NULL));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -352,8 +372,8 @@ eek_gtk_keyboard_dispose (GObject *object)
 | 
			
		||||
    if (priv->keyboard) {
 | 
			
		||||
        GList *head;
 | 
			
		||||
 | 
			
		||||
        for (head = priv->keyboard->pressed_buttons; head; head = g_list_next (head)) {
 | 
			
		||||
            eek_keyboard_release_button(priv->keyboard, head->data,
 | 
			
		||||
        for (head = priv->keyboard->pressed_keys; head; head = g_list_next (head)) {
 | 
			
		||||
            eek_keyboard_release_key(priv->keyboard, head->data,
 | 
			
		||||
                                        gdk_event_get_time(NULL));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -461,9 +481,10 @@ render_locked_button (GtkWidget *widget, struct button_place *place)
 | 
			
		||||
    cairo_region_destroy (region);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO: does it really redraw the entire keyboard?
 | 
			
		||||
static void
 | 
			
		||||
render_released_button (GtkWidget *widget,
 | 
			
		||||
                        struct squeek_button *button)
 | 
			
		||||
                        const struct squeek_button *button)
 | 
			
		||||
{
 | 
			
		||||
    (void)button;
 | 
			
		||||
    EekGtkKeyboard        *self = EEK_GTK_KEYBOARD (widget);
 | 
			
		||||
@ -512,7 +533,7 @@ on_button_pressed (struct squeek_button *button,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_button_released (struct squeek_button *button,
 | 
			
		||||
on_button_released (const struct squeek_button *button,
 | 
			
		||||
                    struct squeek_view *view,
 | 
			
		||||
                    EekGtkKeyboard *self)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -92,10 +92,9 @@ set_level_from_press (LevelKeyboard *keyboard, struct squeek_key *key)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void eek_keyboard_press_button(LevelKeyboard *keyboard, struct squeek_button *button, guint32 timestamp) {
 | 
			
		||||
    struct squeek_key *key = squeek_button_get_key(button);
 | 
			
		||||
void eek_keyboard_press_key(LevelKeyboard *keyboard, struct squeek_key *key, guint32 timestamp) {
 | 
			
		||||
    squeek_key_set_pressed(key, TRUE);
 | 
			
		||||
    keyboard->pressed_buttons = g_list_prepend (keyboard->pressed_buttons, button);
 | 
			
		||||
    keyboard->pressed_keys = g_list_prepend (keyboard->pressed_keys, key);
 | 
			
		||||
 | 
			
		||||
    // Only take action about setting level *after* the key has taken effect, i.e. on release
 | 
			
		||||
    //set_level_from_press (keyboard, key);
 | 
			
		||||
@ -107,19 +106,17 @@ void eek_keyboard_press_button(LevelKeyboard *keyboard, struct squeek_button *bu
 | 
			
		||||
    emit_key_activated(keyboard->manager, keyboard, keycode, TRUE, timestamp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void eek_keyboard_release_button(LevelKeyboard *keyboard,
 | 
			
		||||
                                 struct squeek_button *button,
 | 
			
		||||
                                 guint32 timestamp) {
 | 
			
		||||
    for (GList *head = keyboard->pressed_buttons; head; head = g_list_next (head)) {
 | 
			
		||||
        if (head->data == button) {
 | 
			
		||||
            keyboard->pressed_buttons = g_list_remove_link (keyboard->pressed_buttons, head);
 | 
			
		||||
void eek_keyboard_release_key(LevelKeyboard *keyboard,
 | 
			
		||||
                              struct squeek_key *key,
 | 
			
		||||
                              guint32 timestamp) {
 | 
			
		||||
    for (GList *head = keyboard->pressed_keys; head; head = g_list_next (head)) {
 | 
			
		||||
        if (squeek_key_equal(head->data, key)) {
 | 
			
		||||
            keyboard->pressed_keys = g_list_remove_link (keyboard->pressed_keys, head);
 | 
			
		||||
            g_list_free1 (head);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    struct squeek_key *key = squeek_button_get_key(button);
 | 
			
		||||
 | 
			
		||||
    set_level_from_press (keyboard, key);
 | 
			
		||||
 | 
			
		||||
    // "Borrowed" from eek-context-service; doesn't influence the state but forwards the event
 | 
			
		||||
 | 
			
		||||
@ -47,8 +47,8 @@ struct _LevelKeyboard {
 | 
			
		||||
    int keymap_fd; // keymap formatted as XKB string
 | 
			
		||||
    size_t keymap_len; // length of the data inside keymap_fd
 | 
			
		||||
 | 
			
		||||
    GList *pressed_buttons; // struct squeek_button*
 | 
			
		||||
    GList *locked_keys; // struct squeek_button*
 | 
			
		||||
    GList *pressed_keys; // struct squeek_key*
 | 
			
		||||
    GList *locked_keys; // struct EekModifierKey*
 | 
			
		||||
 | 
			
		||||
    guint id; // as a key to layout choices
 | 
			
		||||
 | 
			
		||||
@ -67,8 +67,11 @@ EekModifierKey     *eek_modifier_key_copy
 | 
			
		||||
void                eek_modifier_key_free
 | 
			
		||||
                                     (EekModifierKey      *modkey);
 | 
			
		||||
 | 
			
		||||
void eek_keyboard_press_button(LevelKeyboard *keyboard, struct squeek_button *button, guint32 timestamp);
 | 
			
		||||
void eek_keyboard_release_button(LevelKeyboard *keyboard, struct squeek_button *button, guint32 timestamp);
 | 
			
		||||
void eek_keyboard_press_key(LevelKeyboard *keyboard, struct squeek_key *key, guint32 timestamp);
 | 
			
		||||
void eek_keyboard_release_key(LevelKeyboard *keyboard, struct squeek_key *key, guint32 timestamp);
 | 
			
		||||
 | 
			
		||||
gchar *             eek_keyboard_get_keymap
 | 
			
		||||
                                     (LevelKeyboard *keyboard);
 | 
			
		||||
 | 
			
		||||
struct squeek_view *level_keyboard_current(LevelKeyboard *keyboard);
 | 
			
		||||
LevelKeyboard *level_keyboard_new(EekboardContextService *manager, struct squeek_layout *layout);
 | 
			
		||||
 | 
			
		||||
@ -970,6 +970,7 @@ eek_renderer_find_button_by_position (EekRenderer *renderer,
 | 
			
		||||
 | 
			
		||||
    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
			
		||||
 | 
			
		||||
    /* Transform from widget coordinates to keyboard coordinates */
 | 
			
		||||
    EekPoint point = {
 | 
			
		||||
        .x = (x - priv->origin_x)/priv->scale,
 | 
			
		||||
        .y = (y - priv->origin_y)/priv->scale,
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
#ifndef __KEYBOARD_H
 | 
			
		||||
#define __KYBOARD_H
 | 
			
		||||
#define __KEYBOARD_H
 | 
			
		||||
 | 
			
		||||
#include "stdbool.h"
 | 
			
		||||
#include "inttypes.h"
 | 
			
		||||
@ -19,6 +19,7 @@ uint32_t squeek_key_is_locked(struct squeek_key *key);
 | 
			
		||||
void squeek_key_set_locked(struct squeek_key *key, uint32_t pressed);
 | 
			
		||||
uint32_t squeek_key_get_keycode(struct squeek_key *key);
 | 
			
		||||
void squeek_key_set_keycode(struct squeek_key *key, uint32_t keycode);
 | 
			
		||||
uint32_t squeek_key_equal(struct squeek_key* key, struct squeek_key* key1);
 | 
			
		||||
 | 
			
		||||
struct squeek_symbol *squeek_key_get_symbol(struct squeek_key* key);
 | 
			
		||||
const char* squeek_key_to_keymap_entry(const char *key_name, struct squeek_key *key);
 | 
			
		||||
 | 
			
		||||
@ -31,6 +31,13 @@ pub mod c {
 | 
			
		||||
        unsafe { key.unwrap() }; // reference dropped
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /// Compares pointers to the data
 | 
			
		||||
    #[no_mangle]
 | 
			
		||||
    pub extern "C"
 | 
			
		||||
    fn squeek_key_equal(key: CKeyState, key2: CKeyState) -> u32 {
 | 
			
		||||
        return Rc::ptr_eq(&key.clone_ref(), &key2.clone_ref()) as u32
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    #[no_mangle]
 | 
			
		||||
    pub extern "C"
 | 
			
		||||
    fn squeek_key_is_pressed(key: CKeyState) -> u32 {
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user