On Wed, 2005-09-07 at 22:53 -0400, Tristan Van Berkom wrote:
[...]
> Come to think of it theres another complication; the project window
> menubar accelerators are not a part of the libgladeui.so library, so
> shortcuts need to be implemented seperately per application using the
> glade3 core library.
>
> So what we probably want is for anjuta/glade-project-window to decide what
> shortcuts do what in there respective apps and use the glade_shortcuts api
> to add shortcuts to the glade windows/runtime widgets.
Yes, this patch works fine.
But maybe it's better to add this api to glade-app.c and then add an
accel_group member to GladeAppPriv instead of using g_object_set_data()
in glade_shortcut_app_get_accel_group().
This way we just provide an automatic way to set a acceleration group
for every window created by glade widgets.
And glade_shortcut_change_entry() would be just a convenience function
since acceleration group management is now in charge of the main
application (anjuta/glade-project-window)
If you think the later approach is nicer, drop me a line. changes should
be trivial to do :D
well hope this helps
Juan Pablo
Index: src/Makefile.am
===================================================================
RCS file: /cvs/gnome/glade3/src/Makefile.am,v
retrieving revision 1.44
diff -u -r1.44 Makefile.am
--- src/Makefile.am 9 Aug 2005 14:29:06 -0000 1.44
+++ src/Makefile.am 8 Sep 2005 20:47:53 -0000
@@ -61,7 +61,8 @@
glade-parser.c \
glade-builtins.c \
glade-fixed-manager.c \
- glade-app.c
+ glade-app.c \
+ glade-shortcut.c
libgladeui_1_la_CFLAGS = -DINSIDE_LIBGLADEUI $(AM_CFLAGS)
libgladeui_1_la_LDFLAGS = -version-info $(GLADE_CURRENT):$(GLADE_REVISION):$(GLADE_AGE)
@@ -100,6 +101,7 @@
glade-app.h \
glade-builtins.h \
glade-fixed-manager.h \
+ glade-shortcut.h \
fixed_bg.xpm
pkgconfigdir = $(libdir)/pkgconfig
Index: src/glade-app.c
===================================================================
RCS file: /cvs/gnome/glade3/src/glade-app.c,v
retrieving revision 1.18
diff -u -r1.18 glade-app.c
--- src/glade-app.c 24 Aug 2005 20:31:29 -0000 1.18
+++ src/glade-app.c 8 Sep 2005 20:48:15 -0000
@@ -48,6 +48,7 @@
#include "glade-catalog.h"
#include "glade-app.h"
#include "glade-paths.h"
+#include "glade-shortcut.h"
#include <gdk/gdkkeysyms.h>
#include <gtk/gtkstock.h>
@@ -179,14 +180,23 @@
on_palette_button_clicked (GladePalette *palette, GladeApp *app)
{
GladeWidgetClass *class;
-
+ GladeWidget *widget;
+
g_return_if_fail (GLADE_IS_PALETTE (palette));
class = palette->current;
/* class may be NULL if the selector was pressed */
if (class && g_type_is_a (class->type, GTK_TYPE_WINDOW))
{
- glade_command_create (class, NULL, NULL, app->priv->active_project);
+ widget=glade_command_create (class, NULL, NULL, app->priv->active_project);
+
+ /* if this is a top level widget set the accel group */
+ if (GTK_IS_WINDOW(widget->object))
+ {
+ gtk_window_add_accel_group (GTK_WINDOW(widget->object),
+ glade_shortcut_app_get_accel_group (app));
+ }
+
glade_palette_unselect_widget (palette);
app->priv->add_class = NULL;
}
@@ -242,7 +252,7 @@
glade_app_config_save (GladeApp *app)
{
GIOChannel *fd;
- gchar *data, *filename;
+ gchar *data=NULL, *filename;
const gchar *config_dir = g_get_user_config_dir ();
GError *error = NULL;
gsize size;
@@ -266,12 +276,11 @@
fd = g_io_channel_new_file (filename, "w", &error);
- if (error == NULL)
+ if (error == NULL){
data = g_key_file_to_data (app->priv->config, &size, &error);
-
- if (error == NULL)
g_io_channel_write_chars (fd, data, size, NULL, &error);
-
+ }
+
/* Free resources */
if (error)
{
@@ -594,6 +603,9 @@
g_signal_connect (G_OBJECT (project), "selection_changed",
G_CALLBACK (on_project_selection_changed_cb), app);
+ /* add acceleration groups to top level widgets */
+ glade_shortcut_project_set_accel_group (project, glade_shortcut_app_get_accel_group (app));
+
glade_app_set_project (app, project);
/* make sure the palette is sensitive */
gtk_widget_set_sensitive (GTK_WIDGET (app->priv->palette), TRUE);
Index: src/glade-project-window.c
===================================================================
RCS file: /cvs/gnome/glade3/src/glade-project-window.c,v
retrieving revision 1.110
diff -u -r1.110 glade-project-window.c
--- src/glade-project-window.c 2 Sep 2005 02:54:48 -0000 1.110
+++ src/glade-project-window.c 8 Sep 2005 20:49:27 -0000
@@ -31,12 +31,16 @@
#include <gtk/gtkstock.h>
#include "glade.h"
-
#include "glade-project-window.h"
+#include "glade-shortcut.h"
#define CONFIG_RECENT_PROJECTS "Recent Projects"
#define CONFIG_RECENT_PROJECTS_MAX "max_recent_projects"
+#define GLADE_ACTION_GROUP_MENU "GladeMenu"
+#define GLADE_ACTION_GROUP_PROJECT "GladeProject"
+#define GLADE_ACTION_GROUP_RECENT "GladeRecent"
+
struct _GladeProjectWindowPriv {
/* Application widgets */
GtkWidget *window; /* Main window */
@@ -48,9 +52,9 @@
GtkUIManager *ui; /* The UIManager */
- GtkActionGroup *actions; /* All the static actions */
- GtkActionGroup *p_actions; /* Projects actions */
- GtkActionGroup *rp_actions; /* Recent projects actions */
+ GtkActionGroup *menu_actions; /* All the static actions */
+ GtkActionGroup *project_actions; /* Projects actions */
+ GtkActionGroup *recent_actions; /* Recent projects actions */
GQueue *recent_projects; /* A GtkAction queue */
gint rp_max; /* Maximun Recent Projects entries */
@@ -117,7 +121,7 @@
gtk_ui_manager_remove_ui(gpw->priv->ui,
glade_project_get_menuitem_merge_id(project));
- gtk_action_group_remove_action (gpw->priv->p_actions,
+ gtk_action_group_remove_action (gpw->priv->project_actions,
GTK_ACTION (project->action));
g_object_unref (G_OBJECT (project->action));
@@ -141,7 +145,7 @@
gtk_ui_manager_remove_ui(gpw->priv->ui, merge_id);
- gtk_action_group_remove_action (gpw->priv->rp_actions, action);
+ gtk_action_group_remove_action (gpw->priv->recent_actions, action);
g_queue_remove (gpw->priv->recent_projects, action);
@@ -187,7 +191,7 @@
/* Add action */
action = gtk_action_new (action_name, label, NULL, NULL);
- gtk_action_group_add_action_with_accel (gpw->priv->rp_actions, action, "");
+ gtk_action_group_add_action_with_accel (gpw->priv->recent_actions, action, "");
g_signal_connect (G_OBJECT (action), "activate", (GCallback)gpw_recent_project_open_cb, gpw);
/* Add menuitem */
@@ -1181,22 +1185,22 @@
{
GError *error = NULL;
- gpw->priv->actions = gtk_action_group_new ("actions");
- gtk_action_group_add_actions (gpw->priv->actions, entries, n_entries, gpw);
- gtk_action_group_add_toggle_actions (gpw->priv->actions, view_entries,
+ gpw->priv->menu_actions = gtk_action_group_new (GLADE_ACTION_GROUP_MENU);
+ gtk_action_group_add_actions (gpw->priv->menu_actions, entries, n_entries, gpw);
+ gtk_action_group_add_toggle_actions (gpw->priv->menu_actions, view_entries,
n_view_entries, gpw);
- gpw->priv->p_actions = gtk_action_group_new ("p_actions");
+ gpw->priv->project_actions = gtk_action_group_new (GLADE_ACTION_GROUP_PROJECT);
- gpw->priv->rp_actions = gtk_action_group_new ("rp_actions");
+ gpw->priv->recent_actions = gtk_action_group_new (GLADE_ACTION_GROUP_RECENT);
gpw->priv->ui = gtk_ui_manager_new ();
g_signal_connect(G_OBJECT(gpw->priv->ui), "connect-proxy",
(GCallback)gpw_ui_connect_proxy_cb, gpw);
- gtk_ui_manager_insert_action_group (gpw->priv->ui, gpw->priv->actions, 0);
- gtk_ui_manager_insert_action_group (gpw->priv->ui, gpw->priv->p_actions, 1);
- gtk_ui_manager_insert_action_group (gpw->priv->ui, gpw->priv->rp_actions, 2);
+ gtk_ui_manager_insert_action_group (gpw->priv->ui, gpw->priv->menu_actions, 0);
+ gtk_ui_manager_insert_action_group (gpw->priv->ui, gpw->priv->project_actions, 1);
+ gtk_ui_manager_insert_action_group (gpw->priv->ui, gpw->priv->recent_actions, 2);
gtk_window_add_accel_group (GTK_WINDOW (gpw->priv->window),
gtk_ui_manager_get_accel_group (gpw->priv->ui));
@@ -1361,7 +1365,7 @@
g_signal_connect (G_OBJECT (project->action), "activate",
(GCallback) glade_project_window_set_project, project);
- gtk_action_group_add_action_with_accel (gpw->priv->p_actions,
+ gtk_action_group_add_action_with_accel (gpw->priv->project_actions,
GTK_ACTION (project->action), "");
/* Add menuitem to menu */
@@ -1631,6 +1635,7 @@
glade_project_window_new (void)
{
GladeProjectWindow *gpw;
+ GtkAccelGroup *accel_group;
gpw = g_object_new (GLADE_TYPE_PROJECT_WINDOW, NULL);
@@ -1639,5 +1644,13 @@
gpw_create_editor (gpw);
glade_app_set_window (GLADE_APP (gpw), gpw->priv->window);
+
+ accel_group = gtk_ui_manager_get_accel_group(gpw->priv->ui);
+ glade_shortcut_app_set_accel_group (GLADE_APP (gpw), accel_group);
+
+ gtk_window_add_accel_group(gpw->priv->palette_window, accel_group);
+ gtk_window_add_accel_group(gpw->priv->editor_window, accel_group);
+ gtk_window_add_accel_group(GTK_WINDOW (glade_app_get_clipboard_view (GLADE_APP (gpw))), accel_group);
+
return gpw;
}
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
#ifndef __GLADE_SHORTCUT_H__
#define __GLADE_SHORTCUT_H__
G_BEGIN_DECLS
void glade_shortcut_app_set_accel_group (GladeApp *app, GtkAccelGroup *accel_group);
GtkAccelGroup *glade_shortcut_app_get_accel_group (GladeApp *app);
void glade_shortcut_project_set_accel_group (GladeProject *project, GtkAccelGroup *accel_group);
gboolean glade_shortcut_change_entry (const gchar *accel_path, const gchar *accelerator);
G_END_DECLS
#endif /* __GLADE_SHORTCUT_H__ */
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* glade-shortcut.c - Functions to manipulate shortcuts.
*
* Copyright (C) 2005 Juan Pablo Ugarte.
*
* Author(s):
* Juan Pablo Ugarte <[EMAIL PROTECTED]>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
#include "glade.h"
#include "glade-app.h"
#include "glade-project.h"
#define GLADE_SHORTCUT_ACCEL_GROUP_KEY "accel_group"
/*
* glade_shortcut_app_set_accel_group:
*
* Sets @accel_group to the @app's window.
*/
void
glade_shortcut_app_set_accel_group (GladeApp *app, GtkAccelGroup *accel_group)
{
GtkWidget *window;
g_return_if_fail(GLADE_IS_APP(app));
window = glade_app_get_window (app);
if (window && accel_group)
g_object_set_data (G_OBJECT(window),
GLADE_SHORTCUT_ACCEL_GROUP_KEY,
(gpointer) accel_group);
}
/*
* glade_shortcut_get_accel_group:
*
* Gets the acceleration group from the @app's window.
*/
GtkAccelGroup *
glade_shortcut_app_get_accel_group (GladeApp *app)
{
GtkWidget *window;
gpointer retval = NULL;
if (GLADE_IS_APP(app) == FALSE) return NULL;
window = glade_app_get_window (app);
if (window)
retval = g_object_get_data (G_OBJECT(window),
GLADE_SHORTCUT_ACCEL_GROUP_KEY);
return (GtkAccelGroup *) retval;
}
/*
* glade_shortcut_project_set_accel_group:
*
* Set @accel_group to every top level widget in @project.
*/
void
glade_shortcut_project_set_accel_group (GladeProject *project,
GtkAccelGroup *accel_group)
{
GList *objects;
g_return_if_fail (GLADE_IS_PROJECT (project));
/* maybe it is better to add a funcion in glade-project to access to objects */
objects = project->objects;
while (objects)
{
if(GTK_IS_WINDOW (objects->data))
gtk_window_add_accel_group (GTK_WINDOW (objects->data), accel_group);
objects = objects->next;
}
}
/**
* glade_shortcut_change_entry:
*
* @accel_path: The action name in the form of an acceleration path. ("<Actions>/group-name/action-name")
* @accelerator: The accelerator for the action. ("<Control>Q"), "" for none and NULL for default.
*
* Changes the @accel_path's accelerator to @accelerator.
*/
gboolean
glade_shortcut_change_entry (const gchar *accel_path,
const gchar *accelerator)
{
guint key;
GdkModifierType mod;
if (accel_path == NULL || accelerator == NULL) return FALSE;
gtk_accelerator_parse (accelerator, &key, &mod);
return gtk_accel_map_change_entry (accel_path, key, mod, TRUE);
}
_______________________________________________
Glade-devel maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/glade-devel