1 /*
2 * Copyright (C) 2020 Purism SPC
3 * SPDX-License-Identifier: GPL-3.0+
4 * Author: Guido Günther <agx@sigxcpu.org>
5 */
6
7 #define G_LOG_DOMAIN "fbd-feedback-dummy"
8
9 #include "fbd-enums.h"
10 #include "fbd-feedback-dummy.h"
11 #include "fbd-feedback-manager.h"
12
13 /**
14 * SECTION:fbd-feedback-dummy
15 * @short_description: Describes a dummy feedback event that does nothing
16 * @Title: FbdFeedbackDummy
17 */
18
19 enum {
20 PROP_0,
21 PROP_DURATION,
22 PROP_LAST_PROP,
23 };
24 static GParamSpec *props[PROP_LAST_PROP];
25
26 typedef struct _FbdFeedbackDummy {
27 FbdFeedbackBase parent;
28
29 guint duration;
30 guint timer_id;
31 } FbdFeedbackDummy;
32
33 G_DEFINE_TYPE (FbdFeedbackDummy, fbd_feedback_dummy, FBD_TYPE_FEEDBACK_BASE);
34
35 static void
fbd_feedback_dummy_set_property(GObject * object,guint property_id,const GValue * value,GParamSpec * pspec)36 fbd_feedback_dummy_set_property (GObject *object,
37 guint property_id,
38 const GValue *value,
39 GParamSpec *pspec)
40 {
41 FbdFeedbackDummy *self = FBD_FEEDBACK_DUMMY (object);
42
43 switch (property_id) {
44 case PROP_DURATION:
45 self->duration = g_value_get_uint (value);
46 break;
47 default:
48 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
49 break;
50 }
51 }
52
53 static void
fbd_feedback_dummy_get_property(GObject * object,guint property_id,GValue * value,GParamSpec * pspec)54 fbd_feedback_dummy_get_property (GObject *object,
55 guint property_id,
56 GValue *value,
57 GParamSpec *pspec)
58 {
59 FbdFeedbackDummy *self = FBD_FEEDBACK_DUMMY (object);
60
61 switch (property_id) {
62 case PROP_DURATION:
63 g_value_set_uint (value, self->duration);
64 break;
65 default:
66 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
67 break;
68 }
69 }
70
71 static gboolean
on_timeout_expired(FbdFeedbackDummy * self)72 on_timeout_expired (FbdFeedbackDummy *self)
73 {
74 fbd_feedback_base_done (FBD_FEEDBACK_BASE(self));
75 return G_SOURCE_REMOVE;
76 }
77
78 static void
fbd_feedback_dummy_run(FbdFeedbackBase * base)79 fbd_feedback_dummy_run (FbdFeedbackBase *base)
80 {
81 FbdFeedbackDummy *self = FBD_FEEDBACK_DUMMY (base);
82
83 if (self->duration) {
84 self->timer_id = g_timeout_add (self->duration,
85 (GSourceFunc)on_timeout_expired,
86 self);
87 g_source_set_name_by_id (self->timer_id, "feedback-dummy-timer");
88 } else {
89 fbd_feedback_base_done (base);
90 }
91 }
92
93 static void
fbd_feedback_dummy_end(FbdFeedbackBase * base)94 fbd_feedback_dummy_end (FbdFeedbackBase *base)
95 {
96 FbdFeedbackDummy *self = FBD_FEEDBACK_DUMMY (base);
97
98 g_clear_handle_id(&self->timer_id, g_source_remove);
99 fbd_feedback_base_done (base);
100 }
101
102 static void
fbd_feedback_dummy_class_init(FbdFeedbackDummyClass * klass)103 fbd_feedback_dummy_class_init (FbdFeedbackDummyClass *klass)
104 {
105 FbdFeedbackBaseClass *base_class = FBD_FEEDBACK_BASE_CLASS (klass);
106 GObjectClass *object_class = G_OBJECT_CLASS (klass);
107
108 object_class->set_property = fbd_feedback_dummy_set_property;
109 object_class->get_property = fbd_feedback_dummy_get_property;
110
111 base_class->run = fbd_feedback_dummy_run;
112 base_class->end = fbd_feedback_dummy_end;
113
114 props[PROP_DURATION] =
115 g_param_spec_uint (
116 "duration",
117 "Duration",
118 "Dummy event duration in msecs",
119 0, G_MAXUINT, 0,
120 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
121
122 g_object_class_install_properties (object_class, PROP_LAST_PROP, props);
123 }
124
125 static void
fbd_feedback_dummy_init(FbdFeedbackDummy * self)126 fbd_feedback_dummy_init (FbdFeedbackDummy *self)
127 {
128 }
129