mirror of
https://gitlab.gnome.org/GNOME/calls.git
synced 2024-12-14 00:17:35 +00:00
ui-call-data: Add property to delay showing call display and ringing
This "ui-active" property should be set to FALSE for new incoming calls and set to TRUE after a short delay of 20ms. This property is used to delay showing the call display and starting to ring. This delay gives DBus clients like phosh-antispam (https://gitlab.com/kop316/phosh-antispam) some time to make a decision whether a call should be hung up or not and defer starting to ring and showing the display only afterwards.
This commit is contained in:
parent
8f8da42f76
commit
1d5c8952ad
2 changed files with 83 additions and 0 deletions
|
@ -42,6 +42,7 @@ enum {
|
||||||
PROP_AVATAR_ICON,
|
PROP_AVATAR_ICON,
|
||||||
PROP_ACTIVE_TIME,
|
PROP_ACTIVE_TIME,
|
||||||
PROP_SILENCED,
|
PROP_SILENCED,
|
||||||
|
PROP_UI_ACTIVE,
|
||||||
PROP_LAST_PROP
|
PROP_LAST_PROP
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -66,6 +67,9 @@ struct _CallsUiCallData
|
||||||
|
|
||||||
CuiCallState state;
|
CuiCallState state;
|
||||||
gboolean silenced;
|
gboolean silenced;
|
||||||
|
|
||||||
|
gboolean ui_active; /* whether a UI should be shown (or the ringer should ring) */
|
||||||
|
guint set_active_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void calls_ui_call_data_cui_call_interface_init (CuiCallInterface *iface);
|
static void calls_ui_call_data_cui_call_interface_init (CuiCallInterface *iface);
|
||||||
|
@ -260,6 +264,7 @@ set_state (CallsUiCallData *self,
|
||||||
} else if (new_state == CUI_CALL_STATE_DISCONNECTED) {
|
} else if (new_state == CUI_CALL_STATE_DISCONNECTED) {
|
||||||
g_clear_handle_id (&self->timer_id, g_source_remove);
|
g_clear_handle_id (&self->timer_id, g_source_remove);
|
||||||
g_clear_pointer (&self->timer, g_timer_destroy);
|
g_clear_pointer (&self->timer, g_timer_destroy);
|
||||||
|
g_clear_handle_id (&self->set_active_id, g_source_remove);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_STATE]);
|
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_STATE]);
|
||||||
|
@ -345,6 +350,56 @@ set_call_data (CallsUiCallData *self,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_ui_active (CallsUiCallData *self,
|
||||||
|
gboolean active)
|
||||||
|
{
|
||||||
|
g_assert (CALLS_IS_UI_CALL_DATA (self));
|
||||||
|
|
||||||
|
if (self->ui_active == active)
|
||||||
|
return;
|
||||||
|
|
||||||
|
self->ui_active = active;
|
||||||
|
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_UI_ACTIVE]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
on_delay_set_active (CallsUiCallData *self)
|
||||||
|
{
|
||||||
|
g_assert (CALLS_IS_UI_CALL_DATA (self));
|
||||||
|
|
||||||
|
set_ui_active (self, TRUE);
|
||||||
|
|
||||||
|
self->set_active_id = 0;
|
||||||
|
g_object_unref (self);
|
||||||
|
|
||||||
|
return G_SOURCE_REMOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define DELAY_UI_MS 15
|
||||||
|
static void
|
||||||
|
calls_ui_call_data_constructed (GObject *object)
|
||||||
|
{
|
||||||
|
CallsUiCallData *self = CALLS_UI_CALL_DATA (object);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (calls_ui_call_data_parent_class)->constructed (object);
|
||||||
|
|
||||||
|
if (!calls_call_get_inbound (self->call) || self->state != CUI_CALL_STATE_INCOMING) {
|
||||||
|
set_ui_active (self, TRUE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_ui_active (self, FALSE);
|
||||||
|
self->set_active_id = g_timeout_add (DELAY_UI_MS,
|
||||||
|
G_SOURCE_FUNC (on_delay_set_active),
|
||||||
|
g_object_ref (self));
|
||||||
|
}
|
||||||
|
#undef DELAY_UI_MS
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
calls_ui_call_data_set_property (GObject *object,
|
calls_ui_call_data_set_property (GObject *object,
|
||||||
guint property_id,
|
guint property_id,
|
||||||
|
@ -419,6 +474,10 @@ calls_ui_call_data_get_property (GObject *object,
|
||||||
g_value_set_boolean (value, calls_ui_call_data_get_silenced (self));
|
g_value_set_boolean (value, calls_ui_call_data_get_silenced (self));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PROP_UI_ACTIVE:
|
||||||
|
g_value_set_boolean (value, calls_ui_call_data_get_ui_active (self));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -449,6 +508,7 @@ calls_ui_call_data_class_init (CallsUiCallDataClass *klass)
|
||||||
{
|
{
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->constructed = calls_ui_call_data_constructed;
|
||||||
object_class->set_property = calls_ui_call_data_set_property;
|
object_class->set_property = calls_ui_call_data_set_property;
|
||||||
object_class->get_property = calls_ui_call_data_get_property;
|
object_class->get_property = calls_ui_call_data_get_property;
|
||||||
object_class->dispose = calls_ui_call_data_dispose;
|
object_class->dispose = calls_ui_call_data_dispose;
|
||||||
|
@ -490,6 +550,15 @@ calls_ui_call_data_class_init (CallsUiCallDataClass *klass)
|
||||||
|
|
||||||
g_object_class_install_property (object_class, PROP_SILENCED, props[PROP_SILENCED]);
|
g_object_class_install_property (object_class, PROP_SILENCED, props[PROP_SILENCED]);
|
||||||
|
|
||||||
|
props[PROP_UI_ACTIVE] =
|
||||||
|
g_param_spec_boolean ("ui-active",
|
||||||
|
"UI active",
|
||||||
|
"Whether the UI should be shown",
|
||||||
|
FALSE,
|
||||||
|
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY);
|
||||||
|
|
||||||
|
g_object_class_install_property (object_class, PROP_UI_ACTIVE, props[PROP_UI_ACTIVE]);
|
||||||
|
|
||||||
g_object_class_override_property (object_class, PROP_ID, "id");
|
g_object_class_override_property (object_class, PROP_ID, "id");
|
||||||
props[PROP_ID] = g_object_class_find_property (object_class, "id");
|
props[PROP_ID] = g_object_class_find_property (object_class, "id");
|
||||||
|
|
||||||
|
@ -569,6 +638,19 @@ calls_ui_call_data_get_silenced (CallsUiCallData *self)
|
||||||
return self->silenced;
|
return self->silenced;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* calls_ui_call_data_get_ui_active:
|
||||||
|
* @self: a #CallsUiCallData
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if the UI should be shown, %FALSE otherwise
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
calls_ui_call_data_get_ui_active (CallsUiCallData *self)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (CALLS_UI_CALL_DATA (self), FALSE);
|
||||||
|
|
||||||
|
return self->ui_active;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* calls_call_state_to_cui_call_state:
|
* calls_call_state_to_cui_call_state:
|
||||||
|
|
|
@ -38,6 +38,7 @@ G_DECLARE_FINAL_TYPE (CallsUiCallData, calls_ui_call_data, CALLS, UI_CALL_DATA,
|
||||||
CallsUiCallData *calls_ui_call_data_new (CallsCall *call);
|
CallsUiCallData *calls_ui_call_data_new (CallsCall *call);
|
||||||
void calls_ui_call_data_silence_ring (CallsUiCallData *self);
|
void calls_ui_call_data_silence_ring (CallsUiCallData *self);
|
||||||
gboolean calls_ui_call_data_get_silenced (CallsUiCallData *self);
|
gboolean calls_ui_call_data_get_silenced (CallsUiCallData *self);
|
||||||
|
gboolean calls_ui_call_data_get_ui_active (CallsUiCallData *self);
|
||||||
CuiCallState calls_call_state_to_cui_call_state (CallsCallState state);
|
CuiCallState calls_call_state_to_cui_call_state (CallsCallState state);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
Loading…
Reference in a new issue