summaryrefslogtreecommitdiff
path: root/src/ck-inhibit-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ck-inhibit-manager.c')
-rw-r--r--src/ck-inhibit-manager.c195
1 files changed, 150 insertions, 45 deletions
diff --git a/src/ck-inhibit-manager.c b/src/ck-inhibit-manager.c
index dea354f..2031643 100644
--- a/src/ck-inhibit-manager.c
+++ b/src/ck-inhibit-manager.c
@@ -41,10 +41,12 @@ struct CkInhibitManagerPrivate
* it's doubtful there will be more than a dozen items in the list.
*/
GList *inhibit_list;
- /* inhibitors is an array of which events to suppress.
+ /* inhibitors is an 2-dimensional array of which events to suppress
+ * and how they are suppressed.
* The CkInhibitEvent value is used to indicate how many different
- * inhibits are suppressing that event. */
- gint inhibitors[CK_INHIBIT_EVENT_LAST];
+ * inhibits are suppressing that event. The CkInhibitMode indicates
+ * if it's a block or delay event */
+ gint inhibitors[CK_INHIBIT_MODE_LAST][CK_INHIBIT_EVENT_LAST];
};
typedef enum {
@@ -76,9 +78,9 @@ ck_inhibit_manager_class_init (CkInhibitManagerClass *klass)
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (CkInhibitManagerClass, changed_event),
NULL, NULL,
- ck_marshal_VOID__INT_BOOLEAN,
+ ck_marshal_VOID__INT_INT_BOOLEAN,
G_TYPE_NONE,
- 2, G_TYPE_INT, G_TYPE_BOOLEAN);
+ 3, G_TYPE_INT, G_TYPE_INT, G_TYPE_BOOLEAN);
}
static void
@@ -94,7 +96,11 @@ ck_inhibit_manager_finalize (GObject *object)
}
static void
-cb_changed_event (CkInhibit *inhibit, gint event, gboolean enabled, gpointer user_data)
+cb_changed_event (CkInhibit *inhibit,
+ gint inhibit_mode,
+ gint event,
+ gboolean enabled,
+ gpointer user_data)
{
CkInhibitManager *manager;
CkInhibitManagerPrivate *priv;
@@ -111,29 +117,31 @@ cb_changed_event (CkInhibit *inhibit, gint event, gboolean enabled, gpointer use
}
if (enabled) {
- priv->inhibitors[event]++;
+ priv->inhibitors[inhibit_mode][event]++;
- if (priv->inhibitors[event] == 1) {
+ if (priv->inhibitors[inhibit_mode][event] == 1) {
/* event is now inhibited, send a notification */
g_signal_emit(G_OBJECT (manager),
__signals[SIG_CHANGED_EVENT],
0,
+ inhibit_mode,
event,
TRUE);
}
} else {
- priv->inhibitors[event]--;
- if (priv->inhibitors[event] < 0) {
- g_warning ("cb_changed_event: priv->inhibitors[%d] "
+ priv->inhibitors[inhibit_mode][event]--;
+ if (priv->inhibitors[inhibit_mode][event] < 0) {
+ g_warning ("cb_changed_event: priv->inhibitors[%d][%d] "
"is negative, that's not supposed to happen",
- event);
+ inhibit_mode, event);
}
- if (priv->inhibitors[event] == 0) {
+ if (priv->inhibitors[inhibit_mode][event] == 0) {
/* event is no longer inhibited, send a notification */
g_signal_emit(G_OBJECT (manager),
__signals[SIG_CHANGED_EVENT],
0,
+ inhibit_mode,
event,
FALSE);
}
@@ -152,6 +160,10 @@ cb_changed_event (CkInhibit *inhibit, gint event, gboolean enabled, gpointer use
* @why: A human-readable, descriptive string of why the program
* is taking the lock. Example: "Burning a DVD, interrupting now
* will ruin the DVD."
+ * @mode: Must either be block or delay. block prevents the operation
+ * from happening and will cause a call to perform that action
+ * to fail. delay temporarly prevents the operation from happening
+ * until either the lock is released or a timeout is reached.
*
* Initializes an inhibit lock with the supplied paramters and returns
* the named pipe. An application can only hold one lock at a time, multiple
@@ -165,7 +177,8 @@ gint
ck_inhibit_manager_create_lock (CkInhibitManager *manager,
const gchar *who,
const gchar *what,
- const gchar *why)
+ const gchar *why,
+ const gchar *mode)
{
CkInhibitManagerPrivate *priv;
CkInhibit *inhibit;
@@ -187,7 +200,7 @@ ck_inhibit_manager_create_lock (CkInhibitManager *manager,
*/
signal_id = g_signal_connect (inhibit, "changed-event", G_CALLBACK (cb_changed_event), manager);
- fd = ck_inhibit_create_lock (inhibit, who, what, why);
+ fd = ck_inhibit_create_lock (inhibit, who, what, why, mode);
if (fd == -1) {
g_error ("error creating inhibit lock");
@@ -269,86 +282,178 @@ ck_inhibit_manager_get (void)
return CK_INHIBIT_MANAGER (manager);
}
+static gboolean
+get_inhibit_status (CkInhibitManager *manager, CkInhibitEvent event, CkInhibitMode mode)
+{
+ g_return_val_if_fail (CK_IS_INHIBIT_MANAGER (manager), FALSE);
+
+ return manager->priv->inhibitors[mode][event] > 0 ? TRUE : FALSE;
+}
+
/**
- * ck_inhibit_manager_is_shutdown_inhibited:
+ * ck_inhibit_manager_is_shutdown_delayed:
* @manager: The @CkInhibitManager object
*
- * Return value: TRUE is inhibited.
+ * Return value: TRUE is delayed.
**/
gboolean
-ck_inhibit_manager_is_shutdown_inhibited (CkInhibitManager *manager)
+ck_inhibit_manager_is_shutdown_delayed (CkInhibitManager *manager)
{
- g_return_val_if_fail (CK_IS_INHIBIT_MANAGER (manager), FALSE);
+ return get_inhibit_status (manager, CK_INHIBIT_EVENT_SHUTDOWN, CK_INHIBIT_MODE_DELAY);
+}
- return manager->priv->inhibitors[CK_INHIBIT_EVENT_SHUTDOWN] > 0 ? TRUE : FALSE;
+/**
+ * ck_inhibit_manager_is_shutdown_blocked:
+ * @manager: The @CkInhibitManager object
+ *
+ * Return value: TRUE is blocked.
+ **/
+gboolean
+ck_inhibit_manager_is_shutdown_blocked (CkInhibitManager *manager)
+{
+ return get_inhibit_status (manager, CK_INHIBIT_EVENT_SHUTDOWN, CK_INHIBIT_MODE_BLOCK);
}
/**
- * ck_inhibit_manager_is_suspend_inhibited:
+ * ck_inhibit_manager_is_suspend_delayed:
* @manager: The @CkInhibitManager object
*
- * Return value: TRUE is inhibited.
+ * Return value: TRUE is delayed.
**/
gboolean
-ck_inhibit_manager_is_suspend_inhibited (CkInhibitManager *manager)
+ck_inhibit_manager_is_suspend_delayed (CkInhibitManager *manager)
{
- g_return_val_if_fail (CK_IS_INHIBIT_MANAGER (manager), FALSE);
+ return get_inhibit_status (manager, CK_INHIBIT_EVENT_SUSPEND, CK_INHIBIT_MODE_DELAY);
+}
- return manager->priv->inhibitors[CK_INHIBIT_EVENT_SUSPEND] > 0 ? TRUE : FALSE;
+/**
+ * ck_inhibit_manager_is_suspend_blocked:
+ * @manager: The @CkInhibitManager object
+ *
+ * Return value: TRUE is blocked.
+ **/
+gboolean
+ck_inhibit_manager_is_suspend_blocked (CkInhibitManager *manager)
+{
+ return get_inhibit_status (manager, CK_INHIBIT_EVENT_SUSPEND, CK_INHIBIT_MODE_BLOCK);
}
/**
- * ck_inhibit_manager_is_idle_inhibited:
+ * ck_inhibit_manager_is_idle_delayed:
* @manager: The @CkInhibitManager object
*
- * Return value: TRUE is inhibited.
+ * Return value: TRUE is delayed.
**/
gboolean
-ck_inhibit_manager_is_idle_inhibited (CkInhibitManager *manager)
+ck_inhibit_manager_is_idle_delayed (CkInhibitManager *manager)
{
- g_return_val_if_fail (CK_IS_INHIBIT_MANAGER (manager), FALSE);
+ return get_inhibit_status (manager, CK_INHIBIT_EVENT_IDLE, CK_INHIBIT_MODE_DELAY);
+}
- return manager->priv->inhibitors[CK_INHIBIT_EVENT_IDLE] > 0 ? TRUE : FALSE;
+/**
+ * ck_inhibit_manager_is_idle_blocked:
+ * @manager: The @CkInhibitManager object
+ *
+ * Return value: TRUE is blocked.
+ **/
+gboolean
+ck_inhibit_manager_is_idle_blocked (CkInhibitManager *manager)
+{
+ return get_inhibit_status (manager, CK_INHIBIT_EVENT_IDLE, CK_INHIBIT_MODE_BLOCK);
}
/**
- * ck_inhibit_manager_is_power_key_inhibited:
+ * ck_inhibit_manager_is_power_key_delayed:
* @manager: The @CkInhibitManager object
*
- * Return value: TRUE is inhibited.
+ * Return value: TRUE is delayed.
**/
gboolean
-ck_inhibit_manager_is_power_key_inhibited (CkInhibitManager *manager)
+ck_inhibit_manager_is_power_key_delayed (CkInhibitManager *manager)
{
- g_return_val_if_fail (CK_IS_INHIBIT_MANAGER (manager), FALSE);
+ return get_inhibit_status (manager, CK_INHIBIT_EVENT_POWER_KEY, CK_INHIBIT_MODE_DELAY);
+}
- return manager->priv->inhibitors[CK_INHIBIT_EVENT_POWER_KEY] > 0 ? TRUE : FALSE;
+/**
+ * ck_inhibit_manager_is_power_key_blocked:
+ * @manager: The @CkInhibitManager object
+ *
+ * Return value: TRUE is blocked.
+ **/
+gboolean
+ck_inhibit_manager_is_power_key_blocked (CkInhibitManager *manager)
+{
+ return get_inhibit_status (manager, CK_INHIBIT_EVENT_POWER_KEY, CK_INHIBIT_MODE_BLOCK);
}
/**
- * ck_inhibit_manager_is_suspend_key_inhibited:
+ * ck_inhibit_manager_is_suspend_key_delayed:
* @manager: The @CkInhibitManager object
*
- * Return value: TRUE is inhibited.
+ * Return value: TRUE is delayed.
**/
gboolean
-ck_inhibit_manager_is_suspend_key_inhibited (CkInhibitManager *manager)
+ck_inhibit_manager_is_suspend_key_delayed (CkInhibitManager *manager)
{
- g_return_val_if_fail (CK_IS_INHIBIT_MANAGER (manager), FALSE);
+ return get_inhibit_status (manager, CK_INHIBIT_EVENT_SUSPEND_KEY, CK_INHIBIT_MODE_DELAY);
+}
- return manager->priv->inhibitors[CK_INHIBIT_EVENT_SUSPEND_KEY] > 0 ? TRUE : FALSE;
+/**
+ * ck_inhibit_manager_is_suspend_key_blocked:
+ * @manager: The @CkInhibitManager object
+ *
+ * Return value: TRUE is blocked.
+ **/
+gboolean
+ck_inhibit_manager_is_suspend_key_blocked (CkInhibitManager *manager)
+{
+ return get_inhibit_status (manager, CK_INHIBIT_EVENT_SUSPEND_KEY, CK_INHIBIT_MODE_BLOCK);
}
/**
- * ck_inhibit_manager_is_hibernate_key_inhibited:
+ * ck_inhibit_manager_is_hibernate_key_delayed:
* @manager: The @CkInhibitManager object
*
- * Return value: TRUE is inhibited.
+ * Return value: TRUE is delayed.
**/
gboolean
-ck_inhibit_manager_is_hibernate_key_inhibited (CkInhibitManager *manager)
+ck_inhibit_manager_is_hibernate_key_delayed (CkInhibitManager *manager)
{
- g_return_val_if_fail (CK_IS_INHIBIT_MANAGER (manager), FALSE);
+ return get_inhibit_status (manager, CK_INHIBIT_EVENT_HIBERNATE_KEY, CK_INHIBIT_MODE_DELAY);
+}
+
+/**
+ * ck_inhibit_manager_is_hibernate_key_blocked:
+ * @manager: The @CkInhibitManager object
+ *
+ * Return value: TRUE is blocked.
+ **/
+gboolean
+ck_inhibit_manager_is_hibernate_key_blocked (CkInhibitManager *manager)
+{
+ return get_inhibit_status (manager, CK_INHIBIT_EVENT_HIBERNATE_KEY, CK_INHIBIT_MODE_BLOCK);
+}
- return manager->priv->inhibitors[CK_INHIBIT_EVENT_HIBERNATE_KEY] > 0 ? TRUE : FALSE;
+/**
+ * ck_inhibit_manager_is_lid_switch_delayed:
+ * @manager: The @CkInhibitManager object
+ *
+ * Return value: TRUE is delayed.
+ **/
+gboolean
+ck_inhibit_manager_is_lid_switch_delayed (CkInhibitManager *manager)
+{
+ return get_inhibit_status (manager, CK_INHIBIT_EVENT_LID_SWITCH, CK_INHIBIT_MODE_DELAY);
+}
+
+/**
+ * ck_inhibit_manager_is_lid_switch_blocked:
+ * @manager: The @CkInhibitManager object
+ *
+ * Return value: TRUE is blocked.
+ **/
+gboolean
+ck_inhibit_manager_is_lid_switch_blocked (CkInhibitManager *manager)
+{
+ return get_inhibit_status (manager, CK_INHIBIT_EVENT_LID_SWITCH, CK_INHIBIT_MODE_BLOCK);
}