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