MooActionCollection - object containing bunch of actions groups; MooActionBase - interface used by all actions in moo; MooAction, MooToggleAction, MooRadioAction - subclasses of corresponding gtk classes implementing MooActionBase interface.

master
Yevgen Muntyan 2006-08-15 02:12:41 -05:00
parent a402f1ad3f
commit b9ffc63ecb
48 changed files with 2417 additions and 1112 deletions

View File

@ -293,16 +293,16 @@
</kdevdoctreeview>
<kdevfilecreate>
<filetypes>
<type icon="source" ext="g" name="GAP source" create="template" >
<type icon="source" ext="g" create="template" name="GAP source" >
<descr>A new empty GAP source file</descr>
</type>
<type icon="source_cpp" ext="cpp" name="C++ Source" create="template" >
<type icon="source_cpp" ext="cpp" create="template" name="C++ Source" >
<descr>A new empty C++ file.</descr>
</type>
<type icon="source_h" ext="h" name="C/C++ Header" create="template" >
<type icon="source_h" ext="h" create="template" name="C/C++ Header" >
<descr>A new empty header file for C/C++.</descr>
</type>
<type icon="source_c" ext="c" name="C Source" create="template" >
<type icon="source_c" ext="c" create="template" name="C Source" >
<descr>A new empty C file.</descr>
</type>
</filetypes>

View File

@ -46,6 +46,8 @@
#include <mooutils/mooaccelbutton.h>
#include <mooutils/mooaction.h>
#include <mooutils/mooactionbase.h>
#include <mooutils/mooactioncollection.h>
#include <mooutils/moobigpaned.h>
#include <mooutils/mooclosure.h>
#include <mooutils/moocmd.h>

View File

@ -1234,16 +1234,16 @@ install_actions (MooApp *app,
_about = g_strdup_printf (Q_("Menu item label|_About %s"), app->priv->info->full_name);
moo_window_class_new_action (klass, "Preferences",
"stock-display-name", GTK_STOCK_PREFERENCES,
"stock-label", GTK_STOCK_PREFERENCES,
"stock-tooltip", GTK_STOCK_PREFERENCES,
moo_window_class_new_action (klass, "Preferences", NULL,
"display-name", GTK_STOCK_PREFERENCES,
"label", GTK_STOCK_PREFERENCES,
"tooltip", GTK_STOCK_PREFERENCES,
"stock-id", GTK_STOCK_PREFERENCES,
"closure-callback", moo_app_prefs_dialog,
NULL);
moo_window_class_new_action (klass, "About",
"stock-display-name", GTK_STOCK_ABOUT,
moo_window_class_new_action (klass, "About", NULL,
"display-name", GTK_STOCK_ABOUT,
"label", _about,
"no-accel", TRUE,
"stock-id", GTK_STOCK_ABOUT,
@ -1263,10 +1263,10 @@ install_editor_actions (MooApp *app)
g_return_if_fail (klass != NULL);
moo_window_class_new_action (klass, "Quit",
"stock-display-name", GTK_STOCK_QUIT,
"stock-label", GTK_STOCK_QUIT,
"stock-tooltip", GTK_STOCK_QUIT,
moo_window_class_new_action (klass, "Quit", NULL,
"display-name", GTK_STOCK_QUIT,
"label", GTK_STOCK_QUIT,
"tooltip", GTK_STOCK_QUIT,
"stock-id", GTK_STOCK_QUIT,
"accel", "<ctrl>Q",
"closure-callback", moo_app_quit,
@ -1306,7 +1306,7 @@ install_terminal_actions (MooApp *app)
install_actions (app, MOO_TYPE_TERM_WINDOW);
moo_window_class_new_action (klass, "NewEditor",
moo_window_class_new_action (klass, "NewEditor", NULL,
"display-name", "New Editor",
"label", "_New Editor",
"tooltip", "New Editor",
@ -1316,7 +1316,7 @@ install_terminal_actions (MooApp *app)
"closure-proxy-func", moo_app_get_instance,
NULL);
moo_window_class_new_action (klass, "OpenInEditor",
moo_window_class_new_action (klass, "OpenInEditor", NULL,
"display-name", "Open In Editor",
"label", "_Open In Editor",
"tooltip", "Open In Editor",

View File

@ -33,7 +33,8 @@
#include <stdio.h>
#include <string.h>
#include "mooapp/mooappinput.h"
#include "mooapp/mooapp.h"
#define MOO_APP_COMPILATION
#include "mooapp/mooapp-private.h"
struct _MooAppInput

View File

@ -18,6 +18,7 @@
#include "mooutils/moocompat.h"
#include "mooutils/moomarshals.h"
#include "mooutils/mooactionfactory.h"
#include "mooutils/mooactionbase.h"
#include <string.h>
#include <gobject/gvaluecollector.h>
@ -117,11 +118,21 @@ create_action (const char *action_id,
g_return_val_if_fail (MOO_IS_ACTION_FACTORY (info->action), NULL);
g_return_val_if_fail (action_id && action_id[0], NULL);
if (g_type_is_a (info->action->action_type, MOO_TYPE_ACTION))
action = moo_action_factory_create_action (info->action, edit,
"closure-object", edit,
"name", action_id,
NULL);
else if (g_type_is_a (info->action->action_type, MOO_TYPE_TOGGLE_ACTION))
action = moo_action_factory_create_action (info->action, edit,
"toggled-object", edit,
"name", action_id,
NULL);
else
action = moo_action_factory_create_action (info->action, edit,
"name", action_id,
NULL);
g_return_val_if_fail (action != NULL, NULL);
if (g_type_is_a (info->action->action_type, MOO_TYPE_EDIT_ACTION))
@ -248,9 +259,9 @@ moo_edit_class_new_actionv (MooEditClass *klass,
action_type = moo_value_get_gtype (&param.value);
if (!g_type_is_a (action_type, GTK_TYPE_ACTION))
if (!g_type_is_a (action_type, MOO_TYPE_ACTION_BASE))
{
g_warning ("%s: invalid action type", G_STRLOC);
g_warning ("%s: invalid action type %s", G_STRLOC, g_type_name (action_type));
goto error;
}
@ -289,7 +300,7 @@ moo_edit_class_new_actionv (MooEditClass *klass,
action_class = g_type_class_ref (action_type);
}
pspec = _moo_action_find_property (action_class, name);
pspec = g_object_class_find_property (action_class, name);
if (!pspec)
{
@ -486,7 +497,7 @@ GtkActionGroup *
moo_edit_get_actions (MooEdit *edit)
{
g_return_val_if_fail (MOO_IS_EDIT (edit), NULL);
return edit->priv->actions;
return moo_action_collection_get_group (edit->priv->actions, NULL);
}
@ -544,7 +555,7 @@ _moo_edit_add_class_actions (MooEdit *edit)
void
_moo_edit_check_actions (MooEdit *edit)
{
GList *actions = gtk_action_group_list_actions (edit->priv->actions);
GList *actions = moo_action_collection_list_actions (edit->priv->actions);
while (actions)
{
@ -611,7 +622,7 @@ _moo_edit_class_init_actions (MooEditClass *klass)
/* MooEditAction
*/
G_DEFINE_TYPE (MooEditAction, moo_edit_action, GTK_TYPE_ACTION);
G_DEFINE_TYPE (MooEditAction, moo_edit_action, MOO_TYPE_ACTION);
enum {
CHECK_STATE,

View File

@ -14,6 +14,7 @@
#ifndef __MOO_EDIT_ACTIONS_H__
#define __MOO_EDIT_ACTIONS_H__
#include <mooutils/mooaction.h>
#include <mooutils/moouixml.h>
#include <mooedit/mooedit.h>
@ -38,7 +39,7 @@ typedef enum {
struct _MooEditAction
{
GtkAction parent;
MooAction parent;
MooEdit *doc;
GSList *langs;
MooEditActionFlags flags;
@ -46,7 +47,7 @@ struct _MooEditAction
struct _MooEditActionClass
{
GtkActionClass parent_class;
MooActionClass parent_class;
gboolean (*check_state) (MooEditAction *action);
};

View File

@ -149,7 +149,7 @@ struct _MooEditPrivate {
/* Actions
/*/
GtkMenu *menu;
GtkActionGroup *actions;
MooActionCollection *actions;
};

View File

@ -243,7 +243,7 @@ moo_edit_init (MooEdit *edit)
edit->priv->file_watch_policy = MOO_EDIT_RELOAD_IF_SAFE;
edit->priv->actions = gtk_action_group_new ("MooEdit");
edit->priv->actions = moo_action_collection_new ("MooEdit", "MooEdit");
indent = moo_indenter_new (edit, NULL);
moo_text_view_set_indenter (MOO_TEXT_VIEW (edit), indent);
@ -1920,7 +1920,7 @@ _moo_edit_do_popup (MooEdit *edit,
window = moo_edit_get_window (edit);
edit->priv->menu =
moo_ui_xml_create_widget (xml, MOO_UI_MENU, "Editor/Popup",
moo_edit_get_actions (edit),
edit->priv->actions,
window ? MOO_WINDOW(window)->accel_group : NULL);
gtk_object_sink (g_object_ref (edit->priv->menu));

View File

@ -256,7 +256,7 @@ moo_editor_class_init (MooEditorClass *klass)
G_TYPE_NONE, 0);
edit_window_class = g_type_class_ref (MOO_TYPE_EDIT_WINDOW);
moo_window_class_new_action_custom (edit_window_class, RECENT_ACTION_ID,
moo_window_class_new_action_custom (edit_window_class, RECENT_ACTION_ID, NULL,
(MooWindowActionFunc) create_recent_action,
NULL, NULL);
g_type_class_unref (edit_window_class);
@ -572,7 +572,7 @@ add_new_window_action (void)
klass = g_type_class_peek (MOO_TYPE_EDIT_WINDOW);
if (!moo_window_class_find_action (klass, "NewWindow"))
moo_window_class_new_action (klass, "NewWindow",
moo_window_class_new_action (klass, "NewWindow", NULL,
"display-name", "New Window",
"label", "_New Window",
"tooltip", "Open new editor window",

View File

@ -32,6 +32,7 @@
#include "mooutils/moocompat.h"
#include "mooutils/mooglade.h"
#include "mooutils/mooi18n.h"
#include "mooutils/mooaction-private.h"
#include "moofileview/moofile.h"
#include <string.h>
#include <gtk/gtk.h>
@ -357,7 +358,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
moo_window_class_set_id (window_class, "Editor", "Editor");
moo_window_class_new_action (window_class, "NewDoc",
moo_window_class_new_action (window_class, "NewDoc", NULL,
"display-name", Q_("New document|New"),
"label", Q_("New document|New"),
"tooltip", _("Create new document"),
@ -366,8 +367,8 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"closure-callback", action_new_doc,
NULL);
moo_window_class_new_action (window_class, "Open",
"stock-display-name", GTK_STOCK_OPEN,
moo_window_class_new_action (window_class, "Open", NULL,
"display-name", GTK_STOCK_OPEN,
"label", _("_Open..."),
"tooltip", _("Open..."),
"stock-id", GTK_STOCK_OPEN,
@ -375,7 +376,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"closure-callback", action_open,
NULL);
moo_window_class_new_action (window_class, "Reload",
moo_window_class_new_action (window_class, "Reload", NULL,
"display-name", _("Reload"),
"label", _("_Reload"),
"tooltip", _("Reload document"),
@ -385,18 +386,18 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "can-reload",
NULL);
moo_window_class_new_action (window_class, "Save",
"stock-display-name", GTK_STOCK_SAVE,
"stock-label", GTK_STOCK_SAVE,
"stock-tooltip", GTK_STOCK_SAVE,
moo_window_class_new_action (window_class, "Save", NULL,
"display-name", GTK_STOCK_SAVE,
"label", GTK_STOCK_SAVE,
"tooltip", GTK_STOCK_SAVE,
"stock-id", GTK_STOCK_SAVE,
"accel", "<ctrl>S",
"closure-callback", action_save,
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "SaveAs",
"stock-display-name", GTK_STOCK_SAVE_AS,
moo_window_class_new_action (window_class, "SaveAs", NULL,
"display-name", GTK_STOCK_SAVE_AS,
"label", _("Save _As..."),
"tooltip", _("Save as..."),
"stock-id", GTK_STOCK_SAVE_AS,
@ -405,9 +406,9 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "Close",
"stock-display-name", GTK_STOCK_CLOSE,
"stock-label", GTK_STOCK_CLOSE,
moo_window_class_new_action (window_class, "Close", NULL,
"display-name", GTK_STOCK_CLOSE,
"label", GTK_STOCK_CLOSE,
"tooltip", _("Close document"),
"stock-id", GTK_STOCK_CLOSE,
"accel", "<ctrl>W",
@ -415,7 +416,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "CloseAll",
moo_window_class_new_action (window_class, "CloseAll", NULL,
"display-name", _("Close All"),
"label", _("Close _All"),
"tooltip", _("Close all documents"),
@ -424,10 +425,10 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "Undo",
"stock-display-name", GTK_STOCK_UNDO,
"stock-label", GTK_STOCK_UNDO,
"stock-tooltip", GTK_STOCK_UNDO,
moo_window_class_new_action (window_class, "Undo", NULL,
"display-name", GTK_STOCK_UNDO,
"label", GTK_STOCK_UNDO,
"tooltip", GTK_STOCK_UNDO,
"stock-id", GTK_STOCK_UNDO,
"accel", "<ctrl>Z",
"closure-signal", "undo",
@ -435,10 +436,10 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "can-undo",
NULL);
moo_window_class_new_action (window_class, "Redo",
"stock-display-name", GTK_STOCK_REDO,
"stock-label", GTK_STOCK_REDO,
"stock-tooltip", GTK_STOCK_REDO,
moo_window_class_new_action (window_class, "Redo", NULL,
"display-name", GTK_STOCK_REDO,
"label", GTK_STOCK_REDO,
"tooltip", GTK_STOCK_REDO,
"stock-id", GTK_STOCK_REDO,
"accel", "<shift><ctrl>Z",
"closure-signal", "redo",
@ -446,10 +447,10 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "can-redo",
NULL);
moo_window_class_new_action (window_class, "Cut",
"stock-display-name", GTK_STOCK_CUT,
"stock-label", GTK_STOCK_CUT,
"stock-tooltip", GTK_STOCK_CUT,
moo_window_class_new_action (window_class, "Cut", NULL,
"display-name", GTK_STOCK_CUT,
"label", GTK_STOCK_CUT,
"tooltip", GTK_STOCK_CUT,
"stock-id", GTK_STOCK_CUT,
"accel", "<ctrl>X",
"closure-signal", "cut-clipboard",
@ -457,10 +458,10 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-selection",
NULL);
moo_window_class_new_action (window_class, "Copy",
"stock-display-name", GTK_STOCK_COPY,
"stock-label", GTK_STOCK_COPY,
"stock-tooltip", GTK_STOCK_COPY,
moo_window_class_new_action (window_class, "Copy", NULL,
"display-name", GTK_STOCK_COPY,
"label", GTK_STOCK_COPY,
"tooltip", GTK_STOCK_COPY,
"stock-id", GTK_STOCK_COPY,
"accel", "<ctrl>C",
"closure-signal", "copy-clipboard",
@ -468,10 +469,10 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-selection",
NULL);
moo_window_class_new_action (window_class, "Paste",
"stock-display-name", GTK_STOCK_PASTE,
"stock-label", GTK_STOCK_PASTE,
"stock-tooltip", GTK_STOCK_PASTE,
moo_window_class_new_action (window_class, "Paste", NULL,
"display-name", GTK_STOCK_PASTE,
"label", GTK_STOCK_PASTE,
"tooltip", GTK_STOCK_PASTE,
"stock-id", GTK_STOCK_PASTE,
"accel", "<ctrl>V",
"closure-signal", "paste-clipboard",
@ -479,17 +480,17 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "Delete",
"stock-display-name", GTK_STOCK_DELETE,
"stock-label", GTK_STOCK_DELETE,
"stock-tooltip", GTK_STOCK_DELETE,
moo_window_class_new_action (window_class, "Delete", NULL,
"display-name", GTK_STOCK_DELETE,
"label", GTK_STOCK_DELETE,
"tooltip", GTK_STOCK_DELETE,
"stock-id", GTK_STOCK_DELETE,
"closure-signal", "delete-selection",
"closure-proxy-func", moo_edit_window_get_active_doc,
"condition::sensitive", "has-selection",
NULL);
moo_window_class_new_action (window_class, "SelectAll",
moo_window_class_new_action (window_class, "SelectAll", NULL,
"display-name", _("Select All"),
"label", _("Select _All"),
"tooltip", _("Select all"),
@ -499,7 +500,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-text",
NULL);
moo_window_class_new_action (window_class, "PreviousTab",
moo_window_class_new_action (window_class, "PreviousTab", NULL,
"display-name", _("Previous Tab"),
"label", _("_Previous Tab"),
"tooltip", _("Previous tab"),
@ -509,7 +510,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "NextTab",
moo_window_class_new_action (window_class, "NextTab", NULL,
"display-name", _("Next Tab"),
"label", _("_Next Tab"),
"tooltip", _("Next tab"),
@ -519,10 +520,10 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "Find",
"stock-display-name", GTK_STOCK_FIND,
"stock-label", GTK_STOCK_FIND,
"stock-tooltip", GTK_STOCK_FIND,
moo_window_class_new_action (window_class, "Find", NULL,
"display-name", GTK_STOCK_FIND,
"label", GTK_STOCK_FIND,
"tooltip", GTK_STOCK_FIND,
"stock-id", GTK_STOCK_FIND,
"accel", "<ctrl>F",
"closure-signal", "find-interactive",
@ -530,7 +531,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "FindNext",
moo_window_class_new_action (window_class, "FindNext", NULL,
"display-name", _("Find Next"),
"label", ("Find _Next"),
"tooltip", _("Find next"),
@ -541,7 +542,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "FindPrevious",
moo_window_class_new_action (window_class, "FindPrevious", NULL,
"display-name", _("Find Previous"),
"label", _("Find _Previous"),
"tooltip", _("Find previous"),
@ -552,10 +553,10 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "Replace",
"stock-display-name", GTK_STOCK_FIND_AND_REPLACE,
"stock-label", GTK_STOCK_FIND_AND_REPLACE,
"stock-tooltip", GTK_STOCK_FIND_AND_REPLACE,
moo_window_class_new_action (window_class, "Replace", NULL,
"display-name", GTK_STOCK_FIND_AND_REPLACE,
"label", GTK_STOCK_FIND_AND_REPLACE,
"tooltip", GTK_STOCK_FIND_AND_REPLACE,
"stock-id", GTK_STOCK_FIND_AND_REPLACE,
"accel", "<ctrl>R",
"closure-signal", "replace-interactive",
@ -563,7 +564,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "FindCurrent",
moo_window_class_new_action (window_class, "FindCurrent", NULL,
"display-name", _("Find Current Word"),
"label", _("Find Current _Word"),
"stock-id", GTK_STOCK_FIND,
@ -572,7 +573,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "FindCurrentBack",
moo_window_class_new_action (window_class, "FindCurrentBack", NULL,
"display-name", _("Find Current Word Backwards"),
"label", _("Find Current Word _Backwards"),
"stock-id", GTK_STOCK_FIND,
@ -581,7 +582,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "GoToLine",
moo_window_class_new_action (window_class, "GoToLine", NULL,
"display-name", _("Go to Line"),
"label", _("_Go to Line"),
"tooltip", _("Go to line"),
@ -591,23 +592,23 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "WrapText",
"action-type::", GTK_TYPE_TOGGLE_ACTION,
moo_window_class_new_action (window_class, "WrapText", NULL,
"action-type::", MOO_TYPE_TOGGLE_ACTION,
"display-name", _("Toggle Text Wrapping"),
"label", _("_Wrap Text"),
"toggled-callback", wrap_text_toggled,
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "LineNumbers",
"action-type::", GTK_TYPE_TOGGLE_ACTION,
moo_window_class_new_action (window_class, "LineNumbers", NULL,
"action-type::", MOO_TYPE_TOGGLE_ACTION,
"display-name", _("Toggle Line Numbers Display"),
"label", _("_Show Line Numbers"),
"toggled-callback", line_numbers_toggled,
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "FocusDoc",
moo_window_class_new_action (window_class, "FocusDoc", NULL,
"display-name", _("Focus Doc"),
"label", _("_Focus Doc"),
"tooltip", _("Focus Doc"),
@ -617,10 +618,10 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, STOP_ACTION_ID,
"stock-display-name", GTK_STOCK_STOP,
"stock-label", GTK_STOCK_STOP,
"stock-tooltip", GTK_STOCK_STOP,
moo_window_class_new_action (window_class, STOP_ACTION_ID, NULL,
"display-name", GTK_STOCK_STOP,
"label", GTK_STOCK_STOP,
"tooltip", GTK_STOCK_STOP,
"stock-id", GTK_STOCK_STOP,
"accel", "Escape",
"closure-callback", action_abort_jobs,
@ -628,7 +629,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::visible", "has-stop-clients",
NULL);
// moo_window_class_new_action (window_class, "ToggleBookmark",
// moo_window_class_new_action (window_class, "ToggleBookmark", NULL,
// "display-name", "Toggle Bookmark",
// "label", "Toggle Bookmark",
// "tooltip", "Toggle bookmark",
@ -638,7 +639,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
// "condition::sensitive", "has-open-document",
// NULL);
//
// moo_window_class_new_action (window_class, "NextBookmark",
// moo_window_class_new_action (window_class, "NextBookmark", NULL,
// "display-name", "Next Bookmark",
// "label", "Next Bookmark",
// "tooltip", "Next bookmark",
@ -648,7 +649,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
// "condition::visible", "has-open-document",
// NULL);
//
// moo_window_class_new_action (window_class, "PreviousBookmark",
// moo_window_class_new_action (window_class, "PreviousBookmark", NULL,
// "display-name", "Previous Bookmark",
// "label", "Previous Bookmark",
// "tooltip", "Previous bookmark",
@ -658,7 +659,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
// "condition::visible", "has-open-document",
// NULL);
moo_window_class_new_action (window_class, "NextPlaceholder",
moo_window_class_new_action (window_class, "NextPlaceholder", NULL,
"display-name", _("Next Placeholder"),
"label", _("Next Placeholder"),
"tooltip", _("Go to next placeholder"),
@ -667,7 +668,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::visible", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "PrevPlaceholder",
moo_window_class_new_action (window_class, "PrevPlaceholder", NULL,
"display-name", _("Previous Placeholder"),
"label", _("Previous Placeholder"),
"tooltip", _("Go to previous placeholder"),
@ -676,7 +677,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::visible", "has-open-document",
NULL);
// moo_window_class_new_action (window_class, "QuickSearch",
// moo_window_class_new_action (window_class, "QuickSearch", NULL,
// "display-name", "Quick Search",
// "label", "Quick Search",
// "tooltip", "Quick search",
@ -687,7 +688,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
// "condition::sensitive", "has-open-document",
// NULL);
moo_window_class_new_action (window_class, "Comment",
moo_window_class_new_action (window_class, "Comment", NULL,
"display-name", _("Comment"),
"label", _("Comment"),
"tooltip", _("Comment"),
@ -696,7 +697,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-comments",
NULL);
moo_window_class_new_action (window_class, "Uncomment",
moo_window_class_new_action (window_class, "Uncomment", NULL,
"display-name", _("Uncomment"),
"label", _("Uncomment"),
"tooltip", _("Uncomment"),
@ -705,35 +706,33 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"condition::sensitive", "has-comments",
NULL);
moo_window_class_new_action (window_class, "Indent",
"stock-display-name", GTK_STOCK_INDENT,
"stock-label", GTK_STOCK_INDENT,
"stock-tooltip", GTK_STOCK_INDENT,
moo_window_class_new_action (window_class, "Indent", NULL,
"display-name", GTK_STOCK_INDENT,
"label", GTK_STOCK_INDENT,
"tooltip", GTK_STOCK_INDENT,
"stock-id", GTK_STOCK_INDENT,
"accel", "<ctrl>i",
"closure-callback", moo_text_view_indent,
"closure-proxy-func", moo_edit_window_get_active_doc,
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "Unindent",
"stock-display-name", GTK_STOCK_UNINDENT,
"stock-label", GTK_STOCK_UNINDENT,
"stock-tooltip", GTK_STOCK_UNINDENT,
moo_window_class_new_action (window_class, "Unindent", NULL,
"display-name", GTK_STOCK_UNINDENT,
"label", GTK_STOCK_UNINDENT,
"tooltip", GTK_STOCK_UNINDENT,
"stock-id", GTK_STOCK_UNINDENT,
"accel", "<shift><ctrl>i",
"closure-callback", moo_text_view_unindent,
"closure-proxy-func", moo_edit_window_get_active_doc,
"condition::sensitive", "has-open-document",
NULL);
moo_window_class_new_action (window_class, "NoDocuments",
moo_window_class_new_action (window_class, "NoDocuments", NULL,
"label", _("No Documents"),
"no-accel", TRUE,
NULL);
#ifdef ENABLE_PRINTING
moo_window_class_new_action (window_class, "PageSetup",
moo_window_class_new_action (window_class, "PageSetup", NULL,
"display-name", _("Page Setup"),
"label", _("Page Setup"),
"tooltip", _("Page Setup"),
@ -741,10 +740,10 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
"closure-callback", action_page_setup,
NULL);
moo_window_class_new_action (window_class, "Print",
"stock-display-name", GTK_STOCK_PRINT,
"stock-label", GTK_STOCK_PRINT,
"stock-tooltip", GTK_STOCK_PRINT,
moo_window_class_new_action (window_class, "Print", NULL,
"display-name", GTK_STOCK_PRINT,
"label", GTK_STOCK_PRINT,
"tooltip", GTK_STOCK_PRINT,
"accel", "<ctrl>P",
"stock-id", GTK_STOCK_PRINT,
"closure-callback", action_print,
@ -752,7 +751,7 @@ moo_edit_window_class_init (MooEditWindowClass *klass)
NULL);
#endif
moo_window_class_new_action_custom (window_class, LANG_ACTION_ID,
moo_window_class_new_action_custom (window_class, LANG_ACTION_ID, NULL,
(MooWindowActionFunc) create_lang_action,
NULL, NULL);
}
@ -1843,7 +1842,7 @@ _moo_edit_window_remove_doc (MooEditWindow *window,
if (action)
{
gtk_action_group_remove_action (moo_window_get_actions (MOO_WINDOW (window)), action);
moo_action_collection_remove_action (moo_window_get_actions (MOO_WINDOW (window)), action);
g_object_set_data (G_OBJECT (doc), "moo-doc-list-action", NULL);
}
@ -3336,17 +3335,19 @@ do_update_doc_list (MooEditWindow *window)
}
else
{
GtkActionGroup *group;
char *name = g_strdup_printf ("MooEdit-%p", doc);
action = gtk_radio_action_new (name,
moo_edit_get_display_basename (doc),
moo_edit_get_display_filename (doc),
NULL, 0);
action = g_object_new (MOO_TYPE_RADIO_ACTION ,
"name", name,
"label", moo_edit_get_display_basename (doc),
"tooltip", moo_edit_get_display_filename (doc),
NULL);
g_object_set_data_full (doc, "moo-doc-list-action", action, g_object_unref);
g_object_set_data (G_OBJECT (action), "moo-edit", doc);
moo_action_set_no_accel (GTK_ACTION (action), TRUE);
_moo_action_set_no_accel (action, TRUE);
g_signal_connect (action, "toggled", G_CALLBACK (doc_list_action_toggled), window);
gtk_action_group_add_action (moo_window_get_actions (MOO_WINDOW (window)),
GTK_ACTION (action));
group = moo_action_collection_get_group (moo_window_get_actions (MOO_WINDOW (window)), NULL);
gtk_action_group_add_action (group, GTK_ACTION (action));
g_free (name);
}

View File

@ -381,7 +381,7 @@ _moo_plugin_finish_load (void)
while (waiting_list)
{
ModuleInfo *info = waiting_list->data;
g_warning ("unknown module type '%s' in file %s",
g_message ("unknown module type '%s' in file %s",
info->loader, info->ini_file);
module_info_free (info);
waiting_list = g_slist_delete_link (waiting_list, waiting_list);

View File

@ -20,7 +20,7 @@
#include "mooutils/mooconfig.h"
#include "mooutils/moocommand.h"
#include "mooutils/mooaccel.h"
#include "mooutils/mooaction.h"
#include "mooutils/mooaction-private.h"
#include <string.h>
@ -378,7 +378,7 @@ load_config_item (FileType type,
case FILE_TOOLS:
klass = g_type_class_peek (MOO_TYPE_EDIT_WINDOW);
moo_window_class_new_action_custom (klass, data->id,
moo_window_class_new_action_custom (klass, data->id, NULL,
create_tool_action, data,
(GDestroyNotify) action_data_free);
@ -615,7 +615,7 @@ run_exe (MooToolAction *action,
return moo_cmd_view_run_command (MOO_CMD_VIEW (cmd_view), cmd_line,
action->data->cmd->working_dir,
moo_action_get_display_name (GTK_ACTION (action)));
_moo_action_get_display_name (GTK_ACTION (action)));
}
@ -693,7 +693,7 @@ create_tool_action (MooWindow *window,
"name", data->name,
"label", data->label,
NULL);
moo_action_set_default_accel (GTK_ACTION (action), data->accel);
_moo_action_set_default_accel (GTK_ACTION (action), data->accel);
action->window = MOO_EDIT_WINDOW (window);
action->data = data;
@ -722,7 +722,7 @@ create_edit_action (MooEdit *edit,
"langs", data->langs,
"flags", flags,
NULL);
moo_action_set_default_accel (GTK_ACTION (action), data->accel);
_moo_action_set_default_accel (GTK_ACTION (action), data->accel);
action->window = moo_edit_get_window (edit);
action->data = data;

View File

@ -32,7 +32,7 @@ cmpl_plugin_init (CmplPlugin *plugin)
g_return_val_if_fail (klass != NULL, FALSE);
g_return_val_if_fail (editor != NULL, FALSE);
moo_window_class_new_action (klass, "CompleteWord",
moo_window_class_new_action (klass, "CompleteWord", NULL,
"display-name", _("Complete Word"),
"label", _("Complete Word"),
"tooltip", _("Complete Word"),

View File

@ -302,7 +302,7 @@ moo_file_selector_populate_popup (MooFileView *fileview,
{
GtkAction *action;
action = gtk_action_group_get_action (moo_file_view_get_actions (fileview), "NewFile");
action = moo_action_collection_get_action (moo_file_view_get_actions (fileview), "NewFile");
if (action)
gtk_action_set_sensitive (action, !selected || !selected->next);
@ -498,6 +498,7 @@ moo_file_selector_constructor (GType type,
MooFileView *fileview;
GObject *object;
guint merge_id;
GtkActionGroup *group;
object = G_OBJECT_CLASS(_moo_file_selector_parent_class)->constructor (type, n_props, props);
filesel = MOO_FILE_SELECTOR (object);
@ -509,15 +510,14 @@ moo_file_selector_constructor (GType type,
g_idle_add ((GSourceFunc) file_selector_go_home, g_object_ref (filesel));
moo_action_group_add_action (moo_file_view_get_actions (MOO_FILE_VIEW (fileview)),
"GoToCurrentDocDir",
group = moo_action_collection_get_group (moo_file_view_get_actions (MOO_FILE_VIEW (fileview)), NULL);
moo_action_group_add_action (group, "GoToCurrentDocDir",
"stock-id", GTK_STOCK_JUMP_TO,
"tooltip", _("Go to current document directory"),
"closure-object", filesel,
"closure-callback", goto_current_doc_dir,
NULL);
moo_action_group_add_action (moo_file_view_get_actions (MOO_FILE_VIEW (fileview)),
"NewFile",
moo_action_group_add_action (group, "NewFile",
"label", _("New File..."),
"tooltip", _("New File..."),
"stock-id", GTK_STOCK_NEW,
@ -1272,7 +1272,7 @@ file_selector_plugin_init (Plugin *plugin)
g_return_val_if_fail (klass != NULL, FALSE);
g_return_val_if_fail (editor != NULL, FALSE);
moo_window_class_new_action (klass, "ShowFileSelector",
moo_window_class_new_action (klass, "ShowFileSelector", NULL,
"display-name", _("Show File Selector"),
"label", _("Show File Selector"),
"tooltip", _("Show file selector"),

View File

@ -236,7 +236,7 @@ find_plugin_init (FindPlugin *plugin)
g_return_val_if_fail (klass != NULL, FALSE);
g_return_val_if_fail (editor != NULL, FALSE);
moo_window_class_new_action (klass, "FindInFiles",
moo_window_class_new_action (klass, "FindInFiles", NULL,
"display-name", _("Find In Files"),
"label", _("Find In Files"),
"tooltip", _("Find in files"),
@ -245,7 +245,7 @@ find_plugin_init (FindPlugin *plugin)
"closure-callback", find_in_files_cb,
NULL);
moo_window_class_new_action (klass, "FindFile",
moo_window_class_new_action (klass, "FindFile", NULL,
"display-name", _("Find File"),
"label", _("Find File"),
"tooltip", _("Find file"),

View File

@ -456,7 +456,7 @@ moo_bookmark_mgr_save (MooBookmarkMgr *mgr)
struct _UserInfo {
GObject *user;
MooUIXML *xml;
GtkActionGroup *actions;
MooActionCollection *actions;
char *path;
guint user_id;
guint merge_id;
@ -465,7 +465,7 @@ struct _UserInfo {
static UserInfo*
user_info_new (GObject *user,
GtkActionGroup *actions,
MooActionCollection *actions,
MooUIXML *xml,
const char *path,
guint user_id)
@ -473,7 +473,7 @@ user_info_new (GObject *user,
UserInfo *info;
g_return_val_if_fail (G_IS_OBJECT (user), NULL);
g_return_val_if_fail (GTK_IS_ACTION_GROUP (actions), NULL);
g_return_val_if_fail (MOO_IS_ACTION_COLLECTION (actions), NULL);
g_return_val_if_fail (MOO_IS_UI_XML (xml), NULL);
g_return_val_if_fail (path, NULL);
g_return_val_if_fail (user_id > 0, NULL);
@ -526,6 +526,7 @@ make_menu (MooBookmarkMgr *mgr,
GtkTreeModel *model = GTK_TREE_MODEL (mgr->priv->store);
GtkTreeIter iter;
GString *markup;
GtkActionGroup *group;
if (!gtk_tree_model_get_iter_first (model, &iter))
return;
@ -533,6 +534,8 @@ make_menu (MooBookmarkMgr *mgr,
info->merge_id = moo_ui_xml_new_merge_id (info->xml);
markup = g_string_new (NULL);
group = moo_action_collection_get_group (info->actions, NULL);
do
{
MooBookmark *bookmark = NULL;
@ -549,9 +552,8 @@ make_menu (MooBookmarkMgr *mgr,
action_id = g_strdup_printf ("MooBookmarkAction-%p", bookmark);
action = moo_action_group_add_action (info->actions, action_id,
"label", bookmark->label ? bookmark->label :
bookmark->display_path,
action = moo_action_group_add_action (group, action_id,
"label", bookmark->label ? bookmark->label : bookmark->display_path,
"stock-id", bookmark->icon_stock_id,
"tooltip", bookmark->display_path,
"no-accel", TRUE,
@ -584,7 +586,7 @@ destroy_menu (UserInfo *info)
for (l = info->bm_actions; l != NULL; l = l->next)
{
GtkAction *action = l->data;
gtk_action_group_remove_action (info->actions, action);
moo_action_collection_remove_action (info->actions, action);
g_object_unref (action);
}
@ -628,7 +630,7 @@ mgr_update_menus (MooBookmarkMgr *mgr)
void
_moo_bookmark_mgr_add_user (MooBookmarkMgr *mgr,
gpointer user,
GtkActionGroup *actions,
MooActionCollection *actions,
MooUIXML *xml,
const char *path)
{
@ -637,7 +639,7 @@ _moo_bookmark_mgr_add_user (MooBookmarkMgr *mgr,
g_return_if_fail (MOO_IS_BOOKMARK_MGR (mgr));
g_return_if_fail (G_IS_OBJECT (user));
g_return_if_fail (GTK_IS_ACTION_GROUP (actions));
g_return_if_fail (MOO_IS_ACTION_COLLECTION (actions));
g_return_if_fail (MOO_IS_UI_XML (xml));
g_return_if_fail (path != NULL);

View File

@ -92,7 +92,7 @@ GtkWidget *_moo_bookmark_mgr_get_editor(MooBookmarkMgr *mgr);
void _moo_bookmark_mgr_add_user (MooBookmarkMgr *mgr,
gpointer user, /* GObject* */
GtkActionGroup *actions,
MooActionCollection *actions,
MooUIXML *xml,
const char *path);
void _moo_bookmark_mgr_remove_user(MooBookmarkMgr *mgr,

View File

@ -20,6 +20,7 @@
#include "moofileview/moofileview-private.h"
#include "moofileview/moofile-private.h"
#include "mooutils/mooprefs.h"
#include "mooutils/mooaction.h"
#if MOO_USE_XDGMIME
#include "mooutils/xdgmime/xdgmime.h"
#endif
@ -32,17 +33,17 @@ typedef struct {
} ToolsInfo;
typedef struct {
GtkAction parent;
MooAction parent;
MooFileView *fileview;
GSList *extensions;
GSList *mimetypes;
char *command;
} ToolAction;
typedef GtkActionClass ToolActionClass;
typedef MooActionClass ToolActionClass;
GType _moo_file_view_tool_action_get_type (void) G_GNUC_CONST;
G_DEFINE_TYPE (ToolAction, _moo_file_view_tool_action, GTK_TYPE_ACTION)
G_DEFINE_TYPE (ToolAction, _moo_file_view_tool_action, MOO_TYPE_ACTION)
static void
@ -109,7 +110,7 @@ static void
_moo_file_view_tool_action_class_init (ToolActionClass *klass)
{
G_OBJECT_CLASS (klass)->finalize = moo_file_view_tool_action_finalize;
klass->activate = moo_file_view_tool_action_activate;
GTK_ACTION_CLASS (klass)->activate = moo_file_view_tool_action_activate;
}
@ -207,6 +208,7 @@ _moo_file_view_tools_load (MooFileView *fileview)
MooMarkupDoc *doc;
MooMarkupNode *root, *child;
MooUIXML *xml;
MooActionCollection *actions;
GtkActionGroup *group;
MooUINode *ph;
GSList *l;
@ -214,7 +216,8 @@ _moo_file_view_tools_load (MooFileView *fileview)
g_return_if_fail (MOO_IS_FILE_VIEW (fileview));
xml = moo_file_view_get_ui_xml (fileview);
group = moo_file_view_get_actions (fileview);
actions = moo_file_view_get_actions (fileview);
group = moo_action_collection_get_group (actions, NULL);
remove_old_tools (fileview, xml, group);
doc = moo_prefs_get_markup ();

View File

@ -39,7 +39,9 @@
#include "mooutils/moocmd.h"
#include "mooutils/moostock.h"
#include "mooutils/mooactionfactory.h"
#include "mooutils/mooaction-private.h"
#include "mooutils/moomarshals.h"
#include "mooutils/mooi18n.h"
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
@ -135,7 +137,7 @@ struct _MooFileViewPrivate {
gboolean sort_case_sensitive;
gboolean completion_case_sensitive;
GtkActionGroup *actions;
MooActionCollection *actions;
MooUIXML *ui_xml;
gboolean has_selection;
@ -1054,13 +1056,16 @@ static void
init_actions (MooFileView *fileview)
{
GtkAction *action;
GtkActionGroup *group;
fileview->priv->actions = gtk_action_group_new ("File Selector");
fileview->priv->actions = moo_action_collection_new ("File Selector", _("File Selector"));
fileview->priv->ui_xml = moo_ui_xml_new ();
moo_ui_xml_add_ui_from_string (fileview->priv->ui_xml,
MOO_FILE_VIEW_UI, -1);
moo_action_group_add_action (fileview->priv->actions, "GoUp",
group = moo_action_collection_get_group (fileview->priv->actions, NULL);
moo_action_group_add_action (group, "GoUp",
"label", "Parent Folder",
"tooltip", "Parent Folder",
"stock-id", GTK_STOCK_GO_UP,
@ -1070,7 +1075,7 @@ init_actions (MooFileView *fileview)
"closure-signal", "go-up",
NULL);
action = moo_action_group_add_action (fileview->priv->actions, "GoBack",
action = moo_action_group_add_action (group, "GoBack",
"label", "Go Back",
"tooltip", "Go Back",
"stock-id", GTK_STOCK_GO_BACK,
@ -1081,7 +1086,7 @@ init_actions (MooFileView *fileview)
NULL);
moo_bind_bool_property (action, "sensitive", fileview, "can-go-back", FALSE);
action = moo_action_group_add_action (fileview->priv->actions, "GoForward",
action = moo_action_group_add_action (group, "GoForward",
"label", "Go Forward",
"tooltip", "Go Forward",
"stock-id", GTK_STOCK_GO_FORWARD,
@ -1092,7 +1097,7 @@ init_actions (MooFileView *fileview)
NULL);
moo_bind_bool_property (action, "sensitive", fileview, "can-go-forward", FALSE);
moo_action_group_add_action (fileview->priv->actions, "GoHome",
moo_action_group_add_action (group, "GoHome",
"label", "Home Folder",
"tooltip", "Home Folder",
"stock-id", GTK_STOCK_HOME,
@ -1102,7 +1107,7 @@ init_actions (MooFileView *fileview)
"closure-signal", "go-home",
NULL);
moo_action_group_add_action (fileview->priv->actions, "NewFolder",
moo_action_group_add_action (group, "NewFolder",
"label", "New Folder...",
"tooltip", "New Folder...",
"stock-id", GTK_STOCK_DIRECTORY,
@ -1110,7 +1115,7 @@ init_actions (MooFileView *fileview)
"closure-callback", file_view_create_folder,
NULL);
action = moo_action_group_add_action (fileview->priv->actions, "Delete",
action = moo_action_group_add_action (group, "Delete",
"label", "Delete...",
"tooltip", "Delete...",
"stock-id", GTK_STOCK_DELETE,
@ -1121,30 +1126,30 @@ init_actions (MooFileView *fileview)
NULL);
moo_bind_bool_property (action, "sensitive", fileview, "has-selection", FALSE);
action = moo_action_group_add_action (fileview->priv->actions, "ShowHiddenFiles",
"action-type::", GTK_TYPE_TOGGLE_ACTION,
action = moo_action_group_add_action (group, "ShowHiddenFiles",
"action-type::", MOO_TYPE_TOGGLE_ACTION,
"label", "Show Hidden Files",
"tooltip", "Show Hidden Files",
"accel", "<alt><shift>H",
"force-accel-label", TRUE,
NULL);
moo_sync_toggle_action (action, fileview, "show-hidden-files", FALSE);
_moo_sync_toggle_action (action, fileview, "show-hidden-files", FALSE);
action = moo_action_group_add_action (fileview->priv->actions, "ShowParentFolder",
"action-type::", GTK_TYPE_TOGGLE_ACTION,
action = moo_action_group_add_action (group, "ShowParentFolder",
"action-type::", MOO_TYPE_TOGGLE_ACTION,
"label", "Show Parent Folder",
"tooltip", "Show Parent Folder",
NULL);
moo_sync_toggle_action (action, fileview, "show-parent-folder", FALSE);
_moo_sync_toggle_action (action, fileview, "show-parent-folder", FALSE);
action = moo_action_group_add_action (fileview->priv->actions, "CaseSensitiveSort",
"action-type::", GTK_TYPE_TOGGLE_ACTION,
action = moo_action_group_add_action (group, "CaseSensitiveSort",
"action-type::", MOO_TYPE_TOGGLE_ACTION,
"label", "Case Sensitive Sort",
"tooltip", "Case Sensitive Sort",
NULL);
moo_sync_toggle_action (action, fileview, "sort-case-sensitive", FALSE);
_moo_sync_toggle_action (action, fileview, "sort-case-sensitive", FALSE);
action = moo_action_group_add_action (fileview->priv->actions, "Properties",
action = moo_action_group_add_action (group, "Properties",
"label", "Properties",
"tooltip", "Properties",
"stock-id", GTK_STOCK_PROPERTIES,
@ -1155,7 +1160,7 @@ init_actions (MooFileView *fileview)
NULL);
moo_bind_bool_property (action, "sensitive", fileview, "has-selection", FALSE);
moo_action_group_add_action (fileview->priv->actions, "BookmarksMenu",
moo_action_group_add_action (group, "BookmarksMenu",
"label", "Bookmarks",
"tooltip", "Bookmarks",
"stock-id", GTK_STOCK_ABOUT,
@ -1164,7 +1169,7 @@ init_actions (MooFileView *fileview)
"has-submenu", TRUE,
NULL);
moo_action_group_add_action (fileview->priv->actions, "AddBookmark",
moo_action_group_add_action (group, "AddBookmark",
"label", "Add Bookmark",
"tooltip", "Add Bookmark",
"stock-id", GTK_STOCK_ADD,
@ -1172,7 +1177,7 @@ init_actions (MooFileView *fileview)
"closure-callback", add_bookmark,
NULL);
moo_action_group_add_action (fileview->priv->actions, "EditBookmarks",
moo_action_group_add_action (group, "EditBookmarks",
"label", "Edit Bookmarks...",
"tooltip", "Edit Bookmarks...",
"stock-id", GTK_STOCK_EDIT,
@ -1180,7 +1185,7 @@ init_actions (MooFileView *fileview)
"closure-callback", edit_bookmarks,
NULL);
action = moo_action_group_add_action (fileview->priv->actions, "Cut",
action = moo_action_group_add_action (group, "Cut",
"label", "Cut",
"tooltip", "Cut",
"stock-id", GTK_STOCK_CUT,
@ -1191,7 +1196,7 @@ init_actions (MooFileView *fileview)
NULL);
moo_bind_bool_property (action, "sensitive", fileview, "has-selection", FALSE);
action = moo_action_group_add_action (fileview->priv->actions, "Copy",
action = moo_action_group_add_action (group, "Copy",
"label", "Copy",
"tooltip", "Copy",
"stock-id", GTK_STOCK_COPY,
@ -1202,7 +1207,7 @@ init_actions (MooFileView *fileview)
NULL);
moo_bind_bool_property (action, "sensitive", fileview, "has-selection", FALSE);
action = moo_action_group_add_action (fileview->priv->actions, "Paste",
action = moo_action_group_add_action (group, "Paste",
"label", "Paste",
"tooltip", "Paste",
"stock-id", GTK_STOCK_PASTE,
@ -1213,7 +1218,7 @@ init_actions (MooFileView *fileview)
NULL);
#ifdef __WIN32__
moo_action_group_add_action (fileview->priv->actions, "Reload",
moo_action_group_add_action (group, "Reload",
"label", "Reload",
"tooltip", "Reload",
"stock-id", GTK_STOCK_REFRESH,
@ -1232,7 +1237,7 @@ moo_file_view_get_ui_xml (MooFileView *fileview)
}
GtkActionGroup*
MooActionCollection *
moo_file_view_get_actions (MooFileView *fileview)
{
g_return_val_if_fail (MOO_IS_FILE_VIEW (fileview), NULL);

View File

@ -36,7 +36,7 @@ gboolean moo_file_view_chdir (MooFileView *fileview,
GError **error);
MooUIXML *moo_file_view_get_ui_xml (MooFileView *fileview);
GtkActionGroup *moo_file_view_get_actions (MooFileView *fileview);
MooActionCollection *moo_file_view_get_actions (MooFileView *fileview);
G_END_DECLS

View File

@ -40,8 +40,7 @@ class _OpenRecent(object):
def __call__(self, window):
action = moo.utils.MenuAction("OpenRecentProject", _("Open Recent Project"))
moo.utils.action_set_display_name(action, _("Open Recent Project"))
moo.utils.action_set_no_accel(action, True)
action.set_property('display-name', _("Open Recent Project"))
action.set_mgr(self.mgr.recent_list.get_menu_mgr())
moo.utils.bind_bool_property(action, "sensitive",
self.mgr.recent_list, "empty",

View File

@ -121,7 +121,7 @@
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
<property name="activates_default">True</property>
</widget>
<packing>
<property name="padding">0</property>
@ -208,7 +208,7 @@
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
<property name="activates_default">True</property>
</widget>
<packing>
<property name="left_attach">1</property>
@ -228,7 +228,7 @@
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
<property name="activates_default">True</property>
</widget>
<packing>
<property name="left_attach">1</property>
@ -563,7 +563,7 @@
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
<property name="activates_default">True</property>
</widget>
<packing>
<property name="left_attach">1</property>
@ -583,7 +583,7 @@
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
<property name="activates_default">True</property>
</widget>
<packing>
<property name="left_attach">1</property>
@ -839,7 +839,7 @@
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
<property name="activates_default">True</property>
</widget>
<packing>
<property name="left_attach">1</property>
@ -859,7 +859,7 @@
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
<property name="activates_default">True</property>
</widget>
<packing>
<property name="left_attach">1</property>

View File

@ -30,5 +30,5 @@
(define-method get_actions
(of-object "MooFileView")
(c-name "moo_file_view_get_actions")
(return-type "GtkActionGroup*")
(return-type "MooActionCollection*")
)

View File

@ -21,7 +21,7 @@ class ActionFactory(object):
self.fake_props = {}
for key in kwargs.keys():
if key in ["callback", "display_name", "accel", "no_accel"]:
if key in ["callback"]:
self.fake_props[key] = kwargs[key]
elif kwargs[key] is not None or key not in ["stock_id"]:
self.props[key] = kwargs[key]
@ -29,10 +29,10 @@ class ActionFactory(object):
def __call__(self, window):
self.window = window
if _gtk.check_version(2, 8, 0):
action = _gtk.Action(self.id, None, None, None)
action = Action(self.id)
self.set_props(action)
else:
action = _gobject.new(_gtk.Action, name=self.id, **self.props)
action = _gobject.new(Action, name=self.id, **self.props)
self.set_fake_props(action)
return action
@ -40,12 +40,6 @@ class ActionFactory(object):
for key in self.fake_props.keys():
if key == "callback":
action.connect("activate", _activate, self.fake_props[key], self.window)
elif key == "display_name":
action_set_display_name(action, self.fake_props[key])
elif key == "accel":
action_set_default_accel(action, self.fake_props[key])
elif key == "no_accel":
action_set_no_accel(action, self.fake_props[key])
else:
raise ValueError("unknown property " + key)
@ -55,8 +49,8 @@ class ActionFactory(object):
def window_class_add_action(klass, action_id, **kwargs):
def window_class_add_action(klass, action_id, group=None, **kwargs):
if kwargs.has_key("factory"):
_utils._window_class_add_action(klass, action_id, kwargs["factory"])
_utils._window_class_add_action(klass, action_id, group, kwargs["factory"])
else:
_utils._window_class_add_action(klass, action_id, ActionFactory(action_id, **kwargs))
_utils._window_class_add_action(klass, action_id, group, ActionFactory(action_id, **kwargs))

View File

@ -126,9 +126,44 @@
)
)
(define-object MenuAction
(define-interface ActionBase
(in-module "Moo")
(c-name "MooActionBase")
(gtype-id "MOO_TYPE_ACTION_BASE")
(prerequisite "GtkAction")
)
(define-object ActionCollection
(in-module "Moo")
(parent "GObject")
(c-name "MooActionCollection")
(gtype-id "MOO_TYPE_ACTION_COLLECTION")
)
(define-object Action
(in-module "Moo")
(parent "GtkAction")
(c-name "MooAction")
(gtype-id "MOO_TYPE_ACTION")
)
(define-object ToggleAction
(in-module "Moo")
(parent "GtkToggleAction")
(c-name "MooToggleAction")
(gtype-id "MOO_TYPE_TOGGLE_ACTION")
)
(define-object RadioAction
(in-module "Moo")
(parent "GtkRadioAction")
(c-name "MooRadioAction")
(gtype-id "MOO_TYPE_RADIO_ACTION")
)
(define-object MenuAction
(in-module "Moo")
(parent "MooAction")
(c-name "MooMenuAction")
(gtype-id "MOO_TYPE_MENU_ACTION")
)
@ -1447,7 +1482,7 @@
(define-method get_actions
(of-object "MooWindow")
(c-name "moo_window_get_actions")
(return-type "GtkActionGroup*")
(return-type "MooActionCollection*")
)
(define-method get_action
@ -1530,7 +1565,7 @@
(parameters
'("MooUIWidgetType" "type")
'("const-char*" "path")
'("GtkActionGroup*" "actions")
'("MooActionCollection*" "actions")
'("GtkAccelGroup*" "accel_group")
)
)
@ -2205,67 +2240,67 @@
;; From ./ggap/moo/mooutils/mooaction.h
(define-function sync_toggle_action
(c-name "moo_sync_toggle_action")
(return-type "none")
(parameters
'("GtkAction*" "action")
'("GObject*" "master")
'("const-char*" "prop")
'("gboolean" "invert" (null-ok) (default "FALSE"))
)
)
(define-function action_set_display_name
(c-name "moo_action_set_display_name")
(return-type "none")
(parameters
'("GtkAction*" "action")
'("const-char*" "name")
)
)
(define-function action_get_display_name
(c-name "moo_action_get_display_name")
(return-type "const-char*")
(parameters
'("GtkAction*" "action")
)
)
(define-function action_set_default_accel
(c-name "moo_action_set_default_accel")
(return-type "none")
(parameters
'("GtkAction*" "action")
'("const-char*" "accel" (null-ok))
)
)
(define-function action_get_default_accel
(c-name "moo_action_get_default_accel")
(return-type "const-char*")
(parameters
'("GtkAction*" "action")
)
)
(define-function action_set_no_accel
(c-name "moo_action_set_no_accel")
(return-type "none")
(parameters
'("GtkAction*" "action")
'("gboolean" "no_accel")
)
)
(define-function action_get_no_accel
(c-name "moo_action_get_no_accel")
(return-type "gboolean")
(parameters
'("GtkAction*" "action")
)
)
;; (define-function sync_toggle_action
;; (c-name "moo_sync_toggle_action")
;; (return-type "none")
;; (parameters
;; '("GtkAction*" "action")
;; '("GObject*" "master")
;; '("const-char*" "prop")
;; '("gboolean" "invert" (null-ok) (default "FALSE"))
;; )
;; )
;;
;; (define-function action_set_display_name
;; (c-name "moo_action_set_display_name")
;; (return-type "none")
;; (parameters
;; '("GtkAction*" "action")
;; '("const-char*" "name")
;; )
;; )
;;
;; (define-function action_get_display_name
;; (c-name "moo_action_get_display_name")
;; (return-type "const-char*")
;; (parameters
;; '("GtkAction*" "action")
;; )
;; )
;;
;; (define-function action_set_default_accel
;; (c-name "moo_action_set_default_accel")
;; (return-type "none")
;; (parameters
;; '("GtkAction*" "action")
;; '("const-char*" "accel" (null-ok))
;; )
;; )
;;
;; (define-function action_get_default_accel
;; (c-name "moo_action_get_default_accel")
;; (return-type "const-char*")
;; (parameters
;; '("GtkAction*" "action")
;; )
;; )
;;
;; (define-function action_set_no_accel
;; (c-name "moo_action_set_no_accel")
;; (return-type "none")
;; (parameters
;; '("GtkAction*" "action")
;; '("gboolean" "no_accel")
;; )
;; )
;;
;; (define-function action_get_no_accel
;; (c-name "moo_action_get_no_accel")
;; (return-type "gboolean")
;; (parameters
;; '("GtkAction*" "action")
;; )
;; )
;; From ../mooutils/mooprefs.h

View File

@ -22,6 +22,7 @@ headers
#include "mooutils/moostock.h"
#include "mooutils/moouixml.h"
#include "mooutils/moomenuaction.h"
#include "mooutils/mooactionbase.h"
#include "mooutils/mooundo.h"
#include "mooutils/mooi18n.h"
#include "moofileview/moofileview.h"
@ -51,6 +52,8 @@ import gtk.gdk.Color as PyGdkColor_Type
import gtk.gdk.Pixbuf as PyGdkPixbuf_Type
import gtk.ActionGroup as PyGtkActionGroup_Type
import gtk.Action as PyGtkAction_Type
import gtk.ToggleAction as PyGtkToggleAction_Type
import gtk.RadioAction as PyGtkRadioAction_Type
import gtk.AccelGroup as PyGtkAccelGroup_Type
%%
ignore-glob
@ -114,19 +117,20 @@ destroy_func_n_args (PyObject *func_n_args)
static PyObject *
_wrap_moo_window_class_add_action (G_GNUC_UNUSED PyObject *self, PyObject *args)
{
PyObject *py_type, *py_id, *py_factory_func, *func_n_args;
PyObject *py_type, *py_id, *py_group, *py_factory_func, *func_n_args;
GType type;
MooWindowClass *klass;
int i, extra;
extra = PyTuple_GET_SIZE (args) - 3;
extra = PyTuple_GET_SIZE (args) - 4;
if (extra < 0)
return_TypeError ("at least three arguments required");
py_type = PyTuple_GET_ITEM (args, 0);
py_id = PyTuple_GET_ITEM (args, 1);
py_factory_func = PyTuple_GET_ITEM (args, 2);
py_group = PyTuple_GET_ITEM (args, 2);
py_factory_func = PyTuple_GET_ITEM (args, 3);
type = pyg_type_from_object (py_type);
@ -139,6 +143,9 @@ _wrap_moo_window_class_add_action (G_GNUC_UNUSED PyObject *self, PyObject *args)
if (!PyString_Check (py_id))
return_TypeError ("id must be a string");
if (py_group != Py_None && !PyString_Check (py_group))
return_TypeError ("group must be a string or None");
if (!PyCallable_Check (py_factory_func))
return_TypeError ("factory_func must be callable");
@ -153,11 +160,12 @@ _wrap_moo_window_class_add_action (G_GNUC_UNUSED PyObject *self, PyObject *args)
for (i = 0; i < extra; ++i)
{
PyTuple_SET_ITEM (PyTuple_GET_ITEM (func_n_args, 1), i + 1,
PyTuple_GET_ITEM (args, i + 3));
Py_INCREF (PyTuple_GET_ITEM (args, i + 3));
PyTuple_GET_ITEM (args, i + 4));
Py_INCREF (PyTuple_GET_ITEM (args, i + 4));
}
moo_window_class_new_action_custom (klass, PyString_AS_STRING (py_id),
py_group == Py_None ? NULL : PyString_AS_STRING (py_group),
(MooWindowActionFunc) py_action_factory_func,
func_n_args, (GDestroyNotify) destroy_func_n_args);

View File

@ -51,27 +51,27 @@ static void moo_term_window_class_init (MooTermWindowClass *klass)
moo_window_class_set_id (window_class, "Terminal", "Terminal");
moo_window_class_new_action (window_class, "Copy",
"stock-display-name", GTK_STOCK_COPY,
"stock-label", GTK_STOCK_COPY,
"stock-tooltip", GTK_STOCK_COPY,
moo_window_class_new_action (window_class, "Copy", NULL,
"display-name", GTK_STOCK_COPY,
"label", GTK_STOCK_COPY,
"tooltip", GTK_STOCK_COPY,
"stock-id", GTK_STOCK_COPY,
"accel", "<alt>C",
"closure-callback", copy_clipboard,
"closure-proxy-func", moo_term_window_get_term,
NULL);
moo_window_class_new_action (window_class, "Paste",
"stock-display-name", GTK_STOCK_PASTE,
"stock-label", GTK_STOCK_PASTE,
"stock-tooltip", GTK_STOCK_PASTE,
moo_window_class_new_action (window_class, "Paste", NULL,
"display-name", GTK_STOCK_PASTE,
"label", GTK_STOCK_PASTE,
"tooltip", GTK_STOCK_PASTE,
"stock-id", GTK_STOCK_PASTE,
"accel", "<alt>V",
"closure-callback", paste_clipboard,
"closure-proxy-func", moo_term_window_get_term,
NULL);
moo_window_class_new_action (window_class, "SelectAll",
moo_window_class_new_action (window_class, "SelectAll", NULL,
"display-name", "Select All",
"label", "Select _All",
"tooltip", "Select all",

View File

@ -23,8 +23,9 @@ gtk_2_4_sources = \
newgtk/gtkfontbutton.h
mooutils_include_headers = \
mooaccelbutton.h \
mooaction.h \
mooactionbase.h \
mooactioncollection.h \
moobigpaned.h \
mooclosure.h \
moocmd.h \
@ -63,10 +64,19 @@ mooutils_sources = \
mooaccel.c \
mooaccelbutton-glade.h \
mooaccelbutton.c \
mooaccelbutton.h \
mooaccelprefs.h \
mooaccelprefs.c \
mooaccelprefs-glade.h \
mooaction.c \
mooaction-private.h \
mooactionbase.c \
mooactionbase-private.h \
mooactioncollection.c \
mooactionfactory.h \
mooactionfactory.c \
mooactiongroup.h \
mooactiongroup.c \
moobigpaned.c \
mooclosure.c \
moocmd.c \

View File

@ -86,7 +86,7 @@
<widget class="GtkScrolledWindow" id="scrolledwindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
<property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
@ -355,81 +355,6 @@
<property name="visible">True</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
<widget class="GtkButton" id="reset">
<property name="visible">True</property>
<property name="can_default">True</property>
<property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="response_id">-2</property>
<child>
<widget class="GtkAlignment" id="alignment31">
<property name="visible">True</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<property name="top_padding">0</property>
<property name="bottom_padding">0</property>
<property name="left_padding">0</property>
<property name="right_padding">0</property>
<child>
<widget class="GtkHBox" id="hbox12">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">2</property>
<child>
<widget class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-refresh</property>
<property name="icon_size">4</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label67">
<property name="visible">True</property>
<property name="label" translatable="yes">Set _Defaults</property>
<property name="use_underline">True</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
</child>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkButton" id="cancel">
<property name="visible">True</property>

View File

@ -0,0 +1,60 @@
/*
* mooaction-private.h
*
* Copyright (C) 2004-2006 by Yevgen Muntyan <muntyan@math.tamu.edu>
*
* 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.
*
* See COPYING file that comes with this distribution.
*/
#ifndef __MOO_ACTION_PRIVATE_H__
#define __MOO_ACTION_PRIVATE_H__
#include <mooutils/mooaction.h>
#include <mooutils/mooclosure.h>
#include <gtk/gtkactiongroup.h>
G_BEGIN_DECLS
void _moo_action_set_closure (MooAction *action,
MooClosure *closure);
typedef void (*MooToggleActionCallback) (gpointer data,
gboolean active);
void _moo_toggle_action_set_callback (MooToggleAction *action,
MooToggleActionCallback callback,
gpointer data,
gboolean object);
void _moo_sync_toggle_action (GtkAction *action,
gpointer master,
const char *prop,
gboolean invert);
/* defined in mooactionbase.c */
gboolean _moo_action_get_dead (gpointer action);
gboolean _moo_action_get_has_submenu (gpointer action);
const char *_moo_action_get_display_name (gpointer action);
GtkActionGroup *_moo_action_get_group (gpointer action);
void _moo_action_set_no_accel (gpointer action,
gboolean no_accel);
gboolean _moo_action_get_no_accel (gpointer action);
char *_moo_action_make_accel_path (gpointer action);
void _moo_action_set_accel_path (gpointer action,
const char *accel_path);
const char *_moo_action_get_accel_path (gpointer action);
const char *_moo_action_get_default_accel (gpointer action);
void _moo_action_set_default_accel (gpointer action,
const char *accel);
G_END_DECLS
#endif /* __MOO_ACTION_PRIVATE_H__ */

View File

@ -11,270 +11,521 @@
* See COPYING file that comes with this distribution.
*/
#include "mooutils/mooaction.h"
#include "mooutils/mooaction-private.h"
#include "mooutils/mooactionbase-private.h"
#include "mooutils/mooutils-gobject.h"
#include "mooutils/mooaccel.h"
#include <gtk/gtktoggleaction.h>
#include <string.h>
static void
set_bool (gpointer object,
const char *key,
gboolean value)
{
g_object_set_data (object, key, GINT_TO_POINTER (value));
#define DEFINE_ACTION_TYPE(TypeName, type_name, TYPE_PARENT) \
\
static void type_name##_init (TypeName *self); \
static void type_name##_class_init (TypeName##Class *klass); \
static void type_name##_set_property (GObject *object, \
guint property_id, \
const GValue *value, \
GParamSpec *pspec); \
static void type_name##_get_property (GObject *object, \
guint property_id, \
GValue *value, \
GParamSpec *pspec); \
static gpointer type_name##_parent_class = NULL; \
\
static void \
type_name##_class_intern_init (gpointer klass) \
{ \
GObjectClass *object_class = G_OBJECT_CLASS (klass); \
\
object_class->set_property = type_name##_set_property; \
object_class->get_property = type_name##_get_property; \
_moo_action_base_init_class (object_class); \
\
type_name##_parent_class = g_type_class_peek_parent (klass); \
type_name##_class_init ((TypeName##Class*) klass); \
} \
\
GType \
type_name##_get_type (void) \
{ \
static GType type; \
\
if (!type) \
{ \
static const GTypeInfo info = { \
sizeof (TypeName##Class), \
(GBaseInitFunc) NULL, \
(GBaseFinalizeFunc) NULL, \
(GClassInitFunc) type_name##_class_intern_init, \
(GClassFinalizeFunc) NULL, \
NULL, /* class_data */ \
sizeof (TypeName), \
0, /* n_preallocs */ \
(GInstanceInitFunc) type_name##_init, \
NULL /* value_table */ \
}; \
\
static const GInterfaceInfo iface_info; \
\
type = g_type_register_static (TYPE_PARENT, \
#TypeName, \
&info, 0); \
g_type_add_interface_static (type, \
MOO_TYPE_ACTION_BASE, \
&iface_info); \
} \
\
return type; \
}
static gboolean
get_bool (gpointer object,
const char *key)
DEFINE_ACTION_TYPE (MooAction, moo_action, GTK_TYPE_ACTION)
DEFINE_ACTION_TYPE (MooToggleAction, moo_toggle_action, GTK_TYPE_TOGGLE_ACTION)
DEFINE_ACTION_TYPE (MooRadioAction, moo_radio_action, GTK_TYPE_RADIO_ACTION)
/*****************************************************************************/
/* MooAction
*/
struct _MooActionPrivate {
MooClosure *closure;
};
enum {
MOO_ACTION_BASE_PROPS(ACTION),
ACTION_PROP_CLOSURE,
ACTION_PROP_CLOSURE_OBJECT,
ACTION_PROP_CLOSURE_SIGNAL,
ACTION_PROP_CLOSURE_CALLBACK,
ACTION_PROP_CLOSURE_PROXY_FUNC
};
static void
moo_action_init (MooAction *action)
{
return g_object_get_data (object, key) != NULL;
action->priv = g_new0 (MooActionPrivate, 1);
}
static void
set_string (gpointer object,
const char *key,
const char *value)
moo_action_dispose (GObject *object)
{
if (value)
g_object_set_data_full (object, key, g_strdup (value), g_free);
else
g_object_set_data (object, key, NULL);
}
MooAction *action = MOO_ACTION (object);
static const char *
get_string (gpointer object,
const char *key)
{
return g_object_get_data (object, key);
}
void
moo_action_set_no_accel (GtkAction *action,
gboolean no_accel)
{
g_return_if_fail (GTK_IS_ACTION (action));
set_bool (action, "moo-action-no-accel", no_accel);
}
gboolean
moo_action_get_no_accel (GtkAction *action)
{
g_return_val_if_fail (GTK_IS_ACTION (action), FALSE);
return get_bool (action, "moo-action-no-accel");
}
void
_moo_action_set_force_accel_label (GtkAction *action,
gboolean force)
{
g_return_if_fail (GTK_IS_ACTION (action));
set_bool (action, "moo-action-force-accel-label", force);
}
gboolean
_moo_action_get_force_accel_label (GtkAction *action)
{
g_return_val_if_fail (GTK_IS_ACTION (action), FALSE);
return get_bool (action, "moo-action-force-accel-label");
}
const char *
moo_action_get_default_accel (GtkAction *action)
{
const char *accel;
g_return_val_if_fail (GTK_IS_ACTION (action), "");
accel = get_string (action, "moo-action-default-accel");
return accel ? accel : "";
}
void
moo_action_set_default_accel (GtkAction *action,
const char *accel)
{
char *norm;
g_return_if_fail (GTK_IS_ACTION (action));
if (!accel || !accel[0])
if (action->priv->closure)
{
set_string (action, "moo-action-default-accel", accel);
return;
moo_closure_unref (action->priv->closure);
action->priv->closure = NULL;
}
norm = _moo_accel_normalize (accel);
set_string (action, "moo-action-default-accel", norm);
g_free (norm);
}
void
_moo_action_set_accel_path (GtkAction *action,
const char *accel_path)
{
g_return_if_fail (GTK_IS_ACTION (action));
set_string (action, "moo-action-accel-path", accel_path);
if (!moo_action_get_no_accel (action))
gtk_action_set_accel_path (action, accel_path);
}
const char *
_moo_action_get_accel_path (GtkAction *action)
{
g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
return get_string (action, "moo-action-accel-path");
}
const char *
_moo_action_get_accel (GtkAction *action)
{
const char *path;
g_return_val_if_fail (GTK_IS_ACTION (action), "");
path = _moo_action_get_accel_path (action);
if (path)
return _moo_get_accel (path);
else
return "";
}
const char *
_moo_action_make_accel_path (const char *group_id,
const char *action_id)
{
static GString *path = NULL;
g_return_val_if_fail (action_id != NULL && action_id[0] != 0, NULL);
if (!path)
path = g_string_new (NULL);
if (group_id && group_id[0])
g_string_printf (path, "<MooAction>/%s/%s", group_id, action_id);
else
g_string_printf (path, "<MooAction>/%s", action_id);
return path->str;
}
const char *
moo_action_get_display_name (GtkAction *action)
{
const char *name;
g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
name = get_string (action, "moo-action-display-name");
return name ? name : gtk_action_get_name (action);
}
void
moo_action_set_display_name (GtkAction *action,
const char *name)
{
g_return_if_fail (GTK_IS_ACTION (action));
set_string (action, "moo-action-display-name", name);
}
gboolean
_moo_action_get_dead (GtkAction *action)
{
g_return_val_if_fail (GTK_IS_ACTION (action), TRUE);
return get_bool (action, "moo-action-dead");
}
void
_moo_action_set_dead (GtkAction *action,
gboolean dead)
{
g_return_if_fail (GTK_IS_ACTION (action));
set_bool (action, "moo-action-dead", dead);
}
gboolean
_moo_action_get_has_submenu (GtkAction *action)
{
g_return_val_if_fail (GTK_IS_ACTION (action), TRUE);
return get_bool (action, "moo-action-has-submenu");
}
void
_moo_action_set_has_submenu (GtkAction *action,
gboolean has_submenu)
{
g_return_if_fail (GTK_IS_ACTION (action));
set_bool (action, "moo-action-has-submenu", has_submenu);
G_OBJECT_CLASS (moo_action_parent_class)->dispose (object);
}
static void
moo_action_activate (GtkAction *action)
moo_action_activate (GtkAction *gtkaction)
{
MooClosure *closure = _moo_action_get_closure (action);
MooAction *action = MOO_ACTION (gtkaction);
if (action->priv->closure)
moo_closure_invoke (action->priv->closure);
}
static GObject *
moo_action_constructor (GType type,
guint n_props,
GObjectConstructParam *props)
{
guint i;
GObject *object;
MooClosure *closure = NULL;
gpointer closure_object = NULL;
const char *closure_signal = NULL;
GCallback closure_callback = NULL;
GCallback closure_proxy_func = NULL;
for (i = 0; i < n_props; ++i)
{
const char *name = props[i].pspec->name;
GValue *value = props[i].value;
if (!strcmp (name, "closure-object"))
closure_object = g_value_get_object (value);
else if (!strcmp (name, "closure-signal"))
closure_signal = g_value_get_string (value);
else if (!strcmp (name, "closure-callback"))
closure_callback = g_value_get_pointer (value);
else if (!strcmp (name, "closure-proxy-func"))
closure_proxy_func = g_value_get_pointer (value);
}
if (closure_callback || closure_signal)
{
if (closure_object)
{
closure = moo_closure_new_simple (closure_object, closure_signal,
closure_callback, closure_proxy_func);
moo_closure_ref_sink (closure);
}
else
g_critical ("%s: closure data missing", G_STRLOC);
}
object = G_OBJECT_CLASS(moo_action_parent_class)->constructor (type, n_props, props);
if (closure)
moo_closure_invoke (closure);
{
_moo_action_set_closure (MOO_ACTION (object), closure);
moo_closure_unref (closure);
}
return object;
}
static void
moo_action_class_init (MooActionClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkActionClass *action_class = GTK_ACTION_CLASS (klass);
object_class->dispose = moo_action_dispose;
object_class->constructor = moo_action_constructor;
action_class->activate = moo_action_activate;
g_object_class_install_property (object_class, ACTION_PROP_CLOSURE,
g_param_spec_boxed ("closure", "closure", "closure",
MOO_TYPE_CLOSURE,
G_PARAM_READWRITE));
g_object_class_install_property (object_class, ACTION_PROP_CLOSURE_OBJECT,
g_param_spec_object ("closure-object", "closure-object", "closure-object",
G_TYPE_OBJECT, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, ACTION_PROP_CLOSURE_SIGNAL,
g_param_spec_string ("closure-signal", "closure-signal", "closure-signal",
NULL, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, ACTION_PROP_CLOSURE_CALLBACK,
g_param_spec_pointer ("closure-callback", "closure-callback", "closure-callback",
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, ACTION_PROP_CLOSURE_PROXY_FUNC,
g_param_spec_pointer ("closure-proxy-func", "closure-proxy-func", "closure-proxy-func",
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
}
static void
moo_action_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
MooAction *action = MOO_ACTION (object);
switch (property_id)
{
case ACTION_PROP_CLOSURE:
_moo_action_set_closure (action, g_value_get_boxed (value));
break;
case ACTION_PROP_CLOSURE_OBJECT:
case ACTION_PROP_CLOSURE_SIGNAL:
case ACTION_PROP_CLOSURE_CALLBACK:
case ACTION_PROP_CLOSURE_PROXY_FUNC:
/* these are handled in the constructor */
break;
MOO_ACTION_BASE_SET_PROPERTY (ACTION);
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
moo_action_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
MooAction *action = MOO_ACTION (object);
switch (property_id)
{
case ACTION_PROP_CLOSURE:
g_value_set_boxed (value, action->priv->closure);
break;
MOO_ACTION_BASE_GET_PROPERTY (ACTION);
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
void
_moo_action_set_closure (GtkAction *action,
_moo_action_set_closure (MooAction *action,
MooClosure *closure)
{
g_return_if_fail (GTK_IS_ACTION (action));
g_return_if_fail (MOO_IS_ACTION (action));
if (closure == action->priv->closure)
return;
if (action->priv->closure)
moo_closure_unref (action->priv->closure);
if (closure)
{
moo_closure_ref_sink (closure);
g_object_set_data_full (G_OBJECT (action), "moo-action-closure",
closure, (GDestroyNotify) moo_closure_unref);
if (!g_signal_handler_find (action, G_SIGNAL_MATCH_FUNC,
0, 0, 0, moo_action_activate, NULL))
g_signal_connect (action, "activate",
G_CALLBACK (moo_action_activate),
NULL);
action->priv->closure = closure;
g_object_notify (G_OBJECT (action), "closure");
}
/*****************************************************************************/
/* MooToggleAction
*/
struct _MooToggleActionPrivate {
MooToggleActionCallback callback;
MooObjectPtr *ptr;
gpointer data;
};
enum {
MOO_ACTION_BASE_PROPS(TOGGLE_ACTION),
TOGGLE_ACTION_PROP_TOGGLED_CALLBACK,
TOGGLE_ACTION_PROP_TOGGLED_OBJECT,
TOGGLE_ACTION_PROP_TOGGLED_DATA
};
static void
moo_toggle_action_init (MooToggleAction *action)
{
action->priv = g_new0 (MooToggleActionPrivate, 1);
}
static void
moo_toggle_action_dispose (GObject *object)
{
MooToggleAction *action = MOO_TOGGLE_ACTION (object);
if (action->priv->ptr)
{
moo_object_ptr_free (action->priv->ptr);
action->priv->ptr = NULL;
}
G_OBJECT_CLASS (moo_toggle_action_parent_class)->dispose (object);
}
static void
moo_toggle_action_toggled (GtkToggleAction *gtkaction)
{
MooToggleAction *action = MOO_TOGGLE_ACTION (gtkaction);
if (action->priv->callback)
{
if (MOO_OBJECT_PTR_GET (action->priv->ptr))
{
GObject *obj = MOO_OBJECT_PTR_GET (action->priv->ptr);
g_object_ref (obj);
action->priv->callback (obj, gtk_toggle_action_get_active (gtkaction));
g_object_unref (obj);
}
else
{
g_object_set_data (G_OBJECT (action), "moo-action-closure", NULL);
action->priv->callback (action->priv->data, gtk_toggle_action_get_active (gtkaction));
}
}
}
MooClosure *
_moo_action_get_closure (GtkAction *action)
static GObject *
moo_toggle_action_constructor (GType type,
guint n_props,
GObjectConstructParam *props)
{
g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
return g_object_get_data (G_OBJECT (action), "moo-action-closure");
guint i;
GObject *object;
MooToggleAction *action;
MooToggleActionCallback toggled_callback = NULL;
gpointer toggled_data = NULL;
gpointer toggled_object = NULL;
for (i = 0; i < n_props; ++i)
{
const char *name = props[i].pspec->name;
GValue *value = props[i].value;
if (!strcmp (name, "toggled-callback"))
toggled_callback = g_value_get_pointer (value);
else if (!strcmp (name, "toggled-data"))
toggled_data = g_value_get_pointer (value);
else if (!strcmp (name, "toggled-object"))
toggled_object = g_value_get_object (value);
}
object = G_OBJECT_CLASS(moo_toggle_action_parent_class)->constructor (type, n_props, props);
action = MOO_TOGGLE_ACTION (object);
if (toggled_callback)
{
if (toggled_object)
_moo_toggle_action_set_callback (action, toggled_callback, toggled_object, TRUE);
else
_moo_toggle_action_set_callback (action, toggled_callback, toggled_data, FALSE);
}
return object;
}
void
_moo_toggle_action_set_callback (MooToggleAction *action,
MooToggleActionCallback callback,
gpointer data,
gboolean object)
{
g_return_if_fail (MOO_IS_TOGGLE_ACTION (action));
g_return_if_fail (!object || G_IS_OBJECT (data));
action->priv->callback = callback;
if (action->priv->ptr)
moo_object_ptr_free (action->priv->ptr);
action->priv->ptr = NULL;
action->priv->data = NULL;
if (callback)
{
if (object)
action->priv->ptr = moo_object_ptr_new (data, NULL, NULL);
else
action->priv->data = data;
}
}
static void
moo_toggle_action_class_init (MooToggleActionClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkToggleActionClass *action_class = GTK_TOGGLE_ACTION_CLASS (klass);
object_class->dispose = moo_toggle_action_dispose;
object_class->constructor = moo_toggle_action_constructor;
action_class->toggled = moo_toggle_action_toggled;
g_object_class_install_property (object_class, TOGGLE_ACTION_PROP_TOGGLED_CALLBACK,
g_param_spec_pointer ("toggled-callback", "toggled-callback", "toggled-callback",
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, TOGGLE_ACTION_PROP_TOGGLED_OBJECT,
g_param_spec_object ("toggled-object", "toggled-object", "toggled-object",
G_TYPE_OBJECT, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, TOGGLE_ACTION_PROP_TOGGLED_DATA,
g_param_spec_pointer ("toggled-data", "toggled-data", "toggled-data",
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
}
static void
moo_toggle_action_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
switch (property_id)
{
case TOGGLE_ACTION_PROP_TOGGLED_CALLBACK:
case TOGGLE_ACTION_PROP_TOGGLED_OBJECT:
case TOGGLE_ACTION_PROP_TOGGLED_DATA:
/* these are handled in the constructor */
break;
MOO_ACTION_BASE_SET_PROPERTY (TOGGLE_ACTION);
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
moo_toggle_action_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
switch (property_id)
{
MOO_ACTION_BASE_GET_PROPERTY (TOGGLE_ACTION);
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
/*****************************************************************************/
/* MooRadioAction
*/
enum {
MOO_ACTION_BASE_PROPS(RADIO_ACTION)
};
static void
moo_radio_action_init (G_GNUC_UNUSED MooRadioAction *action)
{
}
static void
moo_radio_action_class_init (G_GNUC_UNUSED MooRadioActionClass *klass)
{
}
static void
moo_radio_action_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
switch (property_id)
{
MOO_ACTION_BASE_SET_PROPERTY (RADIO_ACTION);
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
moo_radio_action_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
switch (property_id)
{
MOO_ACTION_BASE_GET_PROPERTY (RADIO_ACTION);
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
/**************************************************************************/
/* moo_sync_toggle_action
/* _moo_sync_toggle_action
*/
typedef struct {
@ -356,7 +607,7 @@ toggle_watch_destroy (MooObjectWatch *watch)
void
moo_sync_toggle_action (GtkAction *action,
_moo_sync_toggle_action (GtkAction *action,
gpointer master,
const char *prop,
gboolean invert)
@ -388,9 +639,9 @@ prop_changed (ToggleWatch *watch)
active = gtk_toggle_action_get_active (action);
if (!watch->invert)
equal = ((value && active) || (!value && !active));
equal = !value == !active;
else
equal = ((!value && active) || (value && !active));
equal = !value != !active;
if (!equal)
gtk_toggle_action_set_active (action, watch->invert ? !value : value);
@ -411,9 +662,9 @@ action_toggled (ToggleWatch *watch)
active = gtk_toggle_action_get_active (action);
if (!watch->invert)
equal = ((value && active) || (!value && !active));
equal = !value == !active;
else
equal = ((!value && active) || (value && !active));
equal = !value != !active;
if (!equal)
g_object_set (MOO_OBJECT_PTR_GET (watch->parent.source),

View File

@ -14,52 +14,75 @@
#ifndef __MOO_ACTION_H__
#define __MOO_ACTION_H__
#include <gtk/gtkactiongroup.h>
#include <mooutils/mooclosure.h>
#include <gtk/gtkradioaction.h>
G_BEGIN_DECLS
const char *moo_action_get_display_name (GtkAction *action);
void moo_action_set_display_name (GtkAction *action,
const char *name);
#define MOO_TYPE_ACTION (moo_action_get_type ())
#define MOO_ACTION(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_ACTION, MooAction))
#define MOO_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_ACTION, MooActionClass))
#define MOO_IS_ACTION(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_ACTION))
#define MOO_IS_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_ACTION))
#define MOO_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_ACTION, MooActionClass))
const char *moo_action_get_default_accel (GtkAction *action);
void moo_action_set_default_accel (GtkAction *action,
const char *accel);
typedef struct _MooAction MooAction;
typedef struct _MooActionPrivate MooActionPrivate;
typedef struct _MooActionClass MooActionClass;
void moo_action_set_no_accel (GtkAction *action,
gboolean no_accel);
gboolean moo_action_get_no_accel (GtkAction *action);
struct _MooAction {
GtkAction base;
MooActionPrivate *priv;
};
void moo_sync_toggle_action (GtkAction *action,
gpointer master,
const char *prop,
gboolean invert);
struct _MooActionClass {
GtkActionClass base_class;
};
void _moo_action_set_force_accel_label (GtkAction *action,
gboolean force);
gboolean _moo_action_get_force_accel_label (GtkAction *action);
void _moo_action_set_accel_path (GtkAction *action,
const char *accel_path);
const char *_moo_action_get_accel_path (GtkAction *action);
const char *_moo_action_get_accel (GtkAction *action);
#define MOO_TYPE_TOGGLE_ACTION (moo_toggle_action_get_type ())
#define MOO_TOGGLE_ACTION(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_TOGGLE_ACTION, MooToggleAction))
#define MOO_TOGGLE_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_TOGGLE_ACTION, MooToggleActionClass))
#define MOO_IS_TOGGLE_ACTION(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_TOGGLE_ACTION))
#define MOO_IS_TOGGLE_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_TOGGLE_ACTION))
#define MOO_TOGGLE_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_TOGGLE_ACTION, MooToggleActionClass))
const char *_moo_action_make_accel_path (const char *group_id,
const char *action_id);
typedef struct _MooToggleAction MooToggleAction;
typedef struct _MooToggleActionPrivate MooToggleActionPrivate;
typedef struct _MooToggleActionClass MooToggleActionClass;
gboolean _moo_action_get_dead (GtkAction *action);
void _moo_action_set_dead (GtkAction *action,
gboolean dead);
struct _MooToggleAction {
GtkToggleAction base;
MooToggleActionPrivate *priv;
};
gboolean _moo_action_get_has_submenu (GtkAction *action);
void _moo_action_set_has_submenu (GtkAction *action,
gboolean dead);
struct _MooToggleActionClass {
GtkToggleActionClass base_class;
};
void _moo_action_set_closure (GtkAction *action,
MooClosure *closure);
MooClosure *_moo_action_get_closure (GtkAction *action);
#define MOO_TYPE_RADIO_ACTION (moo_radio_action_get_type ())
#define MOO_RADIO_ACTION(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_RADIO_ACTION, MooRadioAction))
#define MOO_RADIO_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_RADIO_ACTION, MooRadioActionClass))
#define MOO_IS_RADIO_ACTION(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_RADIO_ACTION))
#define MOO_IS_RADIO_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_RADIO_ACTION))
#define MOO_RADIO_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_RADIO_ACTION, MooRadioActionClass))
typedef struct _MooRadioAction MooRadioAction;
typedef struct _MooRadioActionClass MooRadioActionClass;
struct _MooRadioAction {
GtkRadioAction base;
};
struct _MooRadioActionClass {
GtkRadioActionClass base_class;
};
GType moo_action_get_type (void) G_GNUC_CONST;
GType moo_toggle_action_get_type (void) G_GNUC_CONST;
GType moo_radio_action_get_type (void) G_GNUC_CONST;
G_END_DECLS

View File

@ -0,0 +1,66 @@
/*
* mooactionbase-private.h
*
* Copyright (C) 2004-2006 by Yevgen Muntyan <muntyan@math.tamu.edu>
*
* 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.
*
* See COPYING file that comes with this distribution.
*/
#ifndef __MOO_ACTION_BASE_PRIVATE_H__
#define __MOO_ACTION_BASE_PRIVATE_H__
#include <mooutils/mooactionbase.h>
G_BEGIN_DECLS
#define MOO_ACTION_BASE_PROPS(prefix) \
prefix##_PROP_0, \
prefix##_PROP_DISPLAY_NAME, \
prefix##_PROP_ACCEL, \
prefix##_PROP_NO_ACCEL, \
prefix##_PROP_FORCE_ACCEL_LABEL, \
prefix##_PROP_DEAD, \
prefix##_PROP_ACTIVE, \
prefix##_PROP_HAS_SUBMENU, \
/* these are overridden GtkAction properties */ \
prefix##_PROP_LABEL, \
prefix##_PROP_TOOLTIP
#define MOO_ACTION_BASE_SET_GET_PROPERTY(prefix,func) \
case prefix##_PROP_DISPLAY_NAME: \
case prefix##_PROP_ACCEL: \
case prefix##_PROP_NO_ACCEL: \
case prefix##_PROP_FORCE_ACCEL_LABEL: \
case prefix##_PROP_DEAD: \
case prefix##_PROP_ACTIVE: \
case prefix##_PROP_HAS_SUBMENU: \
case prefix##_PROP_LABEL: \
case prefix##_PROP_TOOLTIP: \
func (object, property_id, value, pspec); \
break
#define MOO_ACTION_BASE_SET_PROPERTY(prefix) MOO_ACTION_BASE_SET_GET_PROPERTY(prefix, _moo_action_base_set_property)
#define MOO_ACTION_BASE_GET_PROPERTY(prefix) MOO_ACTION_BASE_SET_GET_PROPERTY(prefix, _moo_action_base_get_property)
void _moo_action_base_init_class (GObjectClass *klass);
void _moo_action_base_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec);
void _moo_action_base_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec);
G_END_DECLS
#endif /* __MOO_ACTION_BASE_PRIVATE_H__ */

View File

@ -0,0 +1,516 @@
/*
* mooactionbase.c
*
* Copyright (C) 2004-2006 by Yevgen Muntyan <muntyan@math.tamu.edu>
*
* 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.
*
* See COPYING file that comes with this distribution.
*/
#include "mooutils/mooactionbase-private.h"
#include "mooutils/mooaction-private.h"
#include "mooutils/mooactiongroup.h"
#include <gtk/gtkaction.h>
#include <gtk/gtkstock.h>
#include <string.h>
enum {
MOO_ACTION_BASE_PROPS(MOO_ACTION_BASE)
};
static void
moo_action_base_class_init (gpointer g_iface)
{
g_object_interface_install_property (g_iface,
g_param_spec_string ("display-name", "display-name", "display-name",
NULL,
G_PARAM_READWRITE));
g_object_interface_install_property (g_iface,
g_param_spec_string ("accel", "accel", "accel",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_interface_install_property (g_iface,
g_param_spec_boolean ("no-accel", "no-accel", "no-accel",
FALSE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_interface_install_property (g_iface,
g_param_spec_boolean ("force-accel-label", "force-accel-label", "force-accel-label",
FALSE,
G_PARAM_READWRITE));
g_object_interface_install_property (g_iface,
g_param_spec_boolean ("dead", "dead", "dead",
FALSE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_interface_install_property (g_iface,
g_param_spec_boolean ("active", "active", "active",
TRUE,
G_PARAM_WRITABLE));
g_object_interface_install_property (g_iface,
g_param_spec_boolean ("has-submenu", "has-submenu", "has-submenu",
FALSE,
G_PARAM_READWRITE));
}
void
_moo_action_base_init_class (GObjectClass *klass)
{
g_object_class_install_property (klass, MOO_ACTION_BASE_PROP_DISPLAY_NAME,
g_param_spec_string ("display-name", "display-name", "display-name",
NULL,
G_PARAM_READWRITE));
g_object_class_install_property (klass, MOO_ACTION_BASE_PROP_ACCEL,
g_param_spec_string ("accel", "accel", "accel",
NULL,
G_PARAM_READWRITE));
g_object_class_install_property (klass, MOO_ACTION_BASE_PROP_NO_ACCEL,
g_param_spec_boolean ("no-accel", "no-accel", "no-accel",
FALSE,
G_PARAM_READWRITE));
g_object_class_install_property (klass, MOO_ACTION_BASE_PROP_FORCE_ACCEL_LABEL,
g_param_spec_boolean ("force-accel-label", "force-accel-label", "force-accel-label",
FALSE,
G_PARAM_READWRITE));
g_object_class_install_property (klass, MOO_ACTION_BASE_PROP_DEAD,
g_param_spec_boolean ("dead", "dead", "dead",
FALSE,
G_PARAM_READWRITE));
g_object_class_install_property (klass, MOO_ACTION_BASE_PROP_ACTIVE,
g_param_spec_boolean ("active", "active", "active",
TRUE,
G_PARAM_WRITABLE));
g_object_class_install_property (klass, MOO_ACTION_BASE_PROP_HAS_SUBMENU,
g_param_spec_boolean ("has-submenu", "has-submenu", "has-submenu",
FALSE,
G_PARAM_READWRITE));
g_object_class_override_property (klass,
MOO_ACTION_BASE_PROP_LABEL,
"label");
g_object_class_override_property (klass,
MOO_ACTION_BASE_PROP_TOOLTIP,
"tooltip");
}
GType
moo_action_base_get_type (void)
{
static GType type;
if (!type)
{
static const GTypeInfo info = {
sizeof (MooActionBaseClass), /* class_size */
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc) moo_action_base_class_init, /* class_init */
NULL, /* class_finalize */
NULL, /* class_data */
0,
0, /* n_preallocs */
NULL,
NULL
};
type = g_type_register_static (G_TYPE_INTERFACE,
"MooActionBase",
&info, 0);
g_type_interface_add_prerequisite (type, GTK_TYPE_ACTION);
}
return type;
}
static char *
strip_underscore (const char *label)
{
char *stripped, *underscore;
g_return_val_if_fail (label != NULL, NULL);
stripped = g_strdup (label);
underscore = strchr (stripped, '_');
if (underscore)
memmove (underscore, underscore + 1, strlen (underscore + 1) + 1);
return stripped;
}
static void
set_string (gpointer object,
const char *id,
const char *data)
{
g_object_set_data_full (object, id, g_strdup (data), g_free);
}
static const char *
get_string (gpointer object,
const char *id)
{
return g_object_get_data (object, id);
}
static void
set_bool (gpointer object,
const char *id,
gboolean value)
{
g_object_set_data (object, id, GINT_TO_POINTER (value));
}
static gboolean
get_bool (gpointer object,
const char *id)
{
return g_object_get_data (object, id) != NULL;
}
static void
moo_action_base_set_display_name (MooActionBase *ab,
const char *name)
{
GtkStockItem stock_item;
char *freeme = NULL;
g_return_if_fail (MOO_IS_ACTION_BASE (ab));
g_return_if_fail (name != NULL);
if (gtk_stock_lookup (name, &stock_item))
{
freeme = strip_underscore (stock_item.label);
name = freeme;
}
set_string (ab, "moo-action-display-name", name);
g_object_notify (G_OBJECT (ab), "display-name");
g_free (freeme);
}
const char *
_moo_action_get_display_name (gpointer action)
{
const char *display_name;
g_return_val_if_fail (MOO_IS_ACTION_BASE (action), NULL);
display_name = get_string (action, "moo-action-display-name");
if (!display_name)
display_name = gtk_action_get_name (action);
return display_name;
}
static void
moo_action_base_set_accel (MooActionBase *ab,
const char *accel)
{
g_return_if_fail (MOO_IS_ACTION_BASE (ab));
if (accel && !accel[0])
accel = NULL;
set_string (ab, "moo-action-accel", accel);
g_object_notify (G_OBJECT (ab), "accel");
}
static const char *
moo_action_base_get_accel (MooActionBase *ab)
{
const char *accel;
g_return_val_if_fail (MOO_IS_ACTION_BASE (ab), "");
accel = get_string (ab, "moo-action-accel");
if (!accel)
accel = "";
return accel;
}
void
_moo_action_set_no_accel (gpointer action,
gboolean no_accel)
{
g_return_if_fail (MOO_IS_ACTION_BASE (action));
set_bool (action, "moo-action-no-accel", no_accel);
g_object_notify (G_OBJECT (action), "no-accel");
}
gboolean
_moo_action_get_no_accel (gpointer action)
{
g_return_val_if_fail (MOO_IS_ACTION_BASE (action), FALSE);
return get_bool (action, "moo-action-no-accel");
}
static void
moo_action_base_set_force_accel_label (MooActionBase *ab,
gboolean force)
{
g_return_if_fail (MOO_IS_ACTION_BASE (ab));
set_bool (ab, "moo-action-force-accel-label", force);
g_object_notify (G_OBJECT (ab), "force-accel-label");
}
static gboolean
moo_action_base_get_force_accel_label (MooActionBase *ab)
{
g_return_val_if_fail (MOO_IS_ACTION_BASE (ab), FALSE);
return get_bool (ab, "moo-action-force-accel-label");
}
static void
moo_action_base_set_dead (MooActionBase *ab, gboolean dead)
{
g_return_if_fail (MOO_IS_ACTION_BASE (ab));
set_bool (ab, "moo-action-dead", dead);
g_object_notify (G_OBJECT (ab), "dead");
}
gboolean
_moo_action_get_dead (gpointer action)
{
g_return_val_if_fail (MOO_IS_ACTION_BASE (action), FALSE);
return get_bool (action, "moo-action-dead");
}
static void
moo_action_base_set_active (MooActionBase *ab, gboolean active)
{
g_return_if_fail (MOO_IS_ACTION_BASE (ab));
g_object_set (ab, "visible", active, "sensitive", active, NULL);
}
static void
moo_action_base_set_has_submenu (MooActionBase *ab, gboolean has_submenu)
{
g_return_if_fail (MOO_IS_ACTION_BASE (ab));
set_bool (ab, "moo-action-has-submenu", has_submenu);
g_object_notify (G_OBJECT (ab), "has-submenu");
}
gboolean
_moo_action_get_has_submenu (gpointer action)
{
g_return_val_if_fail (MOO_IS_ACTION_BASE (action), FALSE);
return get_bool (action, "moo-action-has-submenu");
}
static void
moo_action_base_set_label (MooActionBase *ab,
const char *label)
{
GtkStockItem stock_item;
g_return_if_fail (MOO_IS_ACTION_BASE (ab));
if (label && gtk_stock_lookup (label, &stock_item))
label = stock_item.label;
g_object_set (G_OBJECT (ab), "GtkAction::label", label, NULL);
}
static void
moo_action_base_set_tooltip (MooActionBase *ab,
const char *tooltip)
{
GtkStockItem stock_item;
char *freeme = NULL;
g_return_if_fail (MOO_IS_ACTION_BASE (ab));
if (tooltip && gtk_stock_lookup (tooltip, &stock_item))
{
freeme = strip_underscore (stock_item.label);
tooltip = freeme;
}
g_object_set (G_OBJECT (ab), "GtkAction::tooltip", tooltip, NULL);
g_free (freeme);
}
void
_moo_action_base_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
MooActionBase *ab = MOO_ACTION_BASE (object);
switch (property_id)
{
case MOO_ACTION_BASE_PROP_DISPLAY_NAME:
moo_action_base_set_display_name (ab, g_value_get_string (value));
break;
case MOO_ACTION_BASE_PROP_ACCEL:
moo_action_base_set_accel (ab, g_value_get_string (value));
break;
case MOO_ACTION_BASE_PROP_NO_ACCEL:
_moo_action_set_no_accel (ab, g_value_get_boolean (value));
break;
case MOO_ACTION_BASE_PROP_FORCE_ACCEL_LABEL:
moo_action_base_set_force_accel_label (ab, g_value_get_boolean (value));
break;
case MOO_ACTION_BASE_PROP_DEAD:
moo_action_base_set_dead (ab, g_value_get_boolean (value));
break;
case MOO_ACTION_BASE_PROP_ACTIVE:
moo_action_base_set_active (ab, g_value_get_boolean (value));
break;
case MOO_ACTION_BASE_PROP_HAS_SUBMENU:
moo_action_base_set_has_submenu (ab, g_value_get_boolean (value));
break;
case MOO_ACTION_BASE_PROP_LABEL:
moo_action_base_set_label (ab, g_value_get_string (value));
break;
case MOO_ACTION_BASE_PROP_TOOLTIP:
moo_action_base_set_tooltip (ab, g_value_get_string (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
void
_moo_action_base_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
MooActionBase *ab = MOO_ACTION_BASE (object);
switch (property_id)
{
case MOO_ACTION_BASE_PROP_DISPLAY_NAME:
g_value_set_string (value, _moo_action_get_display_name (ab));
break;
case MOO_ACTION_BASE_PROP_ACCEL:
g_value_set_string (value, moo_action_base_get_accel (ab));
break;
case MOO_ACTION_BASE_PROP_NO_ACCEL:
g_value_set_boolean (value, _moo_action_get_no_accel (ab));
break;
case MOO_ACTION_BASE_PROP_FORCE_ACCEL_LABEL:
g_value_set_boolean (value, moo_action_base_get_force_accel_label (ab));
break;
case MOO_ACTION_BASE_PROP_DEAD:
g_value_set_boolean (value, _moo_action_get_dead (ab));
break;
case MOO_ACTION_BASE_PROP_HAS_SUBMENU:
g_value_set_boolean (value, _moo_action_get_has_submenu (ab));
break;
case MOO_ACTION_BASE_PROP_LABEL:
g_object_get_property (object, "GtkAction::label", value);
break;
case MOO_ACTION_BASE_PROP_TOOLTIP:
g_object_get_property (object, "GtkAction::tooltip", value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
GtkActionGroup *
_moo_action_get_group (gpointer action)
{
GtkActionGroup *group = NULL;
g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
g_object_get (action, "action-group", &group, NULL);
if (group)
g_object_unref (group);
return group;
}
char *
_moo_action_make_accel_path (gpointer action)
{
GtkActionGroup *group = NULL;
MooActionCollection *collection;
const char *name, *group_name, *collection_name;
g_return_val_if_fail (MOO_IS_ACTION_BASE (action), NULL);
group = _moo_action_get_group (action);
g_return_val_if_fail (MOO_IS_ACTION_GROUP (group), NULL);
collection = _moo_action_group_get_collection (MOO_ACTION_GROUP (group));
g_return_val_if_fail (MOO_IS_ACTION_COLLECTION (collection), NULL);
name = gtk_action_get_name (action);
group_name = gtk_action_group_get_name (group);
collection_name = moo_action_collection_get_name (collection);
g_return_val_if_fail (collection_name != NULL, NULL);
g_return_val_if_fail (name != NULL && name[0] != 0, NULL);
if (group_name)
return g_strdup_printf ("<MooAction>/%s/%s/%s", collection_name, group_name, name);
else
return g_strdup_printf ("<MooAction>/%s/%s", collection_name, name);
}
void
_moo_action_set_accel_path (gpointer action,
const char *accel_path)
{
g_return_if_fail (MOO_IS_ACTION_BASE (action));
gtk_action_set_accel_path (action, accel_path);
}
const char *
_moo_action_get_accel_path (gpointer action)
{
g_return_val_if_fail (MOO_IS_ACTION_BASE (action), NULL);
return gtk_action_get_accel_path (action);
}
const char *
_moo_action_get_default_accel (gpointer action)
{
g_return_val_if_fail (MOO_IS_ACTION_BASE (action), "");
return moo_action_base_get_accel (action);
}
void
_moo_action_set_default_accel (gpointer action,
const char *accel)
{
g_return_if_fail (MOO_IS_ACTION_BASE (action));
moo_action_base_set_accel (action, accel);
}

View File

@ -0,0 +1,40 @@
/*
* mooactionbase.h
*
* Copyright (C) 2004-2006 by Yevgen Muntyan <muntyan@math.tamu.edu>
*
* 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.
*
* See COPYING file that comes with this distribution.
*/
#ifndef __MOO_ACTION_BASE_H__
#define __MOO_ACTION_BASE_H__
#include <glib-object.h>
G_BEGIN_DECLS
#define MOO_TYPE_ACTION_BASE (moo_action_base_get_type ())
#define MOO_ACTION_BASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MOO_TYPE_ACTION_BASE, MooActionBase))
#define MOO_IS_ACTION_BASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MOO_TYPE_ACTION_BASE))
#define MOO_ACTION_BASE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), MOO_TYPE_ACTION_BASE, MooActionBaseClass))
typedef struct _MooActionBase MooActionBase;
typedef struct _MooActionBaseClass MooActionBaseClass;
struct _MooActionBaseClass {
GTypeInterface parent;
};
GType moo_action_base_get_type (void) G_GNUC_CONST;
G_END_DECLS
#endif /* __MOO_ACTION_BASE_H__ */

View File

@ -0,0 +1,284 @@
/*
* mooactioncollection.c
*
* Copyright (C) 2004-2006 by Yevgen Muntyan <muntyan@math.tamu.edu>
*
* 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.
*
* See COPYING file that comes with this distribution.
*/
#include "mooutils/mooactiongroup.h"
#include "mooutils/mooactionbase.h"
#include <string.h>
struct _MooActionCollectionPrivate {
MooActionGroup *default_group;
GHashTable *groups; /* name -> MooActionGroup* */
GSList *groups_list;
char *name;
};
enum {
PROP_0,
PROP_NAME,
PROP_DISPLAY_NAME
};
G_DEFINE_TYPE (MooActionCollection, moo_action_collection, G_TYPE_OBJECT)
static void
moo_action_collection_init (MooActionCollection *coll)
{
coll->priv = g_new0 (MooActionCollectionPrivate, 1);
coll->priv->groups = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
coll->priv->default_group = _moo_action_group_new (coll, NULL, NULL);
coll->priv->groups_list = g_slist_prepend (NULL, coll->priv->default_group);
}
static void
moo_action_collection_dispose (GObject *object)
{
MooActionCollection *coll = MOO_ACTION_COLLECTION (object);
if (coll->priv)
{
g_object_unref (coll->priv->default_group);
g_hash_table_destroy (coll->priv->groups);
g_slist_free (coll->priv->groups_list);
g_free (coll->priv);
}
G_OBJECT_CLASS (moo_action_collection_parent_class)->dispose (object);
}
static void
moo_action_collection_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
MooActionCollection *coll = MOO_ACTION_COLLECTION (object);
char *tmp;
switch (property_id)
{
case PROP_NAME:
tmp = coll->priv->name;
coll->priv->name = g_strdup (g_value_get_string (value));
g_free (tmp);
break;
case PROP_DISPLAY_NAME:
moo_action_collection_set_display_name (coll, g_value_get_string (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
moo_action_collection_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
MooActionCollection *coll = MOO_ACTION_COLLECTION (object);
switch (property_id)
{
case PROP_NAME:
g_value_set_string (value, moo_action_collection_get_name (coll));
break;
case PROP_DISPLAY_NAME:
g_value_set_string (value, moo_action_collection_get_display_name (coll));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
moo_action_collection_class_init (MooActionCollectionClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = moo_action_collection_dispose;
object_class->set_property = moo_action_collection_set_property;
object_class->get_property = moo_action_collection_get_property;
g_object_class_install_property (object_class, PROP_NAME,
g_param_spec_string ("name", "name", "name",
NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, PROP_DISPLAY_NAME,
g_param_spec_string ("display-name", "display-name", "display-name",
NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
}
MooActionCollection *
moo_action_collection_new (const char *name,
const char *display_name)
{
return g_object_new (MOO_TYPE_ACTION_COLLECTION,
"name", name,
"display-name", display_name,
NULL);
}
const char *
moo_action_collection_get_name (MooActionCollection *coll)
{
g_return_val_if_fail (MOO_IS_ACTION_COLLECTION (coll), NULL);
return coll->priv->name;
}
void
moo_action_collection_set_display_name (MooActionCollection *coll,
const char *name)
{
g_return_if_fail (MOO_IS_ACTION_COLLECTION (coll));
_moo_action_group_set_display_name (coll->priv->default_group, name);
}
const char *
moo_action_collection_get_display_name (MooActionCollection *coll)
{
g_return_val_if_fail (MOO_IS_ACTION_COLLECTION (coll), NULL);
return _moo_action_group_get_display_name (coll->priv->default_group);
}
static GtkActionGroup *
get_group (MooActionCollection *coll,
const char *name)
{
if (name)
return g_hash_table_lookup (coll->priv->groups, name);
else
return GTK_ACTION_GROUP (coll->priv->default_group);
}
GtkActionGroup *
moo_action_collection_add_group (MooActionCollection *coll,
const char *name,
const char *display_name)
{
MooActionGroup *group;
g_return_val_if_fail (MOO_IS_ACTION_COLLECTION (coll), NULL);
g_return_val_if_fail (name != NULL, NULL);
g_return_val_if_fail (get_group (coll, name) == NULL, NULL);
group = _moo_action_group_new (coll, name, display_name);
g_hash_table_insert (coll->priv->groups, g_strdup (name), group);
coll->priv->groups_list = g_slist_prepend (coll->priv->groups_list, group);
return GTK_ACTION_GROUP (group);
}
void
moo_action_collection_remove_group (MooActionCollection *coll,
GtkActionGroup *group)
{
const char *name;
g_return_if_fail (MOO_IS_ACTION_COLLECTION (coll));
g_return_if_fail (MOO_IS_ACTION_GROUP (group));
name = gtk_action_group_get_name (group);
g_return_if_fail (name != NULL);
g_return_if_fail (group == get_group (coll, name));
_moo_action_group_set_collection (MOO_ACTION_GROUP (group), NULL);
g_hash_table_remove (coll->priv->groups, name);
coll->priv->groups_list = g_slist_remove (coll->priv->groups_list, group);
}
GtkActionGroup *
moo_action_collection_get_group (MooActionCollection *coll,
const char *name)
{
g_return_val_if_fail (MOO_IS_ACTION_COLLECTION (coll), NULL);
return get_group (coll, name);
}
const GSList *
moo_action_collection_get_groups (MooActionCollection *coll)
{
g_return_val_if_fail (MOO_IS_ACTION_COLLECTION (coll), NULL);
return coll->priv->groups_list;
}
GtkAction *
moo_action_collection_get_action (MooActionCollection *coll,
const char *name)
{
GSList *l;
g_return_val_if_fail (MOO_IS_ACTION_COLLECTION (coll), NULL);
g_return_val_if_fail (name != NULL, NULL);
for (l = coll->priv->groups_list; l != NULL; l = l->next)
{
GtkActionGroup *group = l->data;
GtkAction *action = gtk_action_group_get_action (group, name);
if (name)
return action;
}
return NULL;
}
void
moo_action_collection_remove_action (MooActionCollection *coll,
GtkAction *action)
{
GtkActionGroup *group = NULL;
g_return_if_fail (MOO_IS_ACTION_COLLECTION (coll));
g_return_if_fail (GTK_IS_ACTION (action));
g_object_get (action, "action-group", &group, NULL);
g_return_if_fail (group != NULL);
g_return_if_fail (g_slist_find (coll->priv->groups_list, group) != NULL);
gtk_action_group_remove_action (group, action);
}
GList *
moo_action_collection_list_actions (MooActionCollection *coll)
{
GList *list = NULL;
GSList *l;
g_return_val_if_fail (MOO_IS_ACTION_COLLECTION (coll), NULL);
for (l = coll->priv->groups_list; l != NULL; l = l->next)
{
GtkActionGroup *group = l->data;
list = g_list_concat (list, gtk_action_group_list_actions (group));
}
return list;
}

View File

@ -0,0 +1,72 @@
/*
* mooactioncollection.h
*
* Copyright (C) 2004-2006 by Yevgen Muntyan <muntyan@math.tamu.edu>
*
* 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.
*
* See COPYING file that comes with this distribution.
*/
#ifndef __MOO_ACTION_COLLECTION_H__
#define __MOO_ACTION_COLLECTION_H__
#include <gtk/gtkactiongroup.h>
G_BEGIN_DECLS
#define MOO_TYPE_ACTION_COLLECTION (moo_action_collection_get_type ())
#define MOO_ACTION_COLLECTION(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_ACTION_COLLECTION, MooActionCollection))
#define MOO_ACTION_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_ACTION_COLLECTION, MooActionCollectionClass))
#define MOO_IS_ACTION_COLLECTION(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_ACTION_COLLECTION))
#define MOO_IS_ACTION_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_ACTION_COLLECTION))
#define MOO_ACTION_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_ACTION_COLLECTION, MooActionCollectionClass))
typedef struct _MooActionCollection MooActionCollection;
typedef struct _MooActionCollectionPrivate MooActionCollectionPrivate;
typedef struct _MooActionCollectionClass MooActionCollectionClass;
struct _MooActionCollection {
GObject base;
MooActionCollectionPrivate *priv;
};
struct _MooActionCollectionClass {
GObjectClass base_class;
};
GType moo_action_collection_get_type (void) G_GNUC_CONST;
MooActionCollection *moo_action_collection_new (const char *name,
const char *display_name);
const char *moo_action_collection_get_name (MooActionCollection *coll);
void moo_action_collection_set_display_name (MooActionCollection *coll,
const char *name);
const char *moo_action_collection_get_display_name (MooActionCollection *coll);
GtkActionGroup *moo_action_collection_add_group (MooActionCollection *coll,
const char *name,
const char *display_name);
GtkActionGroup *moo_action_collection_get_group (MooActionCollection *coll,
const char *name);
void moo_action_collection_remove_group (MooActionCollection *coll,
GtkActionGroup *group);
const GSList *moo_action_collection_get_groups (MooActionCollection *coll);
GtkAction *moo_action_collection_get_action (MooActionCollection *coll,
const char *name);
void moo_action_collection_remove_action (MooActionCollection *coll,
GtkAction *action);
GList *moo_action_collection_list_actions (MooActionCollection *coll);
G_END_DECLS
#endif /* __MOO_ACTION_COLLECTION_H__ */

View File

@ -12,11 +12,9 @@
*/
#include "mooutils/mooactionfactory.h"
#include "mooutils/mooaction.h"
#include "mooutils/mooclosure.h"
#include "mooutils/mooutils-gobject.h"
#include "mooutils/mooutils-misc.h"
#include <gtk/gtktoggleaction.h>
#include "mooutils/mooaction.h"
#include "mooutils/mooactionbase.h"
#include <gobject/gvaluecollector.h>
#include <string.h>
@ -24,110 +22,78 @@
G_DEFINE_TYPE(MooActionFactory, moo_action_factory, G_TYPE_OBJECT)
enum {
PROP_DISPLAY_NAME,
PROP_STOCK_LABEL,
PROP_STOCK_DISPLAY_NAME,
PROP_STOCK_TOOLTIP,
PROP_ACCEL,
PROP_NO_ACCEL,
PROP_FORCE_ACCEL_LABEL,
PROP_DEAD,
PROP_HAS_SUBMENU,
PROP_CLOSURE,
PROP_CLOSURE_OBJECT,
PROP_CLOSURE_SIGNAL,
PROP_CLOSURE_CALLBACK,
PROP_CLOSURE_PROXY_FUNC,
PROP_TOGGLED_CALLBACK,
PROP_TOGGLED_OBJECT,
PROP_TOGGLED_DATA,
PROP_LAST
};
static GParamSpec *pspecs[PROP_LAST];
static void
moo_action_factory_finalize (GObject *object)
moo_action_factory_dispose (GObject *object)
{
MooActionFactory *factory = MOO_ACTION_FACTORY (object);
if (factory->real_props)
moo_param_array_free (factory->real_props, factory->n_real_props);
if (factory->fake_props)
moo_param_array_free (factory->fake_props, factory->n_fake_props);
if (factory->props)
{
moo_param_array_free (factory->props, factory->n_props);
factory->props = NULL;
factory->n_props = 0;
}
G_OBJECT_CLASS(moo_action_factory_parent_class)->finalize (object);
G_OBJECT_CLASS(moo_action_factory_parent_class)->dispose (object);
}
static void
moo_action_factory_class_init (MooActionFactoryClass *klass)
{
G_OBJECT_CLASS(klass)->finalize = moo_action_factory_finalize;
G_OBJECT_CLASS(klass)->dispose = moo_action_factory_dispose;
}
static void
moo_action_factory_init (MooActionFactory *factory)
{
factory->action_type = GTK_TYPE_ACTION;
factory->action_type = MOO_TYPE_ACTION;
}
static void
action_init_props (void)
static GtkAction *
moo_action_new_valist (GType action_type,
const char *name,
const char *first_prop_name,
va_list var_args)
{
if (pspecs[0])
return;
MooActionFactory *factory;
GtkAction *action;
pspecs[PROP_DISPLAY_NAME] = g_param_spec_string ("display-name", "display-name", "display-name", NULL, G_PARAM_READWRITE);
pspecs[PROP_STOCK_LABEL] = g_param_spec_string ("stock-label", "stock-label", "stock-label", NULL, G_PARAM_READWRITE);
pspecs[PROP_STOCK_DISPLAY_NAME] = g_param_spec_string ("stock-display-name", "stock-display-name", "stock-display-name", NULL, G_PARAM_READWRITE);
pspecs[PROP_STOCK_TOOLTIP] = g_param_spec_string ("stock-tooltip", "stock-tooltip", "stock-tooltip", NULL, G_PARAM_READWRITE);
g_return_val_if_fail (g_type_is_a (action_type, MOO_TYPE_ACTION_BASE), NULL);
pspecs[PROP_ACCEL] = g_param_spec_string ("accel", "accel", "accel", NULL, G_PARAM_READWRITE);
pspecs[PROP_NO_ACCEL] = g_param_spec_boolean ("no-accel", "no-accel", "no-accel", FALSE, G_PARAM_READWRITE);
pspecs[PROP_FORCE_ACCEL_LABEL] = g_param_spec_boolean ("force-accel-label", "force-accel-label", "force-accel-label", FALSE, G_PARAM_READWRITE);
pspecs[PROP_DEAD] = g_param_spec_boolean ("dead", "dead", "dead", FALSE, G_PARAM_READWRITE);
pspecs[PROP_HAS_SUBMENU] = g_param_spec_boolean ("has-submenu", "has-submenu", "has-submenu", FALSE, G_PARAM_READWRITE);
factory = moo_action_factory_new_valist (action_type, first_prop_name, var_args);
action = moo_action_factory_create_action (factory, NULL, "name", name, NULL);
pspecs[PROP_CLOSURE] = g_param_spec_boxed ("closure", "closure", "closure", MOO_TYPE_CLOSURE, G_PARAM_READWRITE);
pspecs[PROP_CLOSURE_OBJECT] = g_param_spec_object ("closure-object", "closure-object", "closure-object", G_TYPE_OBJECT, G_PARAM_WRITABLE);
pspecs[PROP_CLOSURE_SIGNAL] = g_param_spec_string ("closure-signal", "closure-signal", "closure-signal", NULL, G_PARAM_WRITABLE);
pspecs[PROP_CLOSURE_CALLBACK] = g_param_spec_pointer ("closure-callback", "closure-callback", "closure-callback", G_PARAM_WRITABLE);
pspecs[PROP_CLOSURE_PROXY_FUNC] = g_param_spec_pointer ("closure-proxy-func", "closure-proxy-func", "closure-proxy-func", G_PARAM_WRITABLE);
pspecs[PROP_TOGGLED_CALLBACK] = g_param_spec_pointer ("toggled-callback", "toggled-callback", "toggled-callback", G_PARAM_WRITABLE);
pspecs[PROP_TOGGLED_OBJECT] = g_param_spec_object ("toggled-object", "toggled-object", "toggled-object", G_TYPE_OBJECT, G_PARAM_WRITABLE);
pspecs[PROP_TOGGLED_DATA] = g_param_spec_pointer ("toggled-data", "toggled-data", "toggled-data", G_PARAM_WRITABLE);
g_object_unref (factory);
return action;
}
GtkAction *
moo_action_group_add_action (GtkActionGroup *group,
const char *action_id,
const char *name,
const char *first_prop_name,
...)
{
GtkAction *action;
GType action_type = GTK_TYPE_ACTION;
GType action_type = MOO_TYPE_ACTION;
va_list var_args;
g_return_val_if_fail (GTK_IS_ACTION_GROUP (group), NULL);
va_start (var_args, first_prop_name);
if (first_prop_name && (!strcmp (first_prop_name, "action-type::") ||
!strcmp (first_prop_name, "action-type::")))
if (first_prop_name &&
(!strcmp (first_prop_name, "action-type::") || !strcmp (first_prop_name, "action_type::")))
{
action_type = va_arg (var_args, GType);
g_return_val_if_fail (g_type_is_a (action_type, GTK_TYPE_ACTION), NULL);
g_return_val_if_fail (g_type_is_a (action_type, MOO_TYPE_ACTION_BASE), NULL);
first_prop_name = va_arg (var_args, char*);
}
action = moo_action_new_valist (action_type, action_id, first_prop_name, var_args);
action = moo_action_new_valist (action_type, name, first_prop_name, var_args);
va_end (var_args);
@ -142,15 +108,13 @@ moo_action_group_add_action (GtkActionGroup *group,
static gboolean
collect_valist (GType type,
GParameter **real_props_p,
guint *n_real_props_p,
GParameter **fake_props_p,
guint *n_fake_props_p,
GParameter **props_p,
guint *n_props_p,
const char *first_prop_name,
va_list var_args)
{
GObjectClass *klass;
GArray *real_props, *fake_props;
GArray *props;
const char *prop_name;
g_return_val_if_fail (first_prop_name != NULL, FALSE);
@ -158,8 +122,7 @@ collect_valist (GType type,
klass = g_type_class_ref (type);
g_return_val_if_fail (klass != NULL, FALSE);
real_props = g_array_new (FALSE, TRUE, sizeof (GParameter));
fake_props = g_array_new (FALSE, TRUE, sizeof (GParameter));
props = g_array_new (FALSE, TRUE, sizeof (GParameter));
prop_name = first_prop_name;
while (prop_name)
@ -167,25 +130,16 @@ collect_valist (GType type,
char *error = NULL;
GParameter param;
GParamSpec *pspec;
GArray *add_to = NULL;
if ((pspec = _moo_action_find_fake_property (klass, prop_name)))
{
add_to = fake_props;
}
else if ((pspec = g_object_class_find_property (klass, prop_name)))
{
add_to = real_props;
}
else
pspec = g_object_class_find_property (klass, prop_name);
if (!pspec)
{
g_warning ("%s: could not find property '%s' for class '%s'",
G_STRLOC, prop_name, g_type_name (type));
moo_param_array_free ((GParameter*) real_props->data, real_props->len);
g_array_free (real_props, FALSE);
moo_param_array_free ((GParameter*) fake_props->data, fake_props->len);
g_array_free (fake_props, FALSE);
moo_param_array_free ((GParameter*) props->data, props->len);
g_array_free (props, FALSE);
g_type_class_unref (klass);
return FALSE;
@ -203,26 +157,22 @@ collect_valist (GType type,
g_value_unset (&param.value);
g_free ((char*)param.name);
moo_param_array_free ((GParameter*) real_props->data, real_props->len);
g_array_free (real_props, FALSE);
moo_param_array_free ((GParameter*) fake_props->data, fake_props->len);
g_array_free (fake_props, FALSE);
moo_param_array_free ((GParameter*) props->data, props->len);
g_array_free (props, FALSE);
g_type_class_unref (klass);
return FALSE;
}
g_array_append_val (add_to, param);
g_array_append_val (props, param);
prop_name = va_arg (var_args, char*);
}
g_type_class_unref (klass);
*n_real_props_p = real_props->len;
*real_props_p = (GParameter*) g_array_free (real_props, FALSE);
*n_fake_props_p = fake_props->len;
*fake_props_p = (GParameter*) g_array_free (fake_props, FALSE);
*n_props_p = props->len;
*props_p = (GParameter*) g_array_free (props, FALSE);
return TRUE;
}
@ -235,15 +185,14 @@ moo_action_factory_new_valist (GType action_type,
{
MooActionFactory *factory;
g_return_val_if_fail (g_type_is_a (action_type, GTK_TYPE_ACTION), NULL);
g_return_val_if_fail (g_type_is_a (action_type, MOO_TYPE_ACTION_BASE), NULL);
factory = g_object_new (MOO_TYPE_ACTION_FACTORY, NULL);
factory->action_type = action_type;
if (!collect_valist (action_type,
&factory->real_props, &factory->n_real_props,
&factory->fake_props, &factory->n_fake_props,
&factory->props, &factory->n_props,
first_prop_name, var_args))
{
g_object_unref (factory);
@ -289,174 +238,6 @@ param_array_concatenate (GParameter *props1,
}
static void
action_toggled_obj (GtkToggleAction *action,
gpointer data)
{
typedef void (*ToggledFunc) (gpointer data, gboolean active);
ToggledFunc func;
func = g_object_get_data (G_OBJECT (action), "moo-toggle-func");
g_return_if_fail (func != NULL && G_IS_OBJECT (data));
g_object_ref (data);
func (data, gtk_toggle_action_get_active (action));
g_object_unref (data);
}
static void
action_toggled_data (GtkToggleAction *action,
gpointer data)
{
typedef void (*ToggledFunc) (gpointer data, gboolean active);
ToggledFunc func;
func = g_object_get_data (G_OBJECT (action), "moo-toggle-func");
g_return_if_fail (func != NULL);
func (data, gtk_toggle_action_get_active (action));
}
static void
toggled_object_died (GtkAction *action,
gpointer obj)
{
G_GNUC_UNUSED guint n;
n = g_signal_handlers_disconnect_by_func (action, (gpointer) action_toggled_obj, obj);
g_assert (n);
g_object_set_data (G_OBJECT (action), "moo-toggled-ptr", NULL);
}
static void
moo_action_set_fake_properties (gpointer action,
GParameter *props,
guint n_props)
{
guint i;
MooClosure *closure = NULL;
gpointer closure_object = NULL;
const char *closure_signal = NULL;
GCallback closure_callback = NULL;
GCallback closure_proxy_func = NULL;
GCallback toggled_callback = NULL;
gpointer toggled_data = NULL;
gpointer toggled_object = NULL;
if (!n_props)
return;
for (i = 0; i < n_props; ++i)
{
const char *name = props[i].name;
const GValue *value = &props[i].value;
if (!strcmp (name, "display-name"))
moo_action_set_display_name (action, g_value_get_string (value));
else if (!strcmp (name, "accel"))
moo_action_set_default_accel (action, g_value_get_string (value));
else if (!strcmp (name, "no-accel"))
moo_action_set_no_accel (action, g_value_get_boolean (value));
else if (!strcmp (name, "force-accel-label"))
_moo_action_set_force_accel_label (action, g_value_get_boolean (value));
else if (!strcmp (name, "dead"))
_moo_action_set_dead (action, g_value_get_boolean (value));
else if (!strcmp (name, "has-submenu"))
_moo_action_set_has_submenu (action, g_value_get_boolean (value));
else if (!strcmp (name, "stock-label"))
g_object_set (action, "label", moo_stock_label (g_value_get_string (value)), NULL);
else if (!strcmp (name, "stock-display-name"))
moo_action_set_display_name (action, moo_stock_name (g_value_get_string (value)));
else if (!strcmp (name, "stock-tooltip"))
g_object_set (action, "tooltip", moo_stock_name (g_value_get_string (value)), NULL);
else if (!strcmp (name, "closure"))
closure = g_value_get_boxed (value);
else if (!strcmp (name, "closure-object"))
closure_object = g_value_get_object (value);
else if (!strcmp (name, "closure-signal"))
closure_signal = g_value_get_string (value);
else if (!strcmp (name, "closure-callback"))
closure_callback = g_value_get_pointer (value);
else if (!strcmp (name, "closure-proxy-func"))
closure_proxy_func = g_value_get_pointer (value);
else if (!strcmp (name, "toggled-callback"))
toggled_callback = g_value_get_pointer (value);
else if (!strcmp (name, "toggled-data"))
toggled_data = g_value_get_pointer (value);
else if (!strcmp (name, "toggled-object"))
toggled_object = g_value_get_object (value);
else
g_warning ("%s: unknown property '%s'", G_STRLOC, name);
}
if (closure_callback || closure_signal)
{
if (closure_object)
closure = moo_closure_new_simple (closure_object, closure_signal,
closure_callback, closure_proxy_func);
else
g_warning ("%s: closure data missing", G_STRLOC);
}
if (closure)
_moo_action_set_closure (action, closure);
if (toggled_callback)
{
g_object_set_data (G_OBJECT (action), "moo-toggle-func", toggled_callback);
if (toggled_object)
{
MooObjectPtr *old_ptr;
gpointer ptr = moo_object_ptr_new (toggled_object,
(GWeakNotify) toggled_object_died,
action);
old_ptr = g_object_get_data (G_OBJECT (action), "moo-toggled-ptr");
if (old_ptr)
g_signal_handlers_disconnect_by_func (action,
(gpointer) action_toggled_obj,
MOO_OBJECT_PTR_GET (old_ptr));
g_object_set_data_full (G_OBJECT (action), "moo-toggled-ptr",
ptr, (GDestroyNotify) moo_object_ptr_free);
g_signal_connect (action, "toggled",
G_CALLBACK (action_toggled_obj),
toggled_object);
}
else
{
g_signal_connect (action, "toggled",
G_CALLBACK (action_toggled_data),
toggled_data);
}
}
}
static gpointer
create_from_params (GType action_type,
GParameter *real_props,
guint n_real_props,
GParameter *fake_props,
guint n_fake_props)
{
gpointer action;
action = g_object_newv (action_type, n_real_props, real_props);
g_return_val_if_fail (action != NULL, NULL);
moo_action_set_fake_properties (action, fake_props, n_fake_props);
return action;
}
gpointer
moo_action_factory_create_action (MooActionFactory *factory,
gpointer data,
@ -464,8 +245,8 @@ moo_action_factory_create_action (MooActionFactory *factory,
...)
{
GObject *object;
GParameter *real_props, *fake_props, *add_real_props, *add_fake_props;
guint n_real_props, n_fake_props, n_add_real_props, n_add_fake_props;
GParameter *props, *add_props;
guint n_props, n_add_props;
va_list var_args;
gboolean success;
@ -479,17 +260,14 @@ moo_action_factory_create_action (MooActionFactory *factory,
}
if (!prop_name)
return create_from_params (factory->action_type,
factory->real_props,
factory->n_real_props,
factory->fake_props,
factory->n_fake_props);
return g_object_newv (factory->action_type,
factory->n_props,
factory->props);
va_start (var_args, prop_name);
success = collect_valist (factory->action_type,
&add_real_props, &n_add_real_props,
&add_fake_props, &n_add_fake_props,
&add_props, &n_add_props,
prop_name, var_args);
va_end (var_args);
@ -497,25 +275,16 @@ moo_action_factory_create_action (MooActionFactory *factory,
if (!success)
return NULL;
real_props = param_array_concatenate (factory->real_props,
factory->n_real_props,
add_real_props,
n_add_real_props,
&n_real_props);
fake_props = param_array_concatenate (factory->fake_props,
factory->n_fake_props,
add_fake_props,
n_add_fake_props,
&n_fake_props);
props = param_array_concatenate (factory->props,
factory->n_props,
add_props,
n_add_props,
&n_props);
object = create_from_params (factory->action_type,
real_props, n_real_props,
fake_props, n_fake_props);
object = g_object_newv (factory->action_type, n_props, props);
moo_param_array_free (real_props, n_real_props);
moo_param_array_free (fake_props, n_fake_props);
moo_param_array_free (add_real_props, n_add_real_props);
moo_param_array_free (add_fake_props, n_add_fake_props);
moo_param_array_free (props, n_props);
moo_param_array_free (add_props, n_add_props);
return object;
}
@ -529,7 +298,7 @@ moo_action_factory_new (GType action_type,
MooActionFactory *factory;
va_list var_args;
g_return_val_if_fail (g_type_is_a (action_type, GTK_TYPE_ACTION), NULL);
g_return_val_if_fail (g_type_is_a (action_type, MOO_TYPE_ACTION_BASE), NULL);
va_start (var_args, first_prop_name);
factory = moo_action_factory_new_valist (action_type, first_prop_name, var_args);
@ -546,39 +315,29 @@ moo_action_factory_new_a (GType action_type,
{
MooActionFactory *factory;
GObjectClass *klass;
GArray *real_props, *fake_props;
GArray *props;
guint i;
g_return_val_if_fail (g_type_is_a (action_type, GTK_TYPE_ACTION), NULL);
g_return_val_if_fail (g_type_is_a (action_type, MOO_TYPE_ACTION_BASE), NULL);
klass = g_type_class_ref (action_type);
real_props = g_array_new (FALSE, TRUE, sizeof (GParameter));
fake_props = g_array_new (FALSE, TRUE, sizeof (GParameter));
props = g_array_new (FALSE, TRUE, sizeof (GParameter));
for (i = 0; i < n_params; ++i)
{
GParameter param;
GParamSpec *pspec;
GArray *add_to = NULL;
const char *prop_name = params[i].name;
if ((pspec = _moo_action_find_fake_property (klass, prop_name)))
{
add_to = fake_props;
}
else if ((pspec = g_object_class_find_property (klass, prop_name)))
{
add_to = real_props;
}
else
pspec = g_object_class_find_property (klass, prop_name);
if (!pspec)
{
g_warning ("%s: could not find property '%s' for class '%s'",
G_STRLOC, prop_name, g_type_name (action_type));
moo_param_array_free ((GParameter*) real_props->data, real_props->len);
g_array_free (real_props, FALSE);
moo_param_array_free ((GParameter*) fake_props->data, fake_props->len);
g_array_free (fake_props, FALSE);
moo_param_array_free ((GParameter*) props->data, props->len);
g_array_free (props, FALSE);
g_type_class_unref (klass);
return NULL;
@ -589,7 +348,7 @@ moo_action_factory_new_a (GType action_type,
g_value_init (&param.value, G_PARAM_SPEC_VALUE_TYPE (pspec));
g_value_copy (&params[i].value, &param.value);
g_array_append_val (add_to, param);
g_array_append_val (props, param);
}
g_type_class_unref (klass);
@ -597,34 +356,13 @@ moo_action_factory_new_a (GType action_type,
factory = g_object_new (MOO_TYPE_ACTION_FACTORY, NULL);
factory->action_type = action_type;
factory->n_real_props = real_props->len;
factory->real_props = (GParameter*) g_array_free (real_props, FALSE);
factory->n_fake_props = fake_props->len;
factory->fake_props = (GParameter*) g_array_free (fake_props, FALSE);
factory->n_props = props->len;
factory->props = (GParameter*) g_array_free (props, FALSE);
return factory;
}
GtkAction *
moo_action_new_valist (GType action_type,
const char *name,
const char *first_prop_name,
va_list var_args)
{
MooActionFactory *factory;
GtkAction *action;
g_return_val_if_fail (g_type_is_a (action_type, GTK_TYPE_ACTION), NULL);
factory = moo_action_factory_new_valist (action_type, first_prop_name, var_args);
action = moo_action_factory_create_action (factory, NULL, "name", name, NULL);
g_object_unref (factory);
return action;
}
MooActionFactory*
moo_action_factory_new_func (MooActionFactoryFunc factory_func,
gpointer data)
@ -639,50 +377,3 @@ moo_action_factory_new_func (MooActionFactoryFunc factory_func,
return factory;
}
GParamSpec *
_moo_action_find_fake_property (GObjectClass *klass,
const char *name)
{
guint i;
char *norm_name;
GParamSpec *pspec = NULL;
g_return_val_if_fail (klass != NULL, NULL);
g_return_val_if_fail (name != NULL, NULL);
action_init_props ();
norm_name = g_strdelimit (g_strdup (name), "_", '-');
for (i = 0; i < PROP_LAST; ++i)
{
if (!strcmp (g_param_spec_get_name (pspecs[i]), norm_name))
{
pspec = pspecs[i];
goto out;
}
}
out:
g_free (norm_name);
return pspec;
}
GParamSpec *
_moo_action_find_property (GObjectClass *klass,
const char *name)
{
GParamSpec *pspec;
g_return_val_if_fail (klass != NULL, NULL);
g_return_val_if_fail (name != NULL, NULL);
pspec = _moo_action_find_fake_property (klass, name);
if (!pspec)
pspec = g_object_class_find_property (klass, name);
return pspec;
}

View File

@ -14,7 +14,7 @@
#ifndef __MOO_ACTION_FACTORY_H__
#define __MOO_ACTION_FACTORY_H__
#include <mooutils/mooaction.h>
#include <gtk/gtkactiongroup.h>
#ifndef G_GNUC_NULL_TERMINATED
#if __GNUC__ >= 4
@ -49,10 +49,8 @@ struct _MooActionFactory
gpointer factory_func_data;
GType action_type;
guint n_real_props;
GParameter *real_props;
guint n_fake_props;
GParameter *fake_props;
guint n_props;
GParameter *props;
};
struct _MooActionFactoryClass
@ -82,23 +80,9 @@ gpointer moo_action_factory_create_action(MooActionFactory *factory
GtkAction *moo_action_group_add_action (GtkActionGroup *group,
const char *action_id,
const char *name,
const char *first_prop_name,
...) G_GNUC_NULL_TERMINATED;
GParamSpec *_moo_action_find_property (GObjectClass *klass,
const char *name);
GParamSpec *_moo_action_find_fake_property (GObjectClass *klass,
const char *name);
GtkAction *moo_action_new (GType action_type,
const char *first_prop_name,
...);
GtkAction *moo_action_newv (GType action_type,
guint n_parameters,
GParameter *parameters);
GtkAction *moo_action_new_valist (GType action_type,
const char *name,
const char *first_property_name,
va_list var_args);
G_END_DECLS

View File

@ -0,0 +1,226 @@
/*
* mooactiongroup.c
*
* Copyright (C) 2004-2006 by Yevgen Muntyan <muntyan@math.tamu.edu>
*
* 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.
*
* See COPYING file that comes with this distribution.
*/
#include "mooutils/mooactiongroup.h"
G_DEFINE_TYPE (MooActionGroup, _moo_action_group, GTK_TYPE_ACTION_GROUP)
const char *
_moo_action_group_get_display_name (MooActionGroup *group)
{
const char *name;
g_return_val_if_fail (MOO_IS_ACTION_GROUP (group), NULL);
name = group->display_name;
if (!name)
name = gtk_action_group_get_name (GTK_ACTION_GROUP (group));
if (!name)
name = "Actions";
return name;
}
void
_moo_action_group_set_display_name (MooActionGroup *group,
const char *display_name)
{
char *tmp;
g_return_if_fail (MOO_IS_ACTION_GROUP (group));
tmp = group->display_name;
group->display_name = g_strdup (display_name);
g_free (tmp);
}
static void
_moo_action_group_init (G_GNUC_UNUSED MooActionGroup *group)
{
}
static void
moo_action_group_finalize (GObject *object)
{
MooActionGroup *group = MOO_ACTION_GROUP (object);
g_free (group->display_name);
G_OBJECT_CLASS (_moo_action_group_parent_class)->finalize (object);
}
static void
_moo_action_group_class_init (MooActionGroupClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = moo_action_group_finalize;
}
MooActionGroup *
_moo_action_group_new (MooActionCollection *collection,
const char *name,
const char *display_name)
{
MooActionGroup *group = g_object_new (MOO_TYPE_ACTION_GROUP, "name", name, NULL);
group->display_name = g_strdup (display_name);
group->collection = collection;
return group;
}
MooActionCollection *
_moo_action_group_get_collection (MooActionGroup *group)
{
g_return_val_if_fail (MOO_IS_ACTION_GROUP (group), NULL);
return group->collection;
}
void
_moo_action_group_set_collection (MooActionGroup *group,
MooActionCollection *collection)
{
g_return_if_fail (MOO_IS_ACTION_GROUP (group));
g_return_if_fail (!collection || MOO_IS_ACTION_COLLECTION (collection));
group->collection = collection;
}
// void
// moo_action_group_set_name (MooActionGroup *group,
// const char *name)
// {
// g_return_if_fail (MOO_IS_ACTION_GROUP (group));
// action_group_set_display_name (group->priv->default_group, name);
// }
//
//
// const char *
// moo_action_group_get_name (MooActionGroup *group)
// {
// g_return_val_if_fail (MOO_IS_ACTION_GROUP (group), NULL);
// return action_group_get_display_name (group->priv->default_group);
// }
//
//
// static GtkActionGroup *
// get_group (MooActionGroup *group,
// const char *name)
// {
// if (name)
// return g_hash_table_lookup (group->priv->groups, name);
// else
// return group->priv->default_group;
// }
//
//
// GtkActionGroup *
// moo_action_group_add_group (MooActionGroup *group,
// const char *name,
// const char *display_name)
// {
// MooActionGroup *group;
//
// g_return_val_if_fail (MOO_IS_ACTION_GROUP (group), NULL);
// g_return_val_if_fail (name != NULL, NULL);
// g_return_val_if_fail (get_group (group, name) == NULL, NULL);
//
// group = _moo_action_group_new (name, display_name);
// g_hash_table_insert (group->priv->groups, g_strdup (name), group);
// group->priv->groups_list = g_slist_prepend (group->priv->groups_list, group);
//
// return GTK_ACTION_GROUP (group);
// }
//
//
// void
// moo_action_group_remove_group (MooActionGroup *group,
// GtkActionGroup *group)
// {
// const char *name;
//
// g_return_if_fail (MOO_IS_ACTION_GROUP (group));
// g_return_if_fail (GTK_IS_ACTION_GROUP (group));
//
// name = gtk_action_group_get_name (group);
// g_return_if_fail (name != NULL);
// g_return_if_fail (group == get_group (group, name));
//
// g_hash_table_remove (group->priv->groups, name);
// group->priv->groups_list = g_slist_remove (group->priv->groups_list, group);
// }
//
//
// GtkActionGroup *
// moo_action_group_get_group (MooActionGroup *group,
// const char *name)
// {
// g_return_val_if_fail (MOO_IS_ACTION_GROUP (group), NULL);
// return get_group (group, name);
// }
//
//
// const GSList *
// moo_action_group_get_groups (MooActionGroup *group)
// {
// g_return_val_if_fail (MOO_IS_ACTION_GROUP (group), NULL);
// return group->priv->groups_list;
// }
//
//
// GtkAction *
// moo_action_group_get_action (MooActionGroup *group,
// const char *name)
// {
// GSList *l;
//
// g_return_val_if_fail (MOO_IS_ACTION_GROUP (group), NULL);
// g_return_val_if_fail (name != NULL, NULL);
//
// for (l = group->priv->groups_list; l != NULL; l = l->next)
// {
// GtkActionGroup *group = l->data;
// GtkAction *action = gtk_action_group_get_action (group, name);
// if (name)
// return action;
// }
//
// return NULL;
// }
//
//
// void
// moo_action_group_remove_action (MooActionGroup *group,
// GtkAction *action)
// {
// GtkActionGroup *group = NULL;
//
// g_return_if_fail (MOO_IS_ACTION_GROUP (group));
// g_return_if_fail (GTK_IS_ACTION (action));
//
// g_object_get (action, "action-group", &group, NULL);
// g_return_if_fail (group != NULL);
// g_return_if_fail (g_slist_find (group->priv->groups_list, group) != NULL);
//
// gtk_action_group_remove_action (group, action);
// }

View File

@ -0,0 +1,60 @@
/*
* mooactiongroup.h
*
* Copyright (C) 2004-2006 by Yevgen Muntyan <muntyan@math.tamu.edu>
*
* 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.
*
* See COPYING file that comes with this distribution.
*/
#ifndef __MOO_ACTION_GROUP_H__
#define __MOO_ACTION_GROUP_H__
#include <mooutils/mooactioncollection.h>
G_BEGIN_DECLS
#define MOO_TYPE_ACTION_GROUP (_moo_action_group_get_type ())
#define MOO_ACTION_GROUP(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MOO_TYPE_ACTION_GROUP, MooActionGroup))
#define MOO_ACTION_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MOO_TYPE_ACTION_GROUP, MooActionGroupClass))
#define MOO_IS_ACTION_GROUP(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MOO_TYPE_ACTION_GROUP))
#define MOO_IS_ACTION_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MOO_TYPE_ACTION_GROUP))
#define MOO_ACTION_GROUP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MOO_TYPE_ACTION_GROUP, MooActionGroupClass))
typedef struct _MooActionGroup MooActionGroup;
typedef struct _MooActionGroupClass MooActionGroupClass;
struct _MooActionGroup {
GtkActionGroup base;
char *display_name;
MooActionCollection *collection;
};
struct _MooActionGroupClass {
GtkActionGroupClass base_class;
};
GType _moo_action_group_get_type (void) G_GNUC_CONST;
MooActionGroup *_moo_action_group_new (MooActionCollection *collection,
const char *name,
const char *display_name);
const char *_moo_action_group_get_display_name (MooActionGroup *group);
void _moo_action_group_set_display_name (MooActionGroup *group,
const char *display_name);
MooActionCollection *_moo_action_group_get_collection (MooActionGroup *group);
void _moo_action_group_set_collection (MooActionGroup *group,
MooActionCollection *collection);
G_END_DECLS
#endif /* __MOO_ACTION_GROUP_H__ */

View File

@ -12,6 +12,7 @@
*/
#include "mooutils/moomenuaction.h"
#include "mooutils/mooaction-private.h"
#include "mooutils/moocompat.h"
#include "mooutils/moomarshals.h"
#include <gtk/gtk.h>
@ -45,7 +46,7 @@ enum {
/* MOO_TYPE_MENU_ACTION */
G_DEFINE_TYPE (MooMenuAction, moo_menu_action, GTK_TYPE_ACTION)
G_DEFINE_TYPE (MooMenuAction, moo_menu_action, MOO_TYPE_ACTION)
static void
@ -74,7 +75,7 @@ static void
moo_menu_action_init (MooMenuAction *action)
{
action->mgr = moo_menu_mgr_new ();
moo_action_set_no_accel (GTK_ACTION (action), TRUE);
_moo_action_set_no_accel (GTK_ACTION (action), TRUE);
}
@ -118,7 +119,7 @@ moo_menu_action_set_property (GObject *object,
}
static GtkWidget*
static GtkWidget *
moo_menu_action_create_menu_item (GtkAction *action)
{
MooMenuAction *menu_action;

View File

@ -33,7 +33,7 @@ typedef struct _MooMenuActionClass MooMenuActionClass;
struct _MooMenuAction
{
GtkAction base;
MooAction base;
MooMenuMgr *mgr;
gpointer data;
guint is_object : 1;
@ -41,7 +41,7 @@ struct _MooMenuAction
struct _MooMenuActionClass
{
GtkActionClass base_class;
MooActionClass base_class;
};

View File

@ -11,7 +11,7 @@
* See COPYING file that comes with this distribution.
*/
#include "mooutils/mooaction.h"
#include "mooutils/mooaction-private.h"
#include "mooutils/moouixml.h"
#include "mooutils/moocompat.h"
#include "mooutils/moomarshals.h"
@ -61,7 +61,7 @@ typedef struct {
Node *node;
GtkWidget *widget;
GHashTable *children; /* Node* -> GtkWidget* */
GtkActionGroup *actions;
MooActionCollection *actions;
GtkAccelGroup *accel_group;
gboolean in_creation;
} Toplevel;
@ -135,7 +135,7 @@ static void merge_remove_node (Merge *merge,
Node *node);
static Toplevel *toplevel_new (Node *node,
GtkActionGroup *actions,
MooActionCollection *actions,
GtkAccelGroup *accel_group);
static void toplevel_free (Toplevel *toplevel);
static GtkWidget *toplevel_get_widget (Toplevel *toplevel,
@ -1424,7 +1424,7 @@ out:
static Toplevel*
toplevel_new (Node *node,
GtkActionGroup *actions,
MooActionCollection *actions,
GtkAccelGroup *accel_group)
{
Toplevel *top;
@ -1703,7 +1703,7 @@ create_menu_item (MooUIXML *xml,
g_return_if_fail (toplevel->actions != NULL);
action = gtk_action_group_get_action (toplevel->actions, item->action);
action = moo_action_collection_get_action (toplevel->actions, item->action);
if (!action)
{
@ -2098,7 +2098,7 @@ create_tool_item (MooUIXML *xml,
g_return_val_if_fail (toplevel->actions != NULL, FALSE);
action = gtk_action_group_get_action (toplevel->actions, item->action);
action = moo_action_collection_get_action (toplevel->actions, item->action);
if (!action || _moo_action_get_dead (action))
return TRUE;
@ -2239,7 +2239,7 @@ gpointer
moo_ui_xml_create_widget (MooUIXML *xml,
MooUIWidgetType type,
const char *path,
GtkActionGroup *actions,
MooActionCollection *actions,
GtkAccelGroup *accel_group)
{
Node *node;
@ -2248,7 +2248,7 @@ moo_ui_xml_create_widget (MooUIXML *xml,
g_return_val_if_fail (MOO_IS_UI_XML (xml), NULL);
g_return_val_if_fail (path != NULL, NULL);
g_return_val_if_fail (!actions || GTK_IS_ACTION_GROUP (actions), NULL);
g_return_val_if_fail (!actions || MOO_IS_ACTION_COLLECTION (actions), NULL);
node = moo_ui_xml_get_node (xml, path);
g_return_val_if_fail (node != NULL, NULL);

View File

@ -15,7 +15,7 @@
#define __MOO_UI_XML_H__
#include <mooutils/moomarkup.h>
#include <gtk/gtkactiongroup.h>
#include <mooutils/mooactioncollection.h>
G_BEGIN_DECLS
@ -130,7 +130,7 @@ MooUINode *moo_ui_node_get_child (MooUINode *node,
gpointer moo_ui_xml_create_widget (MooUIXML *xml,
MooUIWidgetType type,
const char *path,
GtkActionGroup *actions,
MooActionCollection *actions,
GtkAccelGroup *accel_group);
GtkWidget *moo_ui_xml_get_widget (MooUIXML *xml,
GtkWidget *toplevel,

View File

@ -12,7 +12,10 @@
*/
#include "mooutils/moowindow.h"
#include "mooutils/mooaction-private.h"
#include "mooutils/mooactionbase-private.h"
#include "mooutils/moomenuaction.h"
#include "mooutils/mooaccelprefs.h"
#include "mooutils/mooaccel.h"
#include "mooutils/mooprefs.h"
#include "mooutils/moomarshals.h"
@ -49,7 +52,7 @@ struct _MooWindowPrivate {
gboolean menubar_visible;
MooUIXML *ui_xml;
GtkActionGroup *actions;
MooActionCollection *actions;
char *name;
char *id;
};
@ -95,6 +98,7 @@ static void moo_window_set_id (MooWindow *window,
const char *id);
static void moo_window_add_class_actions (MooWindow *window);
static void moo_window_add_action (MooWindow *window,
const char *group,
GtkAction *action);
static void moo_window_remove_action (MooWindow *window,
const char *action_id);
@ -159,7 +163,7 @@ moo_window_class_init (MooWindowClass *klass)
moo_window_class_set_id (klass, "MooWindow", "Window");
moo_window_class_new_action (klass, "ConfigureShortcuts",
moo_window_class_new_action (klass, "ConfigureShortcuts", NULL,
"display-name", "Configure Shortcuts",
"label", "Configure _Shortcuts...",
"tooltip", "Configure _Shortcuts...",
@ -168,16 +172,16 @@ moo_window_class_init (MooWindowClass *klass)
"closure-callback", moo_window_shortcuts_prefs_dialog,
NULL);
moo_window_class_new_action (klass, "ShowToolbar",
"action-type::", GTK_TYPE_TOGGLE_ACTION,
moo_window_class_new_action (klass, "ShowToolbar", NULL,
"action-type::", MOO_TYPE_TOGGLE_ACTION,
"display-name", "Show Toolbar",
"label", "Show Toolbar",
"tooltip", "Show Toolbar",
"condition::active", "toolbar-visible",
NULL);
moo_window_class_new_action (klass, "ShowMenubar",
"action-type::", GTK_TYPE_TOGGLE_ACTION,
moo_window_class_new_action (klass, "ShowMenubar", NULL,
"action-type::", MOO_TYPE_TOGGLE_ACTION,
"display-name", "Show Menubar",
"label", "Show Menubar",
"tooltip", "Show Menubar",
@ -185,7 +189,7 @@ moo_window_class_init (MooWindowClass *klass)
"condition::active", "menubar-visible",
NULL);
moo_window_class_new_action_custom (klass, TOOLBAR_STYLE_ACTION_ID,
moo_window_class_new_action_custom (klass, TOOLBAR_STYLE_ACTION_ID, NULL,
create_toolbar_style_action,
NULL, NULL);
@ -226,7 +230,7 @@ moo_window_class_init (MooWindowClass *klass)
g_param_spec_object ("actions",
"actions",
"actions",
GTK_TYPE_ACTION_GROUP,
MOO_TYPE_ACTION_COLLECTION,
G_PARAM_READABLE));
g_object_class_install_property (gobject_class,
@ -282,7 +286,7 @@ moo_window_constructor (GType type,
klass = g_type_class_ref (type);
moo_window_set_id (window, moo_window_class_get_id (klass));
window->priv->name = g_strdup (moo_window_class_get_name (klass));
window->priv->actions = gtk_action_group_new (window->priv->name);
window->priv->actions = moo_action_collection_new (window->priv->id, window->priv->name);
init_prefs (window);
@ -334,12 +338,12 @@ moo_window_constructor (GType type,
moo_window_set_toolbar_visible (window,
moo_prefs_get_bool (setting (window, PREFS_SHOW_TOOLBAR)));
action = moo_window_get_action (window, "ShowToolbar");
moo_sync_toggle_action (action, window, "toolbar-visible", FALSE);
_moo_sync_toggle_action (action, window, "toolbar-visible", FALSE);
moo_window_set_menubar_visible (window,
moo_prefs_get_bool (setting (window, PREFS_SHOW_MENUBAR)));
action = moo_window_get_action (window, "ShowMenubar");
moo_sync_toggle_action (action, window, "menubar-visible", FALSE);
_moo_sync_toggle_action (action, window, "menubar-visible", FALSE);
moo_window_update_ui (window);
@ -557,7 +561,7 @@ moo_window_update_toolbar (MooWindow *window)
MooUIXML *xml;
GtkToolbarStyle style;
char *ui_name;
GtkActionGroup *actions;
MooActionCollection *actions;
g_return_if_fail (MOO_IS_WINDOW (window));
@ -607,7 +611,7 @@ moo_window_update_menubar (MooWindow *window)
{
MooUIXML *xml;
char *ui_name;
GtkActionGroup *actions;
MooActionCollection *actions;
g_return_if_fail (MOO_IS_WINDOW (window));
@ -802,6 +806,7 @@ static GtkToolbarStyle get_toolbar_style (MooWindow *window)
typedef struct {
MooActionFactory *action;
char *group;
char **conditions;
} ActionInfo;
@ -831,6 +836,7 @@ get_quark__ (guint n)
static ActionInfo*
action_info_new (MooActionFactory *action,
const char *group,
char **conditions)
{
ActionInfo *info;
@ -839,6 +845,7 @@ action_info_new (MooActionFactory *action,
info = g_new0 (ActionInfo, 1);
info->action = g_object_ref (action);
info->group = g_strdup (group);
info->conditions = g_strdupv (conditions);
return info;
@ -870,11 +877,22 @@ create_action (const char *action_id,
g_return_val_if_fail (action_id && action_id[0], NULL);
class_id = moo_window_class_get_id (MOO_WINDOW_CLASS (G_OBJECT_GET_CLASS (window)));
if (g_type_is_a (info->action->action_type, MOO_TYPE_ACTION))
action = moo_action_factory_create_action (info->action, window,
"closure-object", window,
"name", action_id,
NULL);
else if (g_type_is_a (info->action->action_type, MOO_TYPE_TOGGLE_ACTION))
action = moo_action_factory_create_action (info->action, window,
"toggled-object", window,
"name", action_id,
NULL);
else
action = moo_action_factory_create_action (info->action, window,
"name", action_id,
NULL);
g_return_val_if_fail (action != NULL, NULL);
if (info->conditions)
@ -891,7 +909,7 @@ create_action (const char *action_id,
condition = p[0];
if (!strcmp (condition, "active"))
moo_sync_toggle_action (action, window, prop, invert);
_moo_sync_toggle_action (action, window, prop, invert);
else
moo_bind_bool_property (action, condition, window, prop, invert);
}
@ -929,6 +947,7 @@ static void
moo_window_class_install_action (MooWindowClass *klass,
const char *action_id,
MooActionFactory *action,
const char *group,
char **conditions)
{
GHashTable *actions;
@ -953,7 +972,7 @@ moo_window_class_install_action (MooWindowClass *klass,
if (g_hash_table_lookup (actions, action_id))
moo_window_class_remove_action (klass, action_id);
info = action_info_new (action, conditions);
info = action_info_new (action, group, conditions);
g_hash_table_insert (actions, g_strdup (action_id), info);
for (l = window_instances; l != NULL; l = l->next)
@ -963,7 +982,7 @@ moo_window_class_install_action (MooWindowClass *klass,
GtkAction *action = create_action (action_id, info, l->data);
if (action)
moo_window_add_action (l->data, action);
moo_window_add_action (l->data, group, action);
}
}
}
@ -990,6 +1009,7 @@ custom_action_factory_func (MooWindow *window,
void
moo_window_class_new_action_custom (MooWindowClass *klass,
const char *action_id,
const char *group,
MooWindowActionFunc func,
gpointer data,
GDestroyNotify notify)
@ -1001,14 +1021,11 @@ moo_window_class_new_action_custom (MooWindowClass *klass,
g_return_if_fail (func != NULL);
action_factory = moo_action_factory_new_func ((MooActionFactoryFunc) custom_action_factory_func, NULL);
g_object_set_data (G_OBJECT (action_factory), "moo-window-class", klass);
g_object_set_data_full (G_OBJECT (action_factory), "moo-window-class-action-id",
g_strdup (action_id), g_free);
g_object_set_data (G_OBJECT (action_factory), "moo-window-class-action-func", func);
g_object_set_data_full (G_OBJECT (action_factory), "moo-window-class-action-func-data",
data, notify);
moo_window_class_install_action (klass, action_id, action_factory, NULL);
moo_window_class_install_action (klass, action_id, action_factory, group, NULL);
g_object_unref (action_factory);
}
@ -1016,12 +1033,13 @@ moo_window_class_new_action_custom (MooWindowClass *klass,
void
moo_window_class_new_action (MooWindowClass *klass,
const char *action_id,
const char *group,
const char *first_prop_name,
...)
{
va_list args;
va_start (args, first_prop_name);
moo_window_class_new_actionv (klass, action_id, first_prop_name, args);
moo_window_class_new_actionv (klass, action_id, group, first_prop_name, args);
va_end (args);
}
@ -1094,7 +1112,7 @@ moo_window_set_ui_xml (MooWindow *window,
}
GtkActionGroup*
MooActionCollection *
moo_window_get_actions (MooWindow *window)
{
g_return_val_if_fail (MOO_IS_WINDOW (window), NULL);
@ -1108,7 +1126,7 @@ moo_window_get_action (MooWindow *window,
{
g_return_val_if_fail (MOO_IS_WINDOW (window), NULL);
g_return_val_if_fail (action != NULL, NULL);
return gtk_action_group_get_action (window->priv->actions, action);
return moo_action_collection_get_action (window->priv->actions, action);
}
@ -1148,7 +1166,7 @@ add_action (const char *id,
GtkAction *action = create_action (id, info, window);
if (action)
moo_window_add_action (window, action);
moo_window_add_action (window, info->group, action);
}
static void
@ -1197,27 +1215,30 @@ moo_window_class_set_id (MooWindowClass *klass,
static void
moo_window_add_action (MooWindow *window,
const char *group_name,
GtkAction *action)
{
GtkActionGroup *group;
MooActionCollection *coll;
g_return_if_fail (MOO_IS_WINDOW (window));
g_return_if_fail (GTK_IS_ACTION (action));
g_return_if_fail (MOO_IS_ACTION_BASE (action));
coll = moo_window_get_actions (window);
group = moo_action_collection_get_group (coll, group_name);
g_return_if_fail (group != NULL);
group = moo_window_get_actions (window);
gtk_action_group_add_action (group, action);
if (!_moo_action_get_dead (action))
if (!_moo_action_get_dead (action) && !_moo_action_get_no_accel (action))
{
const char *accel, *default_accel, *accel_path;
char *accel_path;
accel_path = _moo_action_make_accel_path (window->priv->id, gtk_action_get_name (action));
accel_path = _moo_action_make_accel_path (action);
_moo_action_set_accel_path (action, accel_path);
_moo_accel_register (accel_path, _moo_action_get_default_accel (action));
accel = _moo_prefs_get_accel (accel_path);
default_accel = moo_action_get_default_accel (action);
_moo_set_accel (accel_path, accel ? accel : default_accel);
g_free (accel_path);
}
}
@ -1226,23 +1247,24 @@ static void
moo_window_remove_action (MooWindow *window,
const char *action_id)
{
GtkActionGroup *group;
MooActionCollection *coll;
GtkAction *action;
g_return_if_fail (MOO_IS_WINDOW (window));
g_return_if_fail (action_id != NULL);
group = moo_window_get_actions (window);
action = gtk_action_group_get_action (group, action_id);
coll = moo_window_get_actions (window);
action = moo_action_collection_get_action (coll, action_id);
if (action)
gtk_action_group_remove_action (group, action);
moo_action_collection_remove_action (coll, action);
}
void
moo_window_class_new_actionv (MooWindowClass *klass,
const char *action_id,
const char *group,
const char *first_prop_name,
va_list var_args)
{
@ -1286,9 +1308,9 @@ moo_window_class_new_actionv (MooWindowClass *klass,
action_type = moo_value_get_gtype (&param.value);
if (!g_type_is_a (action_type, GTK_TYPE_ACTION))
if (!g_type_is_a (action_type, MOO_TYPE_ACTION_BASE))
{
g_warning ("%s: invalid action type", G_STRLOC);
g_warning ("%s: invalid action type %s", G_STRLOC, g_type_name (action_type));
goto error;
}
@ -1323,11 +1345,11 @@ moo_window_class_new_actionv (MooWindowClass *klass,
if (!action_class)
{
if (!action_type)
action_type = GTK_TYPE_ACTION;
action_type = MOO_TYPE_ACTION;
action_class = g_type_class_ref (action_type);
}
pspec = _moo_action_find_property (action_class, name);
pspec = g_object_class_find_property (action_class, name);
if (!pspec)
{
@ -1378,6 +1400,7 @@ moo_window_class_new_actionv (MooWindowClass *klass,
moo_window_class_install_action (klass,
action_id,
action_factory,
group,
(char**) conditions->pdata);
g_strfreev ((char**) conditions->pdata);

View File

@ -16,8 +16,8 @@
#include <mooutils/mooutils-gobject.h>
#include <mooutils/moouixml.h>
#include <mooutils/mooactioncollection.h>
#include <gtk/gtkwindow.h>
#include <gtk/gtkactiongroup.h>
G_BEGIN_DECLS
@ -75,18 +75,29 @@ void moo_window_class_set_id (MooWindowClass *klass,
void moo_window_class_new_action (MooWindowClass *klass,
const char *id,
const char *group,
const char *first_prop_name,
...) G_GNUC_NULL_TERMINATED;
void moo_window_class_new_actionv (MooWindowClass *klass,
const char *id,
const char *group,
const char *first_prop_name,
va_list props);
void moo_window_class_new_action_custom (MooWindowClass *klass,
const char *id,
const char *group,
MooWindowActionFunc func,
gpointer data,
GDestroyNotify notify);
void moo_window_class_new_group (MooWindowClass *klass,
const char *name,
const char *display_name);
gboolean moo_window_class_find_group (MooWindowClass *klass,
const char *name);
void moo_window_class_remove_group (MooWindowClass *klass,
const char *name);
gboolean moo_window_class_find_action (MooWindowClass *klass,
const char *id);
void moo_window_class_remove_action (MooWindowClass *klass,
@ -96,7 +107,7 @@ MooUIXML *moo_window_get_ui_xml (MooWindow *window);
void moo_window_set_ui_xml (MooWindow *window,
MooUIXML *xml);
GtkActionGroup *moo_window_get_actions (MooWindow *window);
MooActionCollection *moo_window_get_actions (MooWindow *window);
GtkAction *moo_window_get_action (MooWindow *window,
const char *action);

View File

@ -100,21 +100,21 @@ static void init_actions (void)
g_return_if_fail (klass != NULL);
moo_window_class_new_action (klass, "Preferences",
moo_window_class_new_action (klass, "Preferences", NULL,
"display-name", "Preferences",
"label", "Preferences",
"tooltip", "Preferences",
"stock-id", GTK_STOCK_PREFERENCES,
"closure-callback", show_preferences,
NULL);
moo_window_class_new_action (klass, "Quit",
moo_window_class_new_action (klass, "Quit", NULL,
"display-name", "Quit",
"label", "_Quit",
"tooltip", "Quit",
"stock-id", GTK_STOCK_QUIT,
"closure-callback", quit,
NULL);
moo_window_class_new_action (klass, "About",
moo_window_class_new_action (klass, "About", NULL,
"display-name", "About",
"label", "About",
"tooltip", "About",