app: allow multiple variables as input to dashboard group-meter LED

When defining a dashboard group, allow specifying multiple
variables as input to the group meter's LED.  The LED is active
when any of the specified variables evaluates to TRUE, and its
color is the combination of the active variable colors.

Remove the swap-busy variable, and use swap-reading and
swap-writing as inputs to the swap group's LED instead, so that the
LED's color indicates whether the swap is currently being read-
from, written-to, or both.
This commit is contained in:
Ell 2018-06-28 11:20:26 -04:00
parent b3de0bb7a5
commit 716510cb83
2 changed files with 41 additions and 115 deletions

View File

@ -103,8 +103,6 @@ typedef enum
VARIABLE_SWAP_WRITTEN,
VARIABLE_SWAP_WRITING,
VARIABLE_SWAP_BUSY,
#ifdef HAVE_CPU_GROUP
/* cpu */
VARIABLE_CPU_USAGE,
@ -199,7 +197,7 @@ struct _GroupInfo
gboolean default_expanded;
gboolean has_meter;
Variable meter_limit;
Variable meter_led;
const Variable *meter_led;
const FieldInfo *fields;
};
@ -311,13 +309,6 @@ static void gimp_dashboard_sample_gegl_config (GimpDashboard
Variable variable);
static void gimp_dashboard_sample_gegl_stats (GimpDashboard *dashboard,
Variable variable);
static void gimp_dashboard_sample_variable_or (GimpDashboard *dashboard,
Variable variable);
#if 0
/* avoid "defined but not used" warning. un-#if 0 when needed */
static void gimp_dashboard_sample_variable_and (GimpDashboard *dashboard,
Variable variable);
#endif
static void gimp_dashboard_sample_variable_changed (GimpDashboard *dashboard,
Variable variable);
static void gimp_dashboard_sample_swap_limit (GimpDashboard *dashboard,
@ -485,6 +476,7 @@ static const VariableInfo variables[] =
.title = NC_("dashboard-variable", "Reading"),
.description = N_("Whether data is being read from the swap"),
.type = VARIABLE_TYPE_BOOLEAN,
.color = {0.2, 0.4, 1.0, 1.0},
.sample_func = gimp_dashboard_sample_variable_changed,
.data = GINT_TO_POINTER (VARIABLE_SWAP_READ)
},
@ -507,26 +499,11 @@ static const VariableInfo variables[] =
.title = NC_("dashboard-variable", "Writing"),
.description = N_("Whether data is being written to the swap"),
.type = VARIABLE_TYPE_BOOLEAN,
.color = {0.8, 0.3, 0.2, 1.0},
.sample_func = gimp_dashboard_sample_variable_changed,
.data = GINT_TO_POINTER (VARIABLE_SWAP_WRITTEN)
},
[VARIABLE_SWAP_BUSY] =
{ .name = "swap-busy",
.title = NC_("dashboard-variable", "Busy"),
.description = N_("Whether data is transferred to or from the swap"),
.type = VARIABLE_TYPE_BOOLEAN,
.color = {0.8, 0.4, 0.4, 1.0},
.sample_func = gimp_dashboard_sample_variable_or,
.data = (const Variable[])
{
VARIABLE_SWAP_READING,
VARIABLE_SWAP_WRITING,
VARIABLE_NONE
}
},
#ifdef HAVE_CPU_GROUP
/* cpu variables */
@ -651,7 +628,13 @@ static const GroupInfo groups[] =
.default_expanded = TRUE,
.has_meter = TRUE,
.meter_limit = VARIABLE_SWAP_LIMIT,
.meter_led = VARIABLE_SWAP_BUSY,
.meter_led = (const Variable[])
{
VARIABLE_SWAP_READING,
VARIABLE_SWAP_WRITING,
VARIABLE_NONE
},
.fields = (const FieldInfo[])
{
{ .variable = VARIABLE_SWAP_OCCUPIED,
@ -696,7 +679,12 @@ static const GroupInfo groups[] =
.default_active = TRUE,
.default_expanded = FALSE,
.has_meter = TRUE,
.meter_led = VARIABLE_CPU_ACTIVE,
.meter_led = (const Variable[])
{
VARIABLE_CPU_ACTIVE,
VARIABLE_NONE
},
.fields = (const FieldInfo[])
{
{ .variable = VARIABLE_CPU_USAGE,
@ -1023,12 +1011,6 @@ gimp_dashboard_init (GimpDashboard *dashboard)
gtk_box_pack_start (GTK_BOX (vbox2), meter, FALSE, FALSE, 0);
gtk_widget_show (meter);
if (group_info->meter_led)
{
gimp_meter_set_led_color (GIMP_METER (meter),
&variables[group_info->meter_led].color);
}
for (field = 0; field < group_data->n_fields; field++)
{
const FieldInfo *field_info = &group_info->fields[field];
@ -1677,22 +1659,7 @@ gimp_dashboard_update (GimpDashboard *dashboard)
g_mutex_lock (&priv->mutex);
for (group = FIRST_GROUP; group < N_GROUPS; group++)
{
const GroupInfo *group_info = &groups[group];
GroupData *group_data = &priv->groups[group];
if (group_info->has_meter && group_info->meter_led)
{
gboolean active;
active = gimp_dashboard_variable_to_boolean (dashboard,
group_info->meter_led);
gimp_meter_set_led_active (group_data->meter, active);
}
gimp_dashboard_update_group_values (dashboard, group);
}
gimp_dashboard_update_group_values (dashboard, group);
priv->update_idle_id = 0;
@ -1760,66 +1727,6 @@ gimp_dashboard_sample_gegl_stats (GimpDashboard *dashboard,
gimp_dashboard_sample_object (dashboard, G_OBJECT (gegl_stats ()), variable);
}
static void
gimp_dashboard_sample_variable_or (GimpDashboard *dashboard,
Variable variable)
{
GimpDashboardPrivate *priv = dashboard->priv;
const VariableInfo *variable_info = &variables[variable];
VariableData *variable_data = &priv->variables[variable];
const Variable *var;
variable_data->available = TRUE;
variable_data->value.boolean = FALSE;
for (var = variable_info->data; *var; var++)
{
const VariableData *var_data = &priv->variables[*var];
if (! var_data->available)
{
variable_data->available = FALSE;
break;
}
variable_data->value.boolean |= var_data->value.boolean;
}
}
#if 0
/* avoid "defined but not used" warning. un-#if 0 when needed */
static void
gimp_dashboard_sample_variable_and (GimpDashboard *dashboard,
Variable variable)
{
GimpDashboardPrivate *priv = dashboard->priv;
const VariableInfo *variable_info = &variables[variable];
VariableData *variable_data = &priv->variables[variable];
const Variable *var;
variable_data->available = TRUE;
variable_data->value.boolean = TRUE;
for (var = variable_info->data; *var; var++)
{
const VariableData *var_data = &priv->variables[*var];
if (! var_data->available)
{
variable_data->available = FALSE;
break;
}
variable_data->value.boolean &= var_data->value.boolean;
}
}
#endif /* 0 */
static void
gimp_dashboard_sample_variable_changed (GimpDashboard *dashboard,
Variable variable)
@ -2623,10 +2530,28 @@ gimp_dashboard_update_group_values (GimpDashboard *dashboard,
if (group_info->meter_led)
{
gimp_meter_set_led_active (
group_data->meter,
gimp_dashboard_variable_to_boolean (dashboard,
group_info->meter_led));
GimpRGB color = {0.0, 0.0, 0.0, 1.0};
gboolean active = FALSE;
const Variable *var;
for (var = group_info->meter_led; *var; var++)
{
if (gimp_dashboard_variable_to_boolean (dashboard, *var))
{
const VariableInfo *variable_info = &variables[*var];
color.r = MAX (color.r, variable_info->color.r);
color.g = MAX (color.g, variable_info->color.g);
color.b = MAX (color.b, variable_info->color.b);
active = TRUE;
}
}
if (active)
gimp_meter_set_led_color (group_data->meter, &color);
gimp_meter_set_led_active (group_data->meter, active);
}
}

View File

@ -1308,7 +1308,8 @@ gimp_meter_set_led_color (GimpMeter *meter,
{
meter->priv->led_color = *color;
gtk_widget_queue_draw (GTK_WIDGET (meter));
if (meter->priv->led_active)
gtk_widget_queue_draw (GTK_WIDGET (meter));
g_object_notify (G_OBJECT (meter), "led-color");
}