Reload theme on SIGHUP signal
Fixes #28 Allows for users/applications to request a theme reload by sending SIGHUP signal to the daemon.
This commit is contained in:
committed by
Guido Gunther
parent
753fff3e7a
commit
8e9bbd9d4c
@@ -95,6 +95,10 @@ You can add your own themes in one of two ways:
|
|||||||
$ sudo cp my_awesome_theme.json /usr/local/share/feedbackd/themes/
|
$ sudo cp my_awesome_theme.json /usr/local/share/feedbackd/themes/
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Upon reception of `SIGHUP` signal, the daemon process will proceed to retrigger
|
||||||
|
the above logic to find the themes, and reload the corresponding one. This can
|
||||||
|
be used to avoid having to restart the daemon in case of configuration changes.
|
||||||
|
|
||||||
Check out the companion [feedbackd-device-themes][1] repository for a
|
Check out the companion [feedbackd-device-themes][1] repository for a
|
||||||
selection of device-specific themes. In order for your theme to be recognized
|
selection of device-specific themes. In order for your theme to be recognized
|
||||||
it must be named properly. Currently, theme names are based on the `compatible`
|
it must be named properly. Currently, theme names are based on the `compatible`
|
||||||
|
|||||||
+29
-19
@@ -492,29 +492,11 @@ find_themefile (void)
|
|||||||
static void
|
static void
|
||||||
fbd_feedback_manager_constructed (GObject *object)
|
fbd_feedback_manager_constructed (GObject *object)
|
||||||
{
|
{
|
||||||
g_autoptr (GError) err = NULL;
|
|
||||||
FbdFeedbackManager *self = FBD_FEEDBACK_MANAGER (object);
|
FbdFeedbackManager *self = FBD_FEEDBACK_MANAGER (object);
|
||||||
const gchar *themefile;
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (fbd_feedback_manager_parent_class)->constructed (object);
|
G_OBJECT_CLASS (fbd_feedback_manager_parent_class)->constructed (object);
|
||||||
|
|
||||||
// Overide themefile with environment variable if requested
|
fbd_feedback_manager_load_theme(self);
|
||||||
themefile = g_getenv (FEEDBACKD_THEME_VAR);
|
|
||||||
|
|
||||||
// Search for device-specific configuration
|
|
||||||
if (!themefile)
|
|
||||||
themefile = find_themefile ();
|
|
||||||
|
|
||||||
// Fallback to default configuration if needed
|
|
||||||
if (!themefile)
|
|
||||||
themefile = FEEDBACKD_THEME_DIR "/default.json";
|
|
||||||
g_info ("Using themefile: %s", themefile);
|
|
||||||
|
|
||||||
self->theme = fbd_feedback_theme_new_from_file (themefile, &err);
|
|
||||||
if (!self->theme) {
|
|
||||||
/* No point to carry on */
|
|
||||||
g_error ("Failed to load theme: %s", err->message);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_signal_connect (self, "notify::profile", (GCallback)on_profile_changed, NULL);
|
g_signal_connect (self, "notify::profile", (GCallback)on_profile_changed, NULL);
|
||||||
lfb_gdbus_feedback_set_profile (LFB_GDBUS_FEEDBACK (self),
|
lfb_gdbus_feedback_set_profile (LFB_GDBUS_FEEDBACK (self),
|
||||||
@@ -617,6 +599,34 @@ fbd_feedback_manager_get_dev_leds (FbdFeedbackManager *self)
|
|||||||
return self->leds;
|
return self->leds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fbd_feedback_manager_load_theme (FbdFeedbackManager *self) {
|
||||||
|
g_autoptr (GError) err = NULL;
|
||||||
|
g_autoptr (FbdFeedbackTheme) theme = NULL;
|
||||||
|
const gchar *themefile;
|
||||||
|
|
||||||
|
// Overide themefile with environment variable if requested
|
||||||
|
themefile = g_getenv (FEEDBACKD_THEME_VAR);
|
||||||
|
|
||||||
|
// Search for device-specific configuration
|
||||||
|
if (!themefile)
|
||||||
|
themefile = find_themefile ();
|
||||||
|
|
||||||
|
// Fallback to default configuration if needed
|
||||||
|
if (!themefile)
|
||||||
|
themefile = FEEDBACKD_THEME_DIR "/default.json";
|
||||||
|
g_info ("Using themefile: %s", themefile);
|
||||||
|
|
||||||
|
theme = fbd_feedback_theme_new_from_file (themefile, &err);
|
||||||
|
if (theme) {
|
||||||
|
g_set_object(&self->theme, theme);
|
||||||
|
} else {
|
||||||
|
if (self->theme)
|
||||||
|
g_warning ("Failed to reload theme: %s", err->message);
|
||||||
|
else
|
||||||
|
g_error ("Failed to load theme: %s", err->message); // No point to carry on
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
fbd_feedback_manager_set_profile (FbdFeedbackManager *self, const gchar *profile)
|
fbd_feedback_manager_set_profile (FbdFeedbackManager *self, const gchar *profile)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ FbdFeedbackManager *fbd_feedback_manager_get_default (void);
|
|||||||
FbdDevVibra *fbd_feedback_manager_get_dev_vibra (FbdFeedbackManager *self);
|
FbdDevVibra *fbd_feedback_manager_get_dev_vibra (FbdFeedbackManager *self);
|
||||||
FbdDevSound *fbd_feedback_manager_get_dev_sound (FbdFeedbackManager *self);
|
FbdDevSound *fbd_feedback_manager_get_dev_sound (FbdFeedbackManager *self);
|
||||||
FbdDevLeds *fbd_feedback_manager_get_dev_leds (FbdFeedbackManager *self);
|
FbdDevLeds *fbd_feedback_manager_get_dev_leds (FbdFeedbackManager *self);
|
||||||
|
void fbd_feedback_manager_load_theme (FbdFeedbackManager *self);
|
||||||
gboolean fbd_feedback_manager_set_profile (FbdFeedbackManager *self, const gchar *profile);
|
gboolean fbd_feedback_manager_set_profile (FbdFeedbackManager *self, const gchar *profile);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|||||||
@@ -42,6 +42,18 @@ quit_cb (gpointer user_data)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
reload_cb (gpointer user_data)
|
||||||
|
{
|
||||||
|
FbdFeedbackManager *manager = fbd_feedback_manager_get_default();
|
||||||
|
|
||||||
|
g_return_val_if_fail (FBD_IS_FEEDBACK_MANAGER (manager), FALSE);
|
||||||
|
|
||||||
|
g_debug ("Caught signal, reloading feedback theme...");
|
||||||
|
fbd_feedback_manager_load_theme (manager);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bus_acquired_cb (GDBusConnection *connection,
|
bus_acquired_cb (GDBusConnection *connection,
|
||||||
@@ -102,6 +114,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
g_unix_signal_add (SIGTERM, quit_cb, NULL);
|
g_unix_signal_add (SIGTERM, quit_cb, NULL);
|
||||||
g_unix_signal_add (SIGINT, quit_cb, NULL);
|
g_unix_signal_add (SIGINT, quit_cb, NULL);
|
||||||
|
g_unix_signal_add (SIGHUP, reload_cb, NULL);
|
||||||
|
|
||||||
loop = g_main_loop_new (NULL, FALSE);
|
loop = g_main_loop_new (NULL, FALSE);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user