Blame plugins/gtk+/glade-accels.c

Packit 1e8aac
/*
Packit 1e8aac
 * Copyright (C) 2008 Tristan Van Berkom
Packit 1e8aac
 *
Packit 1e8aac
 * This program is free software; you can redistribute it and/or modify
Packit 1e8aac
 * it under the terms of the GNU General Public License as
Packit 1e8aac
 * published by the Free Software Foundation; either version 2 of the
Packit 1e8aac
 * License, or (at your option) any later version.
Packit 1e8aac
 *
Packit 1e8aac
 * This program is distributed in the hope that it will be useful,
Packit 1e8aac
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1e8aac
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 1e8aac
 * GNU General Public License for more details.
Packit 1e8aac
 *
Packit 1e8aac
 * You should have received a copy of the GNU General Public License
Packit 1e8aac
 * along with this program; if not, write to the Free Software
Packit 1e8aac
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 1e8aac
 *
Packit 1e8aac
 * Authors:
Packit 1e8aac
 *   Tristan Van Berkom <tvb@gnome.org>
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
#include <config.h>
Packit 1e8aac
Packit 1e8aac
#include <gladeui/glade.h>
Packit 1e8aac
#include <gtk/gtk.h>
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
#include <string.h>
Packit 1e8aac
Packit 1e8aac
#include "glade-accels.h"
Packit 1e8aac
Packit 1e8aac
#define GLADE_RESPONSE_CLEAR 42
Packit 1e8aac
Packit 1e8aac
GList *
Packit 1e8aac
glade_accel_list_copy (GList * accels)
Packit 1e8aac
{
Packit 1e8aac
  GList *ret = NULL, *list;
Packit 1e8aac
  GladeAccelInfo *info, *dup_info;
Packit 1e8aac
Packit 1e8aac
  for (list = accels; list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      info = list->data;
Packit 1e8aac
Packit 1e8aac
      dup_info = g_new0 (GladeAccelInfo, 1);
Packit 1e8aac
      dup_info->signal = g_strdup (info->signal);
Packit 1e8aac
      dup_info->key = info->key;
Packit 1e8aac
      dup_info->modifiers = info->modifiers;
Packit 1e8aac
Packit 1e8aac
      ret = g_list_prepend (ret, dup_info);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return g_list_reverse (ret);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_accel_list_free (GList * accels)
Packit 1e8aac
{
Packit 1e8aac
  GList *list;
Packit 1e8aac
  GladeAccelInfo *info;
Packit 1e8aac
Packit 1e8aac
  for (list = accels; list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      info = list->data;
Packit 1e8aac
Packit 1e8aac
      g_free (info->signal);
Packit 1e8aac
      g_free (info);
Packit 1e8aac
    }
Packit 1e8aac
  g_list_free (accels);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GType
Packit 1e8aac
glade_accel_glist_get_type (void)
Packit 1e8aac
{
Packit 1e8aac
  static GType type_id = 0;
Packit 1e8aac
Packit 1e8aac
  if (!type_id)
Packit 1e8aac
    type_id = g_boxed_type_register_static
Packit 1e8aac
        ("GladeAccelGList",
Packit 1e8aac
         (GBoxedCopyFunc) glade_accel_list_copy,
Packit 1e8aac
         (GBoxedFreeFunc) glade_accel_list_free);
Packit 1e8aac
  return type_id;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/* This is not used to save in the glade file... and its a one-way conversion.
Packit 1e8aac
 * its only usefull to show the values in the UI.
Packit 1e8aac
 */
Packit 1e8aac
gchar *
Packit 1e8aac
glade_accels_make_string (GList * accels)
Packit 1e8aac
{
Packit 1e8aac
  GladeAccelInfo *info;
Packit 1e8aac
  GString *string;
Packit 1e8aac
  GList *list;
Packit 1e8aac
  gchar *accel_text;
Packit 1e8aac
Packit 1e8aac
  string = g_string_new ("");
Packit 1e8aac
Packit 1e8aac
  for (list = accels; list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      info = list->data;
Packit 1e8aac
Packit 1e8aac
      accel_text = gtk_accelerator_name (info->key, info->modifiers);
Packit 1e8aac
      g_string_append (string, accel_text);
Packit 1e8aac
      g_free (accel_text);
Packit 1e8aac
Packit 1e8aac
      if (list->next)
Packit 1e8aac
        g_string_append (string, ", ");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return g_string_free (string, FALSE);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
/**************************************************************
Packit 1e8aac
 *              GladeEditorProperty stuff here
Packit 1e8aac
 **************************************************************/
Packit 1e8aac
Packit 1e8aac
enum
Packit 1e8aac
{
Packit 1e8aac
  ACCEL_COLUMN_SIGNAL = 0,
Packit 1e8aac
  ACCEL_COLUMN_REAL_SIGNAL,
Packit 1e8aac
  ACCEL_COLUMN_TEXT,
Packit 1e8aac
  ACCEL_COLUMN_WEIGHT,
Packit 1e8aac
  ACCEL_COLUMN_STYLE,
Packit 1e8aac
  ACCEL_COLUMN_FOREGROUND,
Packit 1e8aac
  ACCEL_COLUMN_VISIBLE,
Packit 1e8aac
  ACCEL_COLUMN_KEY_ENTERED,
Packit 1e8aac
  ACCEL_COLUMN_KEYCODE,
Packit 1e8aac
  ACCEL_COLUMN_MODIFIERS,
Packit 1e8aac
  ACCEL_NUM_COLUMNS
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
typedef struct
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorProperty parent_instance;
Packit 1e8aac
Packit 1e8aac
  GtkWidget *entry;
Packit 1e8aac
  GList *parent_iters;
Packit 1e8aac
  GtkTreeModel *model;
Packit 1e8aac
} GladeEPropAccel;
Packit 1e8aac
Packit 1e8aac
typedef struct
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeIter *iter;
Packit 1e8aac
  const gchar *name;                  /* <-- dont free */
Packit 1e8aac
} GladeEpropIterTab;
Packit 1e8aac
Packit 1e8aac
GLADE_MAKE_EPROP (GladeEPropAccel, glade_eprop_accel)
Packit 1e8aac
#define GLADE_EPROP_ACCEL(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_ACCEL, GladeEPropAccel))
Packit 1e8aac
#define GLADE_EPROP_ACCEL_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_ACCEL, GladeEPropAccelClass))
Packit 1e8aac
#define GLADE_IS_EPROP_ACCEL(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_ACCEL))
Packit 1e8aac
#define GLADE_IS_EPROP_ACCEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EPROP_ACCEL))
Packit 1e8aac
#define GLADE_EPROP_ACCEL_GET_CLASS(o)    (G_TYPE_INSTANCE_GET_CLASS ((o), GLADE_EPROP_ACCEL, GladeEPropAccelClass))
Packit 1e8aac
     static void glade_eprop_accel_finalize (GObject * object)
Packit 1e8aac
{
Packit 1e8aac
  /* Chain up */
Packit 1e8aac
  GObjectClass *parent_class =
Packit 1e8aac
      g_type_class_peek_parent (G_OBJECT_GET_CLASS (object));
Packit 1e8aac
Packit 1e8aac
  G_OBJECT_CLASS (parent_class)->finalize (object);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_eprop_accel_load (GladeEditorProperty * eprop, GladeProperty * property)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorPropertyClass *parent_class =
Packit 1e8aac
      g_type_class_peek_parent (GLADE_EDITOR_PROPERTY_GET_CLASS (eprop));
Packit 1e8aac
  GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
Packit 1e8aac
  gchar *accels;
Packit 1e8aac
Packit 1e8aac
  /* Chain up first */
Packit 1e8aac
  parent_class->load (eprop, property);
Packit 1e8aac
Packit 1e8aac
  if (property == NULL)
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  if ((accels =
Packit 1e8aac
       glade_accels_make_string (g_value_get_boxed (glade_property_inline_value (property)))) != NULL)
Packit 1e8aac
    {
Packit 1e8aac
      gtk_entry_set_text (GTK_ENTRY (eprop_accel->entry), accels);
Packit 1e8aac
      g_free (accels);
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    gtk_entry_set_text (GTK_ENTRY (eprop_accel->entry), "");
Packit 1e8aac
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gint
Packit 1e8aac
eprop_find_iter (GladeEpropIterTab * iter_tab, gchar * name)
Packit 1e8aac
{
Packit 1e8aac
  return strcmp (iter_tab->name, name);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
iter_tab_free (GladeEpropIterTab * iter_tab)
Packit 1e8aac
{
Packit 1e8aac
  gtk_tree_iter_free (iter_tab->iter);
Packit 1e8aac
  g_free (iter_tab);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_eprop_accel_populate_view (GladeEditorProperty * eprop,
Packit 1e8aac
                                 GtkTreeView * view)
Packit 1e8aac
{
Packit 1e8aac
  GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
Packit 1e8aac
  GladeSignalClass *sclass;
Packit 1e8aac
  GladePropertyClass *pclass = glade_editor_property_get_pclass (eprop);
Packit 1e8aac
  GladeProperty      *property = glade_editor_property_get_property (eprop);
Packit 1e8aac
  GladeWidgetAdaptor *adaptor = glade_property_class_get_adaptor (pclass);
Packit 1e8aac
  GtkTreeStore *model = (GtkTreeStore *) gtk_tree_view_get_model (view);
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  GladeEpropIterTab *parent_tab;
Packit 1e8aac
  GladeAccelInfo *info;
Packit 1e8aac
  GList *l, *found, *accelerators;
Packit 1e8aac
  gchar *name, *accel_text;
Packit 1e8aac
  const GList *list;
Packit 1e8aac
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
Packit 1e8aac
  GType type_action = GTK_TYPE_ACTION;
Packit 1e8aac
G_GNUC_END_IGNORE_DEPRECATIONS
Packit 1e8aac
Packit 1e8aac
  accelerators = g_value_get_boxed (glade_property_inline_value (property));
Packit 1e8aac
Packit 1e8aac
  /* First make parent iters...
Packit 1e8aac
   */
Packit 1e8aac
  for (list = glade_widget_adaptor_get_signals (adaptor); list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      sclass = list->data;
Packit 1e8aac
Packit 1e8aac
      /* Special case for GtkAction accelerators  */
Packit 1e8aac
      if (glade_widget_adaptor_get_object_type (adaptor) == type_action ||
Packit 1e8aac
          g_type_is_a (glade_widget_adaptor_get_object_type (adaptor), type_action))
Packit 1e8aac
        {
Packit 1e8aac
          if (g_strcmp0 (glade_signal_class_get_type (sclass), "GtkAction") != 0 ||
Packit 1e8aac
              g_strcmp0 (glade_signal_class_get_name (sclass), "activate") != 0)
Packit 1e8aac
            continue;
Packit 1e8aac
        }
Packit 1e8aac
      /* Only action signals have accelerators. */
Packit 1e8aac
      else if ((glade_signal_class_get_flags (sclass) & G_SIGNAL_ACTION) == 0)
Packit 1e8aac
        continue;
Packit 1e8aac
Packit 1e8aac
      if (g_list_find_custom (eprop_accel->parent_iters,
Packit 1e8aac
                              glade_signal_class_get_type (sclass),
Packit 1e8aac
                              (GCompareFunc) eprop_find_iter) == NULL)
Packit 1e8aac
        {
Packit 1e8aac
          gtk_tree_store_append (model, &iter, NULL);
Packit 1e8aac
          gtk_tree_store_set (model, &iter,
Packit 1e8aac
                              ACCEL_COLUMN_SIGNAL, glade_signal_class_get_type (sclass),
Packit 1e8aac
                              ACCEL_COLUMN_WEIGHT, PANGO_WEIGHT_BOLD,
Packit 1e8aac
                              ACCEL_COLUMN_VISIBLE, FALSE, -1);
Packit 1e8aac
Packit 1e8aac
          parent_tab = g_new0 (GladeEpropIterTab, 1);
Packit 1e8aac
          parent_tab->name = glade_signal_class_get_type (sclass);
Packit 1e8aac
          parent_tab->iter = gtk_tree_iter_copy (&iter);
Packit 1e8aac
Packit 1e8aac
          eprop_accel->parent_iters =
Packit 1e8aac
              g_list_prepend (eprop_accel->parent_iters, parent_tab);
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  /* Now we populate...
Packit 1e8aac
   */
Packit 1e8aac
  for (list = glade_widget_adaptor_get_signals (adaptor); list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      sclass = list->data;
Packit 1e8aac
Packit 1e8aac
      /* Special case for GtkAction accelerators  */
Packit 1e8aac
      if (glade_widget_adaptor_get_object_type (adaptor) == type_action ||
Packit 1e8aac
          g_type_is_a (glade_widget_adaptor_get_object_type (adaptor), type_action))
Packit 1e8aac
        {
Packit 1e8aac
          if (g_strcmp0 (glade_signal_class_get_type (sclass), "GtkAction") != 0 ||
Packit 1e8aac
              g_strcmp0 (glade_signal_class_get_name (sclass), "activate") != 0)
Packit 1e8aac
            continue;
Packit 1e8aac
        }
Packit 1e8aac
      /* Only action signals have accelerators. */
Packit 1e8aac
      else if ((glade_signal_class_get_flags (sclass) & G_SIGNAL_ACTION) == 0)
Packit 1e8aac
        continue;
Packit 1e8aac
Packit 1e8aac
      if ((found = g_list_find_custom (eprop_accel->parent_iters,
Packit 1e8aac
                                       glade_signal_class_get_type (sclass),
Packit 1e8aac
                                       (GCompareFunc) eprop_find_iter)) != NULL)
Packit 1e8aac
        {
Packit 1e8aac
          parent_tab = found->data;
Packit 1e8aac
          name = g_strdup_printf ("    %s", glade_signal_class_get_name (sclass));
Packit 1e8aac
Packit 1e8aac
          /* Populate from accelerator list
Packit 1e8aac
           */
Packit 1e8aac
          for (l = accelerators; l; l = l->next)
Packit 1e8aac
            {
Packit 1e8aac
              info = l->data;
Packit 1e8aac
Packit 1e8aac
              if (g_strcmp0 (info->signal, glade_signal_class_get_name (sclass)))
Packit 1e8aac
                continue;
Packit 1e8aac
Packit 1e8aac
              accel_text = gtk_accelerator_name (info->key, info->modifiers);
Packit 1e8aac
Packit 1e8aac
              gtk_tree_store_append (model, &iter, parent_tab->iter);
Packit 1e8aac
              gtk_tree_store_set
Packit 1e8aac
                  (model, &iter,
Packit 1e8aac
                   ACCEL_COLUMN_SIGNAL, name,
Packit 1e8aac
                   ACCEL_COLUMN_REAL_SIGNAL, glade_signal_class_get_name (sclass),
Packit 1e8aac
                   ACCEL_COLUMN_TEXT, accel_text,
Packit 1e8aac
                   ACCEL_COLUMN_WEIGHT, PANGO_WEIGHT_NORMAL,
Packit 1e8aac
                   ACCEL_COLUMN_STYLE, PANGO_STYLE_NORMAL,
Packit 1e8aac
                   ACCEL_COLUMN_FOREGROUND, "Black",
Packit 1e8aac
                   ACCEL_COLUMN_VISIBLE, TRUE,
Packit 1e8aac
                   ACCEL_COLUMN_KEYCODE, info->key,
Packit 1e8aac
                   ACCEL_COLUMN_MODIFIERS, info->modifiers,
Packit 1e8aac
                   ACCEL_COLUMN_KEY_ENTERED, TRUE, -1);
Packit 1e8aac
Packit 1e8aac
              g_free (accel_text);
Packit 1e8aac
            }
Packit 1e8aac
Packit 1e8aac
          /* Special case for GtkAction accelerators  */
Packit 1e8aac
          if ((glade_widget_adaptor_get_object_type (adaptor) == type_action ||
Packit 1e8aac
               g_type_is_a (glade_widget_adaptor_get_object_type (adaptor), type_action)) &&
Packit 1e8aac
              g_list_length (accelerators) > 0)
Packit 1e8aac
            continue;
Packit 1e8aac
Packit 1e8aac
          /* Append a new empty slot at the end */
Packit 1e8aac
          gtk_tree_store_append (model, &iter, parent_tab->iter);
Packit 1e8aac
          gtk_tree_store_set
Packit 1e8aac
              (model, &iter,
Packit 1e8aac
               ACCEL_COLUMN_SIGNAL, name,
Packit 1e8aac
               ACCEL_COLUMN_REAL_SIGNAL, glade_signal_class_get_name (sclass),
Packit 1e8aac
               ACCEL_COLUMN_TEXT, _("<choose a key>"),
Packit 1e8aac
               ACCEL_COLUMN_WEIGHT, PANGO_WEIGHT_NORMAL,
Packit 1e8aac
               ACCEL_COLUMN_STYLE, PANGO_STYLE_ITALIC,
Packit 1e8aac
               ACCEL_COLUMN_FOREGROUND, "Grey",
Packit 1e8aac
               ACCEL_COLUMN_VISIBLE, TRUE,
Packit 1e8aac
               ACCEL_COLUMN_KEYCODE, 0,
Packit 1e8aac
               ACCEL_COLUMN_MODIFIERS, 0, ACCEL_COLUMN_KEY_ENTERED, FALSE, -1);
Packit 1e8aac
Packit 1e8aac
          g_free (name);
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
accel_edited (GtkCellRendererAccel * accel,
Packit 1e8aac
              gchar * path_string,
Packit 1e8aac
              guint accel_key,
Packit 1e8aac
              GdkModifierType accel_mods,
Packit 1e8aac
              guint hardware_keycode, GladeEPropAccel * eprop_accel)
Packit 1e8aac
{
Packit 1e8aac
  gboolean key_was_set;
Packit 1e8aac
  GtkTreeIter iter, parent_iter, new_iter;
Packit 1e8aac
  gchar *accel_text;
Packit 1e8aac
  GladePropertyClass *pclass;
Packit 1e8aac
  GladeWidgetAdaptor *adaptor;
Packit 1e8aac
  gboolean is_action;
Packit 1e8aac
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
Packit 1e8aac
  GType type_action = GTK_TYPE_ACTION;
Packit 1e8aac
G_GNUC_END_IGNORE_DEPRECATIONS
Packit 1e8aac
Packit 1e8aac
  pclass = glade_editor_property_get_pclass (GLADE_EDITOR_PROPERTY (eprop_accel));
Packit 1e8aac
  adaptor = glade_property_class_get_adaptor (pclass);
Packit 1e8aac
Packit 1e8aac
  if (!gtk_tree_model_get_iter_from_string (eprop_accel->model,
Packit 1e8aac
                                            &iter, path_string))
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  is_action = (glade_widget_adaptor_get_object_type (adaptor) == type_action ||
Packit 1e8aac
               g_type_is_a (glade_widget_adaptor_get_object_type (adaptor), type_action));
Packit 1e8aac
Packit 1e8aac
  gtk_tree_model_get (eprop_accel->model, &iter,
Packit 1e8aac
                      ACCEL_COLUMN_KEY_ENTERED, &key_was_set, -1);
Packit 1e8aac
Packit 1e8aac
  accel_text = gtk_accelerator_name (accel_key, accel_mods);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_store_set
Packit 1e8aac
      (GTK_TREE_STORE (eprop_accel->model), &iter,
Packit 1e8aac
       ACCEL_COLUMN_KEY_ENTERED, TRUE,
Packit 1e8aac
       ACCEL_COLUMN_STYLE, PANGO_STYLE_NORMAL,
Packit 1e8aac
       ACCEL_COLUMN_FOREGROUND, "Black",
Packit 1e8aac
       ACCEL_COLUMN_TEXT, accel_text,
Packit 1e8aac
       ACCEL_COLUMN_KEYCODE, accel_key, ACCEL_COLUMN_MODIFIERS, accel_mods, -1);
Packit 1e8aac
Packit 1e8aac
  g_free (accel_text);
Packit 1e8aac
Packit 1e8aac
  /* Append a new one if needed
Packit 1e8aac
   */
Packit 1e8aac
  if (is_action == FALSE && key_was_set == FALSE &&
Packit 1e8aac
      gtk_tree_model_iter_parent (eprop_accel->model, &parent_iter, &iter))
Packit 1e8aac
    {
Packit 1e8aac
      gchar *signal, *real_signal;
Packit 1e8aac
Packit 1e8aac
      gtk_tree_model_get (eprop_accel->model, &iter,
Packit 1e8aac
                          ACCEL_COLUMN_SIGNAL, &signal,
Packit 1e8aac
                          ACCEL_COLUMN_REAL_SIGNAL, &real_signal, -1);
Packit 1e8aac
Packit 1e8aac
      /* Append a new empty slot at the end */
Packit 1e8aac
      gtk_tree_store_insert_after (GTK_TREE_STORE (eprop_accel->model),
Packit 1e8aac
                                   &new_iter, &parent_iter, &iter);
Packit 1e8aac
      gtk_tree_store_set (GTK_TREE_STORE (eprop_accel->model), &new_iter,
Packit 1e8aac
                          ACCEL_COLUMN_SIGNAL, signal,
Packit 1e8aac
                          ACCEL_COLUMN_REAL_SIGNAL, real_signal,
Packit 1e8aac
                          ACCEL_COLUMN_TEXT, _("<choose a key>"),
Packit 1e8aac
                          ACCEL_COLUMN_WEIGHT, PANGO_WEIGHT_NORMAL,
Packit 1e8aac
                          ACCEL_COLUMN_STYLE, PANGO_STYLE_ITALIC,
Packit 1e8aac
                          ACCEL_COLUMN_FOREGROUND, "Grey",
Packit 1e8aac
                          ACCEL_COLUMN_VISIBLE, TRUE,
Packit 1e8aac
                          ACCEL_COLUMN_KEYCODE, 0,
Packit 1e8aac
                          ACCEL_COLUMN_MODIFIERS, 0,
Packit 1e8aac
                          ACCEL_COLUMN_KEY_ENTERED, FALSE, -1);
Packit 1e8aac
      g_free (signal);
Packit 1e8aac
      g_free (real_signal);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
accel_cleared (GtkCellRendererAccel * accel,
Packit 1e8aac
               gchar * path_string, GladeEPropAccel * eprop_accel)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
Packit 1e8aac
  if (!gtk_tree_model_get_iter_from_string (eprop_accel->model,
Packit 1e8aac
                                            &iter, path_string))
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  gtk_tree_store_remove (GTK_TREE_STORE (eprop_accel->model), &iter);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static GtkWidget *
Packit 1e8aac
glade_eprop_accel_view (GladeEditorProperty * eprop)
Packit 1e8aac
{
Packit 1e8aac
  GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
Packit 1e8aac
  GtkWidget *view_widget;
Packit 1e8aac
  GtkCellRenderer *renderer;
Packit 1e8aac
  GtkTreeViewColumn *column;
Packit 1e8aac
Packit 1e8aac
  eprop_accel->model = (GtkTreeModel *) 
Packit 1e8aac
    gtk_tree_store_new (ACCEL_NUM_COLUMNS, G_TYPE_STRING,   /* The GSignal name formatted for display */
Packit 1e8aac
			G_TYPE_STRING,      /* The GSignal name */
Packit 1e8aac
			G_TYPE_STRING,      /* The text to show in the accelerator cell */
Packit 1e8aac
			G_TYPE_INT, /* PangoWeight attribute for bold headers */
Packit 1e8aac
			G_TYPE_INT, /* PangoStyle attribute for italic grey unset items */
Packit 1e8aac
			G_TYPE_STRING,      /* Foreground colour for italic grey unset items */
Packit 1e8aac
			G_TYPE_BOOLEAN,     /* Visible attribute to hide items for header entries */
Packit 1e8aac
			G_TYPE_BOOLEAN,     /* Whether the key has been entered for this row */
Packit 1e8aac
			G_TYPE_UINT,        /* Hardware keycode */
Packit 1e8aac
			G_TYPE_INT);        /* GdkModifierType */
Packit 1e8aac
  
Packit 1e8aac
  view_widget = gtk_tree_view_new_with_model (eprop_accel->model);
Packit 1e8aac
  gtk_tree_view_set_show_expanders (GTK_TREE_VIEW (view_widget), FALSE);
Packit 1e8aac
  gtk_tree_view_set_enable_search (GTK_TREE_VIEW (view_widget), FALSE);
Packit 1e8aac
Packit 1e8aac
  /********************* signal name column *********************/
Packit 1e8aac
  renderer = gtk_cell_renderer_text_new ();
Packit 1e8aac
  g_object_set (G_OBJECT (renderer), "editable", FALSE, NULL);
Packit 1e8aac
Packit 1e8aac
  column = gtk_tree_view_column_new_with_attributes
Packit 1e8aac
      (_("Signal"), renderer,
Packit 1e8aac
       "text", ACCEL_COLUMN_SIGNAL, "weight", ACCEL_COLUMN_WEIGHT, NULL);
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN (column), TRUE);
Packit 1e8aac
  gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
Packit 1e8aac
Packit 1e8aac
  /********************* accel editor column *********************/
Packit 1e8aac
  renderer = gtk_cell_renderer_accel_new ();
Packit 1e8aac
  g_object_set (G_OBJECT (renderer), "editable", TRUE, NULL);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (renderer, "accel-edited", G_CALLBACK (accel_edited), eprop);
Packit 1e8aac
  g_signal_connect (renderer, "accel-cleared",
Packit 1e8aac
                    G_CALLBACK (accel_cleared), eprop);
Packit 1e8aac
Packit 1e8aac
  column = gtk_tree_view_column_new_with_attributes
Packit 1e8aac
      (_("Accelerator Key"), renderer,
Packit 1e8aac
       "text", ACCEL_COLUMN_TEXT,
Packit 1e8aac
       "foreground", ACCEL_COLUMN_FOREGROUND,
Packit 1e8aac
       "style", ACCEL_COLUMN_STYLE, "visible", ACCEL_COLUMN_VISIBLE, NULL);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN (column), TRUE);
Packit 1e8aac
  gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
Packit 1e8aac
Packit 1e8aac
  return view_widget;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_eprop_accel_accum_accelerators (GtkTreeModel * model,
Packit 1e8aac
                                      GtkTreePath * path,
Packit 1e8aac
                                      GtkTreeIter * iter, GList ** ret)
Packit 1e8aac
{
Packit 1e8aac
  GladeAccelInfo *info;
Packit 1e8aac
  gchar *signal;
Packit 1e8aac
  GdkModifierType accel_mods;
Packit 1e8aac
  guint accel_key;
Packit 1e8aac
  gboolean entered = FALSE;
Packit 1e8aac
Packit 1e8aac
  gtk_tree_model_get (model, iter, ACCEL_COLUMN_KEY_ENTERED, &entered, -1);
Packit 1e8aac
  if (!entered)
Packit 1e8aac
    return FALSE;
Packit 1e8aac
Packit 1e8aac
  gtk_tree_model_get (model, iter,
Packit 1e8aac
                      ACCEL_COLUMN_REAL_SIGNAL, &signal,
Packit 1e8aac
                      ACCEL_COLUMN_KEYCODE, &accel_key,
Packit 1e8aac
                      ACCEL_COLUMN_MODIFIERS, &accel_mods, -1);
Packit 1e8aac
Packit 1e8aac
  info = g_new0 (GladeAccelInfo, 1);
Packit 1e8aac
  info->signal = signal;
Packit 1e8aac
  info->key = accel_key;
Packit 1e8aac
  info->modifiers = accel_mods;
Packit 1e8aac
Packit 1e8aac
  *ret = g_list_prepend (*ret, info);
Packit 1e8aac
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_eprop_accel_show_dialog (GladeEditorProperty *eprop)
Packit 1e8aac
{
Packit 1e8aac
  GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
Packit 1e8aac
  GtkWidget *dialog, *parent, *vbox, *sw, *tree_view;
Packit 1e8aac
  GValue value = { 0, };
Packit 1e8aac
  GList *accelerators = NULL;
Packit 1e8aac
  gint res;
Packit 1e8aac
Packit 1e8aac
  parent = gtk_widget_get_toplevel (GTK_WIDGET (eprop));
Packit 1e8aac
Packit 1e8aac
  dialog = gtk_dialog_new_with_buttons (_("Choose accelerator keys..."),
Packit 1e8aac
                                        GTK_WINDOW (parent),
Packit 1e8aac
                                        GTK_DIALOG_MODAL |
Packit 1e8aac
                                        GTK_DIALOG_DESTROY_WITH_PARENT,
Packit 1e8aac
                                        _("C_lear"), GLADE_RESPONSE_CLEAR,
Packit 1e8aac
                                        _("_Cancel"), GTK_RESPONSE_CANCEL,
Packit 1e8aac
                                        _("_OK"), GTK_RESPONSE_OK, NULL);
Packit 1e8aac
Packit 1e8aac
  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
Packit 1e8aac
  gtk_widget_show (vbox);
Packit 1e8aac
Packit 1e8aac
  gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
Packit 1e8aac
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX
Packit 1e8aac
                      (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), vbox,
Packit 1e8aac
                      TRUE, TRUE, 0);
Packit 1e8aac
Packit 1e8aac
  sw = gtk_scrolled_window_new (NULL, NULL);
Packit 1e8aac
  gtk_widget_show (sw);
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
Packit 1e8aac
  gtk_widget_set_size_request (sw, 400, 200);
Packit 1e8aac
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
Packit 1e8aac
                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
Packit 1e8aac
  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
Packit 1e8aac
Packit 1e8aac
  tree_view = glade_eprop_accel_view (eprop);
Packit 1e8aac
  glade_eprop_accel_populate_view (eprop, GTK_TREE_VIEW (tree_view));
Packit 1e8aac
Packit 1e8aac
  gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
Packit 1e8aac
Packit 1e8aac
  gtk_widget_show (tree_view);
Packit 1e8aac
  gtk_container_add (GTK_CONTAINER (sw), tree_view);
Packit 1e8aac
Packit 1e8aac
  /* Run the dialog */
Packit 1e8aac
  res = gtk_dialog_run (GTK_DIALOG (dialog));
Packit 1e8aac
  if (res == GTK_RESPONSE_OK)
Packit 1e8aac
    {
Packit 1e8aac
      gtk_tree_model_foreach
Packit 1e8aac
          (gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view)),
Packit 1e8aac
           (GtkTreeModelForeachFunc)
Packit 1e8aac
           glade_eprop_accel_accum_accelerators, &accelerators);
Packit 1e8aac
Packit 1e8aac
      accelerators = g_list_reverse (accelerators);
Packit 1e8aac
      g_value_init (&value, GLADE_TYPE_ACCEL_GLIST);
Packit 1e8aac
      g_value_take_boxed (&value, accelerators);
Packit 1e8aac
Packit 1e8aac
      glade_editor_property_commit (eprop, &value);
Packit 1e8aac
      g_value_unset (&value);
Packit 1e8aac
    }
Packit 1e8aac
  else if (res == GLADE_RESPONSE_CLEAR)
Packit 1e8aac
    {
Packit 1e8aac
      g_value_init (&value, GLADE_TYPE_ACCEL_GLIST);
Packit 1e8aac
      g_value_set_boxed (&value, NULL);
Packit 1e8aac
Packit 1e8aac
      glade_editor_property_commit (eprop, &value);
Packit 1e8aac
Packit 1e8aac
      g_value_unset (&value);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  /* Clean up ...
Packit 1e8aac
   */
Packit 1e8aac
  gtk_widget_destroy (dialog);
Packit 1e8aac
Packit 1e8aac
  g_object_unref (G_OBJECT (eprop_accel->model));
Packit 1e8aac
  eprop_accel->model = NULL;
Packit 1e8aac
Packit 1e8aac
  if (eprop_accel->parent_iters)
Packit 1e8aac
    {
Packit 1e8aac
      g_list_foreach (eprop_accel->parent_iters, (GFunc) iter_tab_free, NULL);
Packit 1e8aac
      g_list_free (eprop_accel->parent_iters);
Packit 1e8aac
      eprop_accel->parent_iters = NULL;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GtkWidget *
Packit 1e8aac
glade_eprop_accel_create_input (GladeEditorProperty * eprop)
Packit 1e8aac
{
Packit 1e8aac
  GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
Packit 1e8aac
Packit 1e8aac
  eprop_accel->entry = gtk_entry_new ();
Packit 1e8aac
  gtk_widget_set_valign (eprop_accel->entry, GTK_ALIGN_CENTER);
Packit 1e8aac
  gtk_editable_set_editable (GTK_EDITABLE (eprop_accel->entry), FALSE);
Packit 1e8aac
  gtk_entry_set_icon_from_icon_name (GTK_ENTRY (eprop_accel->entry),
Packit 1e8aac
                                     GTK_ENTRY_ICON_SECONDARY,
Packit 1e8aac
                                     "gtk-edit");
Packit 1e8aac
  g_signal_connect_swapped (eprop_accel->entry, "icon-release",
Packit 1e8aac
                            G_CALLBACK (glade_eprop_accel_show_dialog), eprop);
Packit 1e8aac
Packit 1e8aac
  return eprop_accel->entry;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static GdkModifierType
Packit 1e8aac
glade_gtk_parse_modifiers (const gchar * string)
Packit 1e8aac
{
Packit 1e8aac
  const gchar *pos = string;
Packit 1e8aac
  GdkModifierType modifiers = 0;
Packit 1e8aac
Packit 1e8aac
  while (pos && pos[0])
Packit 1e8aac
    {
Packit 1e8aac
      if (!strncmp (pos, "GDK_", 4))
Packit 1e8aac
        {
Packit 1e8aac
          pos += 4;
Packit 1e8aac
          if (!strncmp (pos, "SHIFT_MASK", 10))
Packit 1e8aac
            {
Packit 1e8aac
              modifiers |= GDK_SHIFT_MASK;
Packit 1e8aac
              pos += 10;
Packit 1e8aac
            }
Packit 1e8aac
          else if (!strncmp (pos, "SUPER_MASK", 10))
Packit 1e8aac
            {
Packit 1e8aac
              modifiers |= GDK_SUPER_MASK;
Packit 1e8aac
              pos += 10;
Packit 1e8aac
            }            
Packit 1e8aac
          else if (!strncmp (pos, "LOCK_MASK", 9))
Packit 1e8aac
            {
Packit 1e8aac
              modifiers |= GDK_LOCK_MASK;
Packit 1e8aac
              pos += 9;
Packit 1e8aac
            }
Packit 1e8aac
          else if (!strncmp (pos, "CONTROL_MASK", 12))
Packit 1e8aac
            {
Packit 1e8aac
              modifiers |= GDK_CONTROL_MASK;
Packit 1e8aac
              pos += 12;
Packit 1e8aac
            }
Packit 1e8aac
          else if (!strncmp (pos, "MOD", 3) && !strncmp (pos + 4, "_MASK", 5))
Packit 1e8aac
            {
Packit 1e8aac
              switch (pos[3])
Packit 1e8aac
                {
Packit 1e8aac
                  case '1':
Packit 1e8aac
                    modifiers |= GDK_MOD1_MASK;
Packit 1e8aac
                    break;
Packit 1e8aac
                  case '2':
Packit 1e8aac
                    modifiers |= GDK_MOD2_MASK;
Packit 1e8aac
                    break;
Packit 1e8aac
                  case '3':
Packit 1e8aac
                    modifiers |= GDK_MOD3_MASK;
Packit 1e8aac
                    break;
Packit 1e8aac
                  case '4':
Packit 1e8aac
                    modifiers |= GDK_MOD4_MASK;
Packit 1e8aac
                    break;
Packit 1e8aac
                  case '5':
Packit 1e8aac
                    modifiers |= GDK_MOD5_MASK;
Packit 1e8aac
                    break;
Packit 1e8aac
                }
Packit 1e8aac
              pos += 9;
Packit 1e8aac
            }
Packit 1e8aac
          else if (!strncmp (pos, "BUTTON", 6) &&
Packit 1e8aac
                   !strncmp (pos + 7, "_MASK", 5))
Packit 1e8aac
            {
Packit 1e8aac
              switch (pos[6])
Packit 1e8aac
                {
Packit 1e8aac
                  case '1':
Packit 1e8aac
                    modifiers |= GDK_BUTTON1_MASK;
Packit 1e8aac
                    break;
Packit 1e8aac
                  case '2':
Packit 1e8aac
                    modifiers |= GDK_BUTTON2_MASK;
Packit 1e8aac
                    break;
Packit 1e8aac
                  case '3':
Packit 1e8aac
                    modifiers |= GDK_BUTTON3_MASK;
Packit 1e8aac
                    break;
Packit 1e8aac
                  case '4':
Packit 1e8aac
                    modifiers |= GDK_BUTTON4_MASK;
Packit 1e8aac
                    break;
Packit 1e8aac
                  case '5':
Packit 1e8aac
                    modifiers |= GDK_BUTTON5_MASK;
Packit 1e8aac
                    break;
Packit 1e8aac
                }
Packit 1e8aac
              pos += 12;
Packit 1e8aac
            }
Packit 1e8aac
          else if (!strncmp (pos, "RELEASE_MASK", 12))
Packit 1e8aac
            {
Packit 1e8aac
              modifiers |= GDK_RELEASE_MASK;
Packit 1e8aac
              pos += 12;
Packit 1e8aac
            }
Packit 1e8aac
          else
Packit 1e8aac
            pos++;
Packit 1e8aac
        }
Packit 1e8aac
      else
Packit 1e8aac
        pos++;
Packit 1e8aac
    }
Packit 1e8aac
  return modifiers;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static gchar *
Packit 1e8aac
glade_gtk_modifier_string_from_bits (GdkModifierType modifiers)
Packit 1e8aac
{
Packit 1e8aac
  GString *string = g_string_new ("");
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_SHIFT_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_SHIFT_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_SUPER_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_SUPER_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_LOCK_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_LOCK_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_CONTROL_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_CONTROL_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_MOD1_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_MOD1_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_MOD2_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_MOD2_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_MOD3_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_MOD3_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_MOD4_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_MOD4_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_MOD5_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_MOD5_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_BUTTON1_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_BUTTON1_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_BUTTON2_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_BUTTON2_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_BUTTON3_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_BUTTON3_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_BUTTON4_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_BUTTON4_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_BUTTON5_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_BUTTON5_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (modifiers & GDK_RELEASE_MASK)
Packit 1e8aac
    {
Packit 1e8aac
      if (string->len > 0)
Packit 1e8aac
        g_string_append (string, " | ");
Packit 1e8aac
      g_string_append (string, "GDK_RELEASE_MASK");
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (string->len > 0)
Packit 1e8aac
    return g_string_free (string, FALSE);
Packit 1e8aac
Packit 1e8aac
  g_string_free (string, TRUE);
Packit 1e8aac
  return NULL;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GladeAccelInfo *
Packit 1e8aac
glade_accel_read (GladeXmlNode * node, gboolean require_signal)
Packit 1e8aac
{
Packit 1e8aac
  GladeAccelInfo *ainfo;
Packit 1e8aac
  gchar *key, *modifiers, *signal;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (node != NULL, NULL);
Packit 1e8aac
Packit 1e8aac
  if (!glade_xml_node_verify (node, GLADE_TAG_ACCEL))
Packit 1e8aac
    return NULL;
Packit 1e8aac
Packit 1e8aac
  /* Get from xml... */
Packit 1e8aac
  key = glade_xml_get_property_string_required
Packit 1e8aac
      (node, GLADE_TAG_ACCEL_KEY, NULL);
Packit 1e8aac
  if (require_signal)
Packit 1e8aac
    signal =
Packit 1e8aac
        glade_xml_get_property_string_required (node, GLADE_TAG_ACCEL_SIGNAL,
Packit 1e8aac
                                                NULL);
Packit 1e8aac
  else
Packit 1e8aac
    signal = glade_xml_get_property_string (node, GLADE_TAG_ACCEL_SIGNAL);
Packit 1e8aac
Packit 1e8aac
  modifiers = glade_xml_get_property_string (node, GLADE_TAG_ACCEL_MODIFIERS);
Packit 1e8aac
Packit 1e8aac
  /* translate to GladeAccelInfo... */
Packit 1e8aac
  ainfo = g_new0 (GladeAccelInfo, 1);
Packit 1e8aac
  ainfo->key = gdk_keyval_from_name (key);
Packit 1e8aac
  ainfo->signal = signal;       /* take string ownership... */
Packit 1e8aac
  ainfo->modifiers = glade_gtk_parse_modifiers (modifiers);
Packit 1e8aac
Packit 1e8aac
  g_free (modifiers);
Packit 1e8aac
Packit 1e8aac
  return ainfo;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GladeXmlNode *
Packit 1e8aac
glade_accel_write (GladeAccelInfo * accel,
Packit 1e8aac
                   GladeXmlContext * context, gboolean write_signal)
Packit 1e8aac
{
Packit 1e8aac
  GladeXmlNode *accel_node;
Packit 1e8aac
  gchar *modifiers;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (accel != NULL, NULL);
Packit 1e8aac
  g_return_val_if_fail (context != NULL, NULL);
Packit 1e8aac
Packit 1e8aac
  accel_node = glade_xml_node_new (context, GLADE_TAG_ACCEL);
Packit 1e8aac
  modifiers = glade_gtk_modifier_string_from_bits (accel->modifiers);
Packit 1e8aac
Packit 1e8aac
  glade_xml_node_set_property_string (accel_node, GLADE_TAG_ACCEL_KEY,
Packit 1e8aac
                                      gdk_keyval_name (accel->key));
Packit 1e8aac
Packit 1e8aac
  if (write_signal)
Packit 1e8aac
    glade_xml_node_set_property_string (accel_node, GLADE_TAG_ACCEL_SIGNAL,
Packit 1e8aac
                                        accel->signal);
Packit 1e8aac
  glade_xml_node_set_property_string (accel_node, GLADE_TAG_ACCEL_MODIFIERS,
Packit 1e8aac
                                      modifiers);
Packit 1e8aac
Packit 1e8aac
  g_free (modifiers);
Packit 1e8aac
Packit 1e8aac
  return accel_node;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_read_accels (GladeWidget * widget,
Packit 1e8aac
                       GladeXmlNode * node, gboolean require_signal)
Packit 1e8aac
{
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
  GladeXmlNode *prop;
Packit 1e8aac
  GladeAccelInfo *ainfo;
Packit 1e8aac
  GValue *value = NULL;
Packit 1e8aac
  GList *accels = NULL;
Packit 1e8aac
Packit 1e8aac
  for (prop = glade_xml_node_get_children (node);
Packit 1e8aac
       prop; prop = glade_xml_node_next (prop))
Packit 1e8aac
    {
Packit 1e8aac
      if (!glade_xml_node_verify_silent (prop, GLADE_TAG_ACCEL))
Packit 1e8aac
        continue;
Packit 1e8aac
Packit 1e8aac
      if ((ainfo = glade_accel_read (prop, require_signal)) != NULL)
Packit 1e8aac
        accels = g_list_prepend (accels, ainfo);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (accels)
Packit 1e8aac
    {
Packit 1e8aac
      value = g_new0 (GValue, 1);
Packit 1e8aac
      g_value_init (value, GLADE_TYPE_ACCEL_GLIST);
Packit 1e8aac
      g_value_take_boxed (value, accels);
Packit 1e8aac
Packit 1e8aac
      property = glade_widget_get_property (widget, "accelerator");
Packit 1e8aac
      glade_property_set_value (property, value);
Packit 1e8aac
Packit 1e8aac
      g_value_unset (value);
Packit 1e8aac
      g_free (value);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_write_accels (GladeWidget * widget,
Packit 1e8aac
                        GladeXmlContext * context,
Packit 1e8aac
                        GladeXmlNode * node, gboolean write_signal)
Packit 1e8aac
{
Packit 1e8aac
  GladeXmlNode *accel_node;
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
  GList *list;
Packit 1e8aac
Packit 1e8aac
  /* Some child widgets may have disabled the property */
Packit 1e8aac
  if (!(property = glade_widget_get_property (widget, "accelerator")))
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  for (list = g_value_get_boxed (glade_property_inline_value (property)); list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      GladeAccelInfo *accel = list->data;
Packit 1e8aac
Packit 1e8aac
      accel_node = glade_accel_write (accel, context, write_signal);
Packit 1e8aac
      glade_xml_node_append_child (node, accel_node);
Packit 1e8aac
    }
Packit 1e8aac
}