aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPřemysl Janouch <p@janouch.name>2018-10-28 19:16:22 +0100
committerPřemysl Janouch <p@janouch.name>2018-10-28 19:16:22 +0100
commitda2899f72172205c86e48ac6a2f3dfcf78c3930a (patch)
tree380fb88d67f126c57f0902d2d76ed4fc4630c3ee
parent1f36351ab7cbded30f44f83ce6cdba414aa540c7 (diff)
downloaddesktop-tools-da2899f72172205c86e48ac6a2f3dfcf78c3930a.tar.gz
desktop-tools-da2899f72172205c86e48ac6a2f3dfcf78c3930a.tar.xz
desktop-tools-da2899f72172205c86e48ac6a2f3dfcf78c3930a.zip
paswitch: add robustness
-rw-r--r--paswitch.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/paswitch.c b/paswitch.c
index 18917dd..e8bb563 100644
--- a/paswitch.c
+++ b/paswitch.c
@@ -196,6 +196,15 @@ app_context_free (struct app_context *self)
poller_free (&self->poller);
}
+static struct sink *
+current_sink (struct app_context *ctx)
+{
+ LIST_FOR_EACH (struct sink, iter, ctx->sinks)
+ if (iter->index == ctx->selected_sink)
+ return iter;
+ return NULL;
+}
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#define VOLUME_PERCENT(x) (((x) * 100 + PA_VOLUME_NORM / 2) / PA_VOLUME_NORM)
@@ -260,9 +269,14 @@ on_sink_info (pa_context *context, const pa_sink_info *info, int eol,
}
if (!info || eol)
{
- // TODO: handle the case of when sinks disappear
- if (ctx->selected_sink == PA_INVALID_INDEX && ctx->sinks)
+ struct sink *sink = current_sink (ctx);
+ if (!sink && ctx->sinks)
+ {
ctx->selected_sink = ctx->sinks->index;
+ ctx->selected_port = -1;
+ }
+ else if (sink && ctx->selected_port >= (ssize_t) sink->ports_len)
+ ctx->selected_port = -1;
poller_idle_set (&ctx->redraw_event);
ctx->reset_sinks = true;
@@ -304,6 +318,8 @@ update_sinks (struct app_context *ctx)
(ctx->context, on_sink_info, ctx));
}
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
static void
forget_sink_inputs (struct app_context *ctx)
{
@@ -358,6 +374,8 @@ on_server_info (pa_context *context, const struct pa_server_info *info,
cstr_set (&ctx->default_sink, NULL);
}
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
static void
update_server_info (struct app_context *ctx)
{
@@ -600,11 +618,7 @@ on_action (struct app_context *ctx, enum action action)
{
poller_idle_set (&ctx->redraw_event);
- struct sink *sink = NULL;
- LIST_FOR_EACH (struct sink, iter, ctx->sinks)
- if (iter->index == ctx->selected_sink)
- sink = iter;
-
+ struct sink *sink = current_sink (ctx);
switch (action)
{
case ACTION_UP: