Merge branch 'lfb' into 'master'
Provide haptic feedback via libfeedback Closes #166 See merge request Librem5/squeekboard!350
This commit is contained in:
		
							
								
								
									
										1
									
								
								debian/control
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								debian/control
									
									
									
									
										vendored
									
									
								
							@ -11,6 +11,7 @@ Build-Depends:
 | 
				
			|||||||
 libglib2.0-dev,
 | 
					 libglib2.0-dev,
 | 
				
			||||||
 libgnome-desktop-3-dev,
 | 
					 libgnome-desktop-3-dev,
 | 
				
			||||||
 libgtk-3-dev,
 | 
					 libgtk-3-dev,
 | 
				
			||||||
 | 
					 libfeedback-dev,
 | 
				
			||||||
 librust-bitflags-1-dev (>= 1.0),
 | 
					 librust-bitflags-1-dev (>= 1.0),
 | 
				
			||||||
 librust-clap-2+default-dev (>= 2.32),
 | 
					 librust-clap-2+default-dev (>= 2.32),
 | 
				
			||||||
 librust-gio+v2-44-dev,
 | 
					 librust-gio+v2-44-dev,
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								debian/rules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								debian/rules
									
									
									
									
										vendored
									
									
								
							@ -9,7 +9,7 @@ export DEB_BUILD_MAINT_OPTIONS = hardening=+all
 | 
				
			|||||||
# The Debian version of linked-hash-map doesn't provide any hash,
 | 
					# The Debian version of linked-hash-map doesn't provide any hash,
 | 
				
			||||||
# causing Cargo to refuse to build with a crates.io copy
 | 
					# causing Cargo to refuse to build with a crates.io copy
 | 
				
			||||||
build-arch:
 | 
					build-arch:
 | 
				
			||||||
	rm Cargo.lock
 | 
						[ ! -f Cargo.lock ] || rm Cargo.lock
 | 
				
			||||||
	dh $@ --builddirectory=_build --buildsystem=meson
 | 
						dh $@ --builddirectory=_build --buildsystem=meson
 | 
				
			||||||
 | 
					
 | 
				
			||||||
override_dh_autoreconf:
 | 
					override_dh_autoreconf:
 | 
				
			||||||
 | 
				
			|||||||
@ -25,10 +25,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "config.h"
 | 
					#include "config.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_LIBCANBERRA
 | 
					 | 
				
			||||||
#include <canberra-gtk.h>
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <math.h>
 | 
					#include <math.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -41,6 +37,10 @@
 | 
				
			|||||||
#include "src/layout.h"
 | 
					#include "src/layout.h"
 | 
				
			||||||
#include "src/submission.h"
 | 
					#include "src/submission.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LIBFEEDBACK_USE_UNSTABLE_API
 | 
				
			||||||
 | 
					#include <libfeedback.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SQUEEKBOARD_APP_ID "sm.puri.squeekboard"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _EekGtkKeyboardPrivate
 | 
					typedef struct _EekGtkKeyboardPrivate
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -52,6 +52,7 @@ typedef struct _EekGtkKeyboardPrivate
 | 
				
			|||||||
    LevelKeyboard *keyboard; // unowned reference; it's kept in server-context
 | 
					    LevelKeyboard *keyboard; // unowned reference; it's kept in server-context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GdkEventSequence *sequence; // unowned reference
 | 
					    GdkEventSequence *sequence; // unowned reference
 | 
				
			||||||
 | 
					    LfbEvent *event;
 | 
				
			||||||
} EekGtkKeyboardPrivate;
 | 
					} EekGtkKeyboardPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA)
 | 
					G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA)
 | 
				
			||||||
@ -139,6 +140,19 @@ eek_gtk_keyboard_real_size_allocate (GtkWidget     *self,
 | 
				
			|||||||
        size_allocate (self, allocation);
 | 
					        size_allocate (self, allocation);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					on_event_triggered (LfbEvent      *event,
 | 
				
			||||||
 | 
					                    GAsyncResult  *res,
 | 
				
			||||||
 | 
					                    gpointer      unused)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_autoptr (GError) err = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!lfb_event_trigger_feedback_finish (event, res, &err)) {
 | 
				
			||||||
 | 
					        g_warning ("Failed to trigger feedback for '%s': %s",
 | 
				
			||||||
 | 
					                   lfb_event_get_event (event), err->message);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void depress(EekGtkKeyboard *self,
 | 
					static void depress(EekGtkKeyboard *self,
 | 
				
			||||||
                    gdouble x, gdouble y, guint32 time)
 | 
					                    gdouble x, gdouble y, guint32 time)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -303,6 +317,11 @@ eek_gtk_keyboard_dispose (GObject *object)
 | 
				
			|||||||
        priv->keyboard = NULL;
 | 
					        priv->keyboard = NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->event) {
 | 
				
			||||||
 | 
					        g_clear_object (&priv->event);
 | 
				
			||||||
 | 
					        lfb_uninit ();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    G_OBJECT_CLASS (eek_gtk_keyboard_parent_class)->dispose (object);
 | 
					    G_OBJECT_CLASS (eek_gtk_keyboard_parent_class)->dispose (object);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -334,7 +353,13 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_gtk_keyboard_init (EekGtkKeyboard *self)
 | 
					eek_gtk_keyboard_init (EekGtkKeyboard *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    (void)self;
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (EEK_GTK_KEYBOARD (self));
 | 
				
			||||||
 | 
					    g_autoptr(GError) err = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (lfb_init(SQUEEKBOARD_APP_ID, &err))
 | 
				
			||||||
 | 
					        priv->event = lfb_event_new ("button-pressed");
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        g_warning ("Failed to init libfeedback: %s", err->message);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -380,3 +405,24 @@ eek_gtk_keyboard_new (EekboardContextService *eekservice,
 | 
				
			|||||||
    return GTK_WIDGET(box);*/
 | 
					    return GTK_WIDGET(box);*/
 | 
				
			||||||
    return GTK_WIDGET(ret);
 | 
					    return GTK_WIDGET(ret);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * eek_gtk_keyboard_emit_feedback:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Emit button press haptic feedback via libfeedack.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					eek_gtk_keyboard_emit_feedback (EekGtkKeyboard *self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    EekGtkKeyboardPrivate *priv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_return_if_fail (EEK_IS_GTK_KEYBOARD (self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    priv = eek_gtk_keyboard_get_instance_private (EEK_GTK_KEYBOARD (self));
 | 
				
			||||||
 | 
					    if (priv->event) {
 | 
				
			||||||
 | 
					        lfb_event_trigger_feedback_async (priv->event,
 | 
				
			||||||
 | 
					                                          NULL,
 | 
				
			||||||
 | 
					                                          (GAsyncReadyCallback)on_event_triggered,
 | 
				
			||||||
 | 
					                                          NULL);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -49,6 +49,7 @@ struct _EekGtkKeyboardClass
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
GType      eek_gtk_keyboard_get_type  (void) G_GNUC_CONST;
 | 
					GType      eek_gtk_keyboard_get_type  (void) G_GNUC_CONST;
 | 
				
			||||||
GtkWidget *eek_gtk_keyboard_new       (EekboardContextService *eekservice, struct submission *submission, struct squeek_layout_state *layout);
 | 
					GtkWidget *eek_gtk_keyboard_new       (EekboardContextService *eekservice, struct submission *submission, struct squeek_layout_state *layout);
 | 
				
			||||||
 | 
					void       eek_gtk_keyboard_emit_feedback (EekGtkKeyboard *self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_END_DECLS
 | 
					G_END_DECLS
 | 
				
			||||||
#endif  /* EEK_GTK_KEYBOARD_H */
 | 
					#endif  /* EEK_GTK_KEYBOARD_H */
 | 
				
			||||||
 | 
				
			|||||||
@ -52,6 +52,14 @@ pub mod c {
 | 
				
			|||||||
    #[derive(Copy, Clone)]
 | 
					    #[derive(Copy, Clone)]
 | 
				
			||||||
    pub struct EekGtkKeyboard(pub *const gtk_sys::GtkWidget);
 | 
					    pub struct EekGtkKeyboard(pub *const gtk_sys::GtkWidget);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[no_mangle]
 | 
				
			||||||
 | 
					    extern "C" {
 | 
				
			||||||
 | 
					        #[allow(improper_ctypes)]
 | 
				
			||||||
 | 
					        pub fn eek_gtk_keyboard_emit_feedback(
 | 
				
			||||||
 | 
					            keyboard: EekGtkKeyboard,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Defined in eek-types.h
 | 
					    /// Defined in eek-types.h
 | 
				
			||||||
    #[repr(C)]
 | 
					    #[repr(C)]
 | 
				
			||||||
    #[derive(Clone, Debug, PartialEq)]
 | 
					    #[derive(Clone, Debug, PartialEq)]
 | 
				
			||||||
@ -341,6 +349,9 @@ pub mod c {
 | 
				
			|||||||
                );
 | 
					                );
 | 
				
			||||||
                // maybe TODO: draw on the display buffer here
 | 
					                // maybe TODO: draw on the display buffer here
 | 
				
			||||||
                drawing::queue_redraw(ui_keyboard);
 | 
					                drawing::queue_redraw(ui_keyboard);
 | 
				
			||||||
 | 
					                unsafe {
 | 
				
			||||||
 | 
					                    eek_gtk_keyboard_emit_feedback(ui_keyboard);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -404,6 +415,9 @@ pub mod c {
 | 
				
			|||||||
                        &state,
 | 
					                        &state,
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    // maybe TODO: draw on the display buffer here
 | 
					                    // maybe TODO: draw on the display buffer here
 | 
				
			||||||
 | 
					                    unsafe {
 | 
				
			||||||
 | 
					                        eek_gtk_keyboard_emit_feedback(ui_keyboard);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                for wrapped_key in pressed {
 | 
					                for wrapped_key in pressed {
 | 
				
			||||||
 | 
				
			|||||||
@ -38,6 +38,7 @@ deps = [
 | 
				
			|||||||
  dependency('gio-2.0', version: '>=2.26.0'),
 | 
					  dependency('gio-2.0', version: '>=2.26.0'),
 | 
				
			||||||
  dependency('gnome-desktop-3.0', version: '>=3.0'),
 | 
					  dependency('gnome-desktop-3.0', version: '>=3.0'),
 | 
				
			||||||
  dependency('gtk+-3.0', version: '>=3.0'),
 | 
					  dependency('gtk+-3.0', version: '>=3.0'),
 | 
				
			||||||
 | 
					  dependency('libfeedback-0.0'),
 | 
				
			||||||
  dependency('wayland-client', version: '>=1.14'),
 | 
					  dependency('wayland-client', version: '>=1.14'),
 | 
				
			||||||
  dependency('xkbcommon'),
 | 
					  dependency('xkbcommon'),
 | 
				
			||||||
  cc.find_library('m'),
 | 
					  cc.find_library('m'),
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user