diff options
author | Marco Melorio <marco.melorio@protonmail.com> | 2022-09-08 18:46:08 +0200 |
---|---|---|
committer | Marco Melorio <marco.melorio@protonmail.com> | 2022-12-21 01:39:36 +0100 |
commit | ba4e983b9705325d03db38336c2770cfc86a54df (patch) | |
tree | dab8ce364c2bc8a0fff991c801d1d9b1e03bbeeb | |
parent | 4ddfecc79d1e5711f976ed706b79fb8f7eaee610 (diff) | |
download | gnome-control-center-ba4e983b9705325d03db38336c2770cfc86a54df.tar.gz |
sound: Port CcLevelbar to use a GtkLevelBar internally
-rw-r--r-- | panels/sound/cc-level-bar.c | 121 | ||||
-rw-r--r-- | panels/sound/cc-level-bar.h | 3 | ||||
-rw-r--r-- | panels/sound/cc-sound-panel.c | 4 |
3 files changed, 22 insertions, 106 deletions
diff --git a/panels/sound/cc-level-bar.c b/panels/sound/cc-level-bar.c index 863613238..abbec890e 100644 --- a/panels/sound/cc-level-bar.c +++ b/panels/sound/cc-level-bar.c @@ -22,21 +22,15 @@ struct _CcLevelBar { - GtkWidget parent_instance; + GtkWidget parent_instance; - CcStreamType type; - pa_stream *level_stream; - gdouble last_input_peak; - - gdouble value; + GtkLevelBar *level_bar; + pa_stream *level_stream; + gdouble last_input_peak; }; G_DEFINE_TYPE (CcLevelBar, cc_level_bar, GTK_TYPE_WIDGET) -#define LED_WIDTH 12 -#define LED_HEIGHT 3 -#define LED_SPACING 4 - #define DECAY_STEP .15 static void @@ -53,8 +47,7 @@ set_peak (CcLevelBar *self, value = self->last_input_peak - DECAY_STEP; self->last_input_peak = value; - self->value = value; - gtk_widget_queue_draw (GTK_WIDGET (self)); + gtk_level_bar_set_value (self->level_bar, value); } static void @@ -97,90 +90,11 @@ suspended_cb (pa_stream *stream, if (pa_stream_is_suspended (stream)) { g_debug ("Stream suspended"); - self->value = 0.0; - gtk_widget_queue_draw (GTK_WIDGET (self)); - } -} - -static void -cc_level_bar_measure (GtkWidget *widget, - GtkOrientation orientation, - int for_size, - int *minimum, - int *natural, - int *minimum_baseline, - int *natural_baseline) -{ - if (orientation == GTK_ORIENTATION_VERTICAL) - { - *minimum = *natural = LED_HEIGHT; - } - else - { - GTK_WIDGET_CLASS (cc_level_bar_parent_class)->measure (widget, - orientation, - for_size, - minimum, - natural, - minimum_baseline, - natural_baseline); + gtk_level_bar_set_value (self->level_bar, 0.0); } } static void -cc_level_bar_snapshot (GtkWidget *widget, - GtkSnapshot *snapshot) -{ - CcLevelBar *self = CC_LEVEL_BAR (widget); - GdkRGBA inactive_color, active_color; - int i, n_leds; - double level; - double spacing, x_offset = 0.0; - - n_leds = gtk_widget_get_width (widget) / (LED_WIDTH + LED_SPACING); - spacing = (double) (gtk_widget_get_width (widget) - (n_leds * LED_WIDTH)) / (n_leds - 1); - level = self->value * n_leds; - - gdk_rgba_parse (&inactive_color, "#C0C0C0"); - switch (self->type) - { - default: - case CC_STREAM_TYPE_OUTPUT: - gdk_rgba_parse (&active_color, "#4a90d9"); - break; - case CC_STREAM_TYPE_INPUT: - gdk_rgba_parse (&active_color, "#ff0000"); - break; - } - - for (i = 0; i < n_leds; i++) - { - GdkRGBA blended_color; - double led_level; - - led_level = level - i; - if (led_level < 0.0) - led_level = 0.0; - else if (led_level > 1.0) - led_level = 1.0; - - blended_color = (GdkRGBA) { - .red = (1.0 - led_level) * inactive_color.red + led_level * active_color.red, - .green = (1.0 - led_level) * inactive_color.green + led_level * active_color.green, - .blue = (1.0 - led_level) * inactive_color.blue + led_level * active_color.blue, - .alpha = 1.0, - }; - - gtk_snapshot_append_color (snapshot, - &blended_color, - &GRAPHENE_RECT_INIT (x_offset, 0, - LED_WIDTH, - gtk_widget_get_height (widget))); - x_offset += LED_WIDTH + spacing; - } -} - -static void close_stream (pa_stream *stream) { if (stream == NULL) @@ -202,6 +116,8 @@ cc_level_bar_dispose (GObject *object) close_stream (self->level_stream); g_clear_pointer (&self->level_stream, pa_stream_unref); + gtk_widget_unparent (GTK_WIDGET (self->level_bar)); + G_OBJECT_CLASS (cc_level_bar_parent_class)->dispose (object); } @@ -213,19 +129,25 @@ cc_level_bar_class_init (CcLevelBarClass *klass) object_class->dispose = cc_level_bar_dispose; - widget_class->measure = cc_level_bar_measure; - widget_class->snapshot = cc_level_bar_snapshot; + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT); } void cc_level_bar_init (CcLevelBar *self) { + self->level_bar = GTK_LEVEL_BAR (gtk_level_bar_new ()); + + // Make the level bar all the same color by removing all pre-existing offsets + gtk_level_bar_remove_offset_value (self->level_bar, GTK_LEVEL_BAR_OFFSET_LOW); + gtk_level_bar_remove_offset_value (self->level_bar, GTK_LEVEL_BAR_OFFSET_HIGH); + gtk_level_bar_remove_offset_value (self->level_bar, GTK_LEVEL_BAR_OFFSET_FULL); + + gtk_widget_set_parent (GTK_WIDGET (self->level_bar), GTK_WIDGET (self)); } void cc_level_bar_set_stream (CcLevelBar *self, - GvcMixerStream *stream, - CcStreamType type) + GvcMixerStream *stream) { pa_context *context; pa_sample_spec sample_spec; @@ -238,12 +160,9 @@ cc_level_bar_set_stream (CcLevelBar *self, close_stream (self->level_stream); g_clear_pointer (&self->level_stream, pa_stream_unref); - self->type = type; - if (stream == NULL) { - self->value = 0.0; - gtk_widget_queue_draw (GTK_WIDGET (self)); + gtk_level_bar_set_value (self->level_bar, 0.0); return; } @@ -285,6 +204,4 @@ cc_level_bar_set_stream (CcLevelBar *self, { g_warning ("Failed to connect monitoring stream"); } - - gtk_widget_queue_draw (GTK_WIDGET (self)); } diff --git a/panels/sound/cc-level-bar.h b/panels/sound/cc-level-bar.h index 34ef1ea60..499b645fa 100644 --- a/panels/sound/cc-level-bar.h +++ b/panels/sound/cc-level-bar.h @@ -30,7 +30,6 @@ G_BEGIN_DECLS G_DECLARE_FINAL_TYPE (CcLevelBar, cc_level_bar, CC, LEVEL_BAR, GtkWidget) void cc_level_bar_set_stream (CcLevelBar *bar, - GvcMixerStream *stream, - CcStreamType type); + GvcMixerStream *stream); G_END_DECLS diff --git a/panels/sound/cc-sound-panel.c b/panels/sound/cc-sound-panel.c index 0de1ca9f2..1fc99e4b6 100644 --- a/panels/sound/cc-sound-panel.c +++ b/panels/sound/cc-sound-panel.c @@ -97,7 +97,7 @@ set_output_stream (CcSoundPanel *self, gboolean can_fade = FALSE, has_lfe = FALSE; cc_volume_slider_set_stream (self->output_volume_slider, stream, CC_STREAM_TYPE_OUTPUT); - cc_level_bar_set_stream (self->output_level_bar, stream, CC_STREAM_TYPE_OUTPUT); + cc_level_bar_set_stream (self->output_level_bar, stream); if (stream != NULL) { @@ -135,7 +135,7 @@ set_input_stream (CcSoundPanel *self, GvcMixerStream *stream) { cc_volume_slider_set_stream (self->input_volume_slider, stream, CC_STREAM_TYPE_INPUT); - cc_level_bar_set_stream (self->input_level_bar, stream, CC_STREAM_TYPE_INPUT); + cc_level_bar_set_stream (self->input_level_bar, stream); } static void |