コード例 #1
0
static void
ide_run_manager_notify_busy (IdeRunManager *self)
{
  g_assert (IDE_IS_RUN_MANAGER (self));

  g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_BUSY]);
  g_action_group_action_enabled_changed (G_ACTION_GROUP (self), "run", self->busy == FALSE);
  g_action_group_action_enabled_changed (G_ACTION_GROUP (self), "run-with-handler", self->busy == FALSE);
  g_action_group_action_enabled_changed (G_ACTION_GROUP (self), "stop", self->busy == TRUE);
}
コード例 #2
0
ファイル: gdbusactiongroup.c プロジェクト: ImageMagick/glib
static void
g_dbus_action_group_changed (GDBusConnection *connection,
                             const gchar     *sender,
                             const gchar     *object_path,
                             const gchar     *interface_name,
                             const gchar     *signal_name,
                             GVariant        *parameters,
                             gpointer         user_data)
{
  GDBusActionGroup *group = user_data;
  GActionGroup *g_group = user_data;

  /* make sure that we've been fully initialised */
  if (group->actions == NULL)
    return;

  if (g_str_equal (signal_name, "Changed") &&
      g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(asa{sb}a{sv}a{s(bgav)})")))
    {
      /* Removes */
      {
        GVariantIter *iter;
        const gchar *name;

        g_variant_get_child (parameters, 0, "as", &iter);
        while (g_variant_iter_next (iter, "&s", &name))
          {
            if (g_hash_table_lookup (group->actions, name))
              {
                g_hash_table_remove (group->actions, name);
                g_action_group_action_removed (g_group, name);
              }
          }
        g_variant_iter_free (iter);
      }

      /* Enable changes */
      {
        GVariantIter *iter;
        const gchar *name;
        gboolean enabled;

        g_variant_get_child (parameters, 1, "a{sb}", &iter);
        while (g_variant_iter_next (iter, "{&sb}", &name, &enabled))
          {
            ActionInfo *info;

            info = g_hash_table_lookup (group->actions, name);

            if (info && info->enabled != enabled)
              {
                info->enabled = enabled;
                g_action_group_action_enabled_changed (g_group, name, enabled);
              }
          }
        g_variant_iter_free (iter);
      }

      /* State changes */
      {
        GVariantIter *iter;
        const gchar *name;
        GVariant *state;

        g_variant_get_child (parameters, 2, "a{sv}", &iter);
        while (g_variant_iter_next (iter, "{&sv}", &name, &state))
          {
            ActionInfo *info;

            info = g_hash_table_lookup (group->actions, name);

            if (info && info->state && !g_variant_equal (state, info->state) &&
                g_variant_is_of_type (state, g_variant_get_type (info->state)))
              {
                g_variant_unref (info->state);
                info->state = g_variant_ref (state);

                g_action_group_action_state_changed (g_group, name, state);
              }

            g_variant_unref (state);
          }
        g_variant_iter_free (iter);
      }

      /* Additions */
      {
        GVariantIter *iter;
        ActionInfo *info;

        g_variant_get_child (parameters, 3, "a{s(bgav)}", &iter);
        while ((info = action_info_new_from_iter (iter)))
          {
            if (!g_hash_table_lookup (group->actions, info->name))
              {
                g_hash_table_insert (group->actions, info->name, info);

                if (group->strict)
                  g_action_group_action_added (g_group, info->name);
              }
            else
              action_info_free (info);
          }
        g_variant_iter_free (iter);
      }
    }
}