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