📄 migrating-gtkaction.sgml
字号:
low_quality_callback, NULL, NULL, GNOME_APP_PIXMAP_FILENAME, "low-quality.png", 0, 0, NULL }, { GNOME_APP_UI_ENDOFINFO }};static GnomeUIInfo view_menu_items[] = { { GNOME_APP_UI_ITEM, "Zoom _In", "Zoom into the image", zoom_in_callback, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GTK_STOCK_ZOOM_IN, GDK_PLUS, 0, NULL }, { GNOME_APP_UI_ITEM, "Zoom _Out", "Zoom away from the image", zoom_out_callback, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GTK_STOCK_ZOOM_OUT, GDK_MINUS, 0, NULL }, { GNOME_APP_UI_SEPARATOR }, { GNOME_APP_UI_TOGGLEITEM, "_Full Screen", "Switch between full screen and windowed mode", full_screen_callback, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, GDK_F11, 0, NULL }, { GNOME_APP_UI_SEPARATOR }, { GNOME_APP_UI_RADIOITEMS, NULL, NULL, view_radio_items }, { GNOME_APP_UI_ENDOFINFO }};static GnomeUIInfo menubar[] = { { GNOME_APP_UI_SUBTREE, "_File", NULL, file_menu_items }, { GNOME_APP_UI_SUBTREE, "_View", NULL, view_menu_items }, { GNOME_APP_UI_ENDOFINFO }} </programlisting> </example> <example id="gnomeuiinfo-action-entries"> <title><structname>GtkActionEntry</structname> Structures</title> <para> The following code is the set of actions that are present in the <link linkend="gnomeuiinfo-example">previous example</link>. Note that the toggle and radio entries are separate from normal actions. Also, note that #GtkActionEntry structures take key names in the format of gdk_accelerator_parse() rather than key values plus modifiers; you will have to convert these values by hand. For example, %GDK_F11 with no modifiers is equivalent to a key name of <literal>"F11"</literal>. Likewise, <literal>"o"</literal> with %GDK_CONTROL_MASK is equivalent to <literal>"<ontrol>O"</literal>. </para> <programlisting>/* Normal items */static const GtkActionEntry entries[] = { { "FileMenu", NULL, "_File" }, { "ViewMenu", NULL, "_View" }, { "Open", GTK_STOCK_OPEN, "_Open", "<control>O", "Open a file", open_action_callback }, { "Exit", GTK_STOCK_QUIT, "E_xit", "<control>Q", "Exit the program", exit_action_callback }, { "ZoomIn", GTK_STOCK_ZOOM_IN, "Zoom _In", "plus", "Zoom into the image", zoom_in_action_callback }, { "ZoomOut", GTK_STOCK_ZOOM_OUT, "Zoom _Out", "minus", "Zoom away from the image", zoom_out_action_callback },};/* Toggle items */static const GtkToggleActionEntry toggle_entries[] = { { "FullScreen", NULL, "_Full Screen", "F11", "Switch between full screen and windowed mode", full_screen_action_callback, FALSE }};/* Radio items */static const GtkRadioActionEntry radio_entries[] = { { "HighQuality", "my-stock-high-quality", "_High Quality", NULL, "Display images in high quality, slow mode", 0 }, { "NormalQuality", "my-stock-normal-quality", "_Normal Quality", NULL, "Display images in normal quality", 1 }, { "LowQuality", "my-stock-low-quality", "_Low Quality", NULL, "Display images in low quality, fast mode", 2 }}; </programlisting> </example> <example id="gnomeuiinfo-xml"> <title>XML Description</title> <para> After extracting the actions, you will need to create an XML description of the actual layout of your menus and toolbars for use with #GtkUIManager. The following code shows a simple menu bar that corresponds to the <link linkend="gnomeuiinfo-example">previous example</link>. Note that the <guimenu>File</guimenu> and <guimenu>View</guimenu> menus have their names specified in the <link linkend="gnomeuiinfo-action-entries">action entries</link>, not in the XML itself. This is because the XML description only contains <emphasis>identifiers</emphasis> for the items in the GUI, rather than human-readable names. </para> <programlisting>static const char *ui_description ="<ui>"" <menubar name='MainMenu'>"" <menu action='FileMenu'>"" <menuitem action='Open'/>"" <menuitem action='Exit'/>"" </menu>"" <menu action='ViewMenu'>"" <menuitem action='ZoomIn'/>"" <menuitem action='ZoomOut'/>"" <separator/>"" <menuitem action='FullScreen'/>"" <separator/>"" <menuitem action='HighQuality'/>"" <menuitem action='NormalQuality'/>"" <menuitem action='LowQuality'/>"" </menu>"" </menubar>""</ui>"; </programlisting> </example> <example id="gnomeuiinfo-code"> <title>Creating the Menu Bar</title> <para> In this last example, we will create a #GtkActionGroup based on the <link linkend="gnomeuiinfo-action-entries">action entries</link> we created above. We will then create a #GtkUIManager with the <link linkend="gnomeuiinfo-xml">XML description</link> of the menu layout. We will also extract the accelerator group and the widgets from the #GtkUIManager put them into a window. </para> <programlisting>GtkWidget *window;GtkWidget *vbox;GtkWidget *menubar;GtkActionGroup *action_group;GtkUIManager *ui_manager;GtkAccelGroup *accel_group;GError *error;register_my_stock_icons (<!-- -->);window = gtk_window_new (GTK_WINDOW_TOPLEVEL);vbox = gtk_vbox_new (FALSE, 0);gtk_container_add (GTK_CONTAINER (window), vbox);action_group = gtk_action_group_new ("MenuActions");gtk_action_group_add_actions (action_group, entries, G_N_ELEMENTS (entries), window);gtk_action_group_add_toggle_actions (action_group, toggle_entries, G_N_ELEMENTS (toggle_entries), window);gtk_action_group_add_radio_actions (action_group, radio_entries, G_N_ELEMENTS (radio_entries), 0, radio_action_callback, window);ui_manager = gtk_ui_manager_new (<!-- -->);gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);accel_group = gtk_ui_manager_get_accel_group (ui_manager);gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);error = NULL;if (!gtk_ui_manager_add_ui_from_string (ui_manager, ui_description, -1, &error)) { g_message ("building menus failed: %s", error->message); g_error_free (error); exit (EXIT_FAILURE); }menubar = gtk_ui_manager_get_widget (ui_manager, "/MainMenu");gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0);gtk_widget_show_all (window); </programlisting> </example> <example id="gnomeuiinfo-icons"> <title>Registering the icons</title> <para> Here we show how the register_my_stock_icons() function used in the previous example could look like. </para> <programlisting>static struct { gchar *filename; gchar *stock_id;} stock_icons[] = { { "high-quality.png", "my-stock-high-quality" }, { "normal-quality.png", "my-stock-normal-quality" }, { "low-quality.png", "my-stock-low-quality" },}; static gint n_stock_icons = G_N_ELEMENTS (stock_icons);static voidregister_my_stock_icons (void){ GtkIconFactory *icon_factory; GtkIconSet *icon_set; GtkIconSource *icon_source; gint i; icon_factory = gtk_icon_factory_new (<!-- -->); for (i = 0; i < n_stock_icons; i++) { icon_set = gtk_icon_set_new (<!-- -->); icon_source = gtk_icon_source_new (<!-- -->); gtk_icon_source_set_filename (icon_source, stock_icons[i].filename); gtk_icon_set_add_source (icon_set, icon_source); gtk_icon_source_free (icon_source); gtk_icon_factory_add (icon_factory, stock_icons[i].stock_id, icon_set); gtk_icon_set_unref (icon_set); } gtk_icon_factory_add_default (icon_factory); g_object_unref (icon_factory);} </programlisting> </example> </section></chapter><!--Local variables:mode: sgmlsgml-parent-document: ("gtk-docs.sgml" "book" "part" "chapter")End:-->
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -