summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Melorio <marco.melorio@protonmail.com>2022-09-08 18:46:08 +0200
committerMarco Melorio <marco.melorio@protonmail.com>2022-12-21 01:39:36 +0100
commitba4e983b9705325d03db38336c2770cfc86a54df (patch)
treedab8ce364c2bc8a0fff991c801d1d9b1e03bbeeb
parent4ddfecc79d1e5711f976ed706b79fb8f7eaee610 (diff)
downloadgnome-control-center-ba4e983b9705325d03db38336c2770cfc86a54df.tar.gz
sound: Port CcLevelbar to use a GtkLevelBar internally
-rw-r--r--panels/sound/cc-level-bar.c121
-rw-r--r--panels/sound/cc-level-bar.h3
-rw-r--r--panels/sound/cc-sound-panel.c4
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