1997-11-25 06:05:25 +08:00
|
|
|
/* The GIMP -- an image manipulation program
|
|
|
|
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
1998-04-13 13:44:11 +08:00
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
1997-11-25 06:05:25 +08:00
|
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include "appenv.h"
|
1999-06-07 01:26:51 +08:00
|
|
|
#include "channels_dialog.h"
|
1997-11-25 06:05:25 +08:00
|
|
|
#include "colormaps.h"
|
|
|
|
#include "commands.h"
|
1999-08-24 06:47:36 +08:00
|
|
|
#include "dialog_handler.h"
|
1997-11-25 06:05:25 +08:00
|
|
|
#include "fileops.h"
|
1998-07-12 13:18:17 +08:00
|
|
|
#include "general.h"
|
1997-11-25 06:05:25 +08:00
|
|
|
#include "gimprc.h"
|
|
|
|
#include "interface.h"
|
1999-06-07 01:26:51 +08:00
|
|
|
#include "layers_dialog.h"
|
1997-11-25 06:05:25 +08:00
|
|
|
#include "menus.h"
|
1999-06-07 01:26:51 +08:00
|
|
|
#include "paths_dialog.h"
|
1997-11-25 06:05:25 +08:00
|
|
|
#include "paint_funcs.h"
|
|
|
|
#include "procedural_db.h"
|
|
|
|
#include "scale.h"
|
|
|
|
#include "tools.h"
|
1998-03-11 16:58:42 +08:00
|
|
|
#include "gdisplay.h"
|
1998-07-08 17:04:33 +08:00
|
|
|
#include "docindex.h"
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-01-27 14:30:37 +08:00
|
|
|
#include "config.h"
|
1998-08-06 07:46:04 +08:00
|
|
|
#include "libgimp/gimpintl.h"
|
1999-03-07 20:56:03 +08:00
|
|
|
#include "libgimp/gimpenv.h"
|
1998-08-06 07:46:04 +08:00
|
|
|
|
1999-01-27 14:30:37 +08:00
|
|
|
#define MRU_MENU_ENTRY_SIZE (strlen (_("/File/MRU00 ")) + 1)
|
1998-07-12 13:18:17 +08:00
|
|
|
#define MRU_MENU_ACCEL_SIZE sizeof ("<control>0")
|
|
|
|
|
1999-08-25 03:57:55 +08:00
|
|
|
static char* G_GNUC_UNUSED dummyMenus[] = { N_("/File/MRU00 "),
|
|
|
|
N_("/File"),
|
|
|
|
N_("/File/Dialogs"),
|
1999-09-09 15:09:33 +08:00
|
|
|
N_("/Image/Transforms"),
|
1999-08-25 03:57:55 +08:00
|
|
|
N_("/Layers"),
|
|
|
|
N_("/Tools"),
|
|
|
|
N_("/Dialogs"),
|
1999-09-09 15:09:33 +08:00
|
|
|
N_("/View/Zoom"),
|
|
|
|
N_("/Stack")};
|
1999-01-27 14:30:37 +08:00
|
|
|
|
1999-06-22 04:04:04 +08:00
|
|
|
static void menus_init (void);
|
|
|
|
static gchar* menu_translate (const gchar *path,
|
|
|
|
gpointer data);
|
1999-08-24 06:47:36 +08:00
|
|
|
static void tearoff_cmd_callback (GtkWidget *widget,
|
|
|
|
gpointer callback_data,
|
|
|
|
guint callback_action);
|
1998-06-07 21:55:36 +08:00
|
|
|
|
1998-07-12 13:18:17 +08:00
|
|
|
static GSList *last_opened_raw_filenames = NULL;
|
|
|
|
|
1999-06-22 04:04:04 +08:00
|
|
|
static GtkItemFactoryEntry toolbox_entries[] =
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/File/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/File/New"), "<control>N", file_new_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Open"), "<control>O", file_open_cmd_callback, 0 },
|
1999-08-27 07:49:39 +08:00
|
|
|
{ N_("/File/Acquire"), NULL, NULL, 0, "<Branch>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/File/About..."), NULL, about_dialog_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Preferences..."), NULL, file_pref_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Tip of the day"), NULL, tips_dialog_cmd_callback, 0 },
|
1999-06-22 06:12:07 +08:00
|
|
|
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/File/Dialogs/Brushes..."), "<control><shift>B", dialogs_brushes_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Dialogs/Patterns..."), "<control><shift>P", dialogs_patterns_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Dialogs/Palette..."), "<control>P", dialogs_palette_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Dialogs/Gradient..."), "<control>G", dialogs_gradient_editor_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Dialogs/Layers & Channels..."), "<control>L", dialogs_lc_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Dialogs/Tool Options..."), "<control><shift>T", dialogs_tools_options_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Dialogs/Input Devices..."), NULL, dialogs_input_devices_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Dialogs/Device Status..."), NULL, dialogs_device_status_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Dialogs/Document Index..."), NULL, raise_idea_callback, 0 },
|
|
|
|
{ N_("/File/Dialogs/Error Console..."), NULL, dialogs_error_console_cmd_callback, 0 },
|
1999-08-31 10:00:34 +08:00
|
|
|
{ N_("/File/Dialogs/Display Filters..."), NULL, dialogs_display_filters_cmd_callback, 0 },
|
1999-06-22 06:12:07 +08:00
|
|
|
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/Xtns/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1999-05-17 01:22:58 +08:00
|
|
|
{ N_("/Xtns/Module Browser"), NULL, dialogs_module_browser_cmd_callback, 0 },
|
1999-05-15 08:02:47 +08:00
|
|
|
{ N_("/File/---"), NULL, NULL, 0, "<Separator>" },
|
1999-02-03 17:17:37 +08:00
|
|
|
{ N_("/File/---"), NULL, NULL, 0, "<Separator>" }
|
1998-06-07 21:55:36 +08:00
|
|
|
};
|
|
|
|
static guint n_toolbox_entries = sizeof (toolbox_entries) / sizeof (toolbox_entries[0]);
|
|
|
|
static GtkItemFactory *toolbox_factory = NULL;
|
|
|
|
|
1999-06-22 04:04:04 +08:00
|
|
|
static GtkItemFactoryEntry file_menu_separator = { N_("/File/---"), NULL, NULL, 0, "<Separator>" };
|
|
|
|
static GtkItemFactoryEntry toolbox_end = { N_("/File/Quit"), "<control>Q", file_quit_cmd_callback, 0 };
|
1998-07-12 13:18:17 +08:00
|
|
|
|
1999-06-22 04:04:04 +08:00
|
|
|
static GtkItemFactoryEntry image_entries[] =
|
1998-06-07 21:55:36 +08:00
|
|
|
{
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
|
|
|
{ N_("/File/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/File/New"), "<control>N", file_new_cmd_callback, 1 },
|
|
|
|
{ N_("/File/Open"), "<control>O", file_open_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Save"), "<control>S", file_save_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Save as"), NULL, file_save_as_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Revert"), NULL, file_revert_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Preferences..."), NULL, file_pref_cmd_callback, 0 },
|
1998-08-06 07:46:04 +08:00
|
|
|
{ N_("/File/---"), NULL, NULL, 0, "<Separator>" },
|
1999-06-22 06:12:07 +08:00
|
|
|
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/File/Close"), "<control>W", file_close_cmd_callback, 0 },
|
|
|
|
{ N_("/File/Quit"), "<control>Q", file_quit_cmd_callback, 0 },
|
1999-02-25 16:24:51 +08:00
|
|
|
{ N_("/File/---moved"), NULL, NULL, 0, "<Separator>" },
|
1999-06-22 06:12:07 +08:00
|
|
|
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/Edit/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Edit/Cut"), "<control>X", edit_cut_cmd_callback, 0 },
|
|
|
|
{ N_("/Edit/Copy"), "<control>C", edit_copy_cmd_callback, 0 },
|
|
|
|
{ N_("/Edit/Paste"), "<control>V", edit_paste_cmd_callback, 0 },
|
|
|
|
{ N_("/Edit/Paste Into"), NULL, edit_paste_into_cmd_callback, 0 },
|
1999-07-07 04:43:52 +08:00
|
|
|
{ N_("/Edit/Paste As New"), NULL, edit_paste_as_new_cmd_callback, 0 },
|
|
|
|
{ N_("/Edit/---"), NULL, NULL, 0, "<Separator>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Edit/Clear"), "<control>K", edit_clear_cmd_callback, 0 },
|
|
|
|
{ N_("/Edit/Fill"), "<control>period", edit_fill_cmd_callback, 0 },
|
|
|
|
{ N_("/Edit/Stroke"), NULL, edit_stroke_cmd_callback, 0 },
|
|
|
|
{ N_("/Edit/Undo"), "<control>Z", edit_undo_cmd_callback, 0 },
|
|
|
|
{ N_("/Edit/Redo"), "<control>R", edit_redo_cmd_callback, 0 },
|
Honest, guv, it's not a feature - it's a tightly integrated package of
Mon Sep 20 12:51:30 EDT 1999 Austin Donnelly <austin@gimp.org>
Honest, guv, it's not a feature - it's a tightly integrated
package of undo system cleanups and fixes.
NEW FILES:
* app/undo_history.c: window showing recent undo (and redo) steps
available.
* app/undo_types.h: broken out of undo.h to fix circular includes.
MODIFIED FILES:
* app/Makefile.am: compile undo_history.c
* app/channel.h: use enum for channel undo type, not just magic
numbers.
* app/layer.h: same for layer undos.
* app/commands.c: edit_show_undo_history_cmd_callback() function to
pull up undo history window.
* app/commands.h: prototype for above.
* app/gdisplay.c: make undo / redo menu items sensitive according
to whether they would do anything. Would be easy to change
the text to say what would be undone/redone, but I don't know
the GTK.
* app/gimpimage.c: new signal emitted by gimage:
UNDO_EVENT. gimp_image_undo_event() function to emit it.
* app/gimpimage.h: prototype for above.
* app/gimpimageP.h: pushing_undo_group member is now an undo_type,
not an int. Keep undo history widget here too (if created).
* app/menus.c: add "Edit/Undo history..." to image menu.
* app/undo.c: new types: enums undo_type and undo_state rather than
ints and magic numbers. All undo_pop_* and undo_free_*
functions made static. New static function
undo_type_to_name(). Issue undo event signals on various
important events (eg undo pushed, undo popped etc).
undo_push() now takes a "dirties_image" arg to say whether
image should be dirtied. Layer moves now dirty the image. A
couple of g_return_if_fails () on undo_pop and undo_redo to
assert we're not in the middle of an undo group.
undo_get_{undo,redo}_name() to peek at names of top items on
undo and redo stacks resp. undo_map_over_{undo,redo}_stack()
to run a function for each item or group on stack. Layer and
channel undos use symbolic names rather than 0 or 1. Array
mapping undo types to names.
* app/undo.h: split out undo types to undo_types.h. Prototypes
for functions described above. undo_event_t enum.
undo_history_new() prototype lives here too.
Random other fixes:
* app/gimpdrawable.c
* app/image_render.c: default labels in switches to keep egcs happy.
* app/nav_window.c: some fixes to (sort of) cope with image res !=
screen res. Still needs work to handle non-square pixels
properly.
* app/paths_dialog.c: bad idea to call gimp_image_dirty()
directly. Even though it's currently commented out.
1999-09-21 01:15:20 +08:00
|
|
|
{ N_("/Edit/Undo history..."), NULL, edit_show_undo_history_cmd_callback, 0},
|
1998-08-06 07:46:04 +08:00
|
|
|
{ N_("/Edit/---"), NULL, NULL, 0, "<Separator>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Edit/Cut Named"), "<control><shift>X", edit_named_cut_cmd_callback, 0 },
|
|
|
|
{ N_("/Edit/Copy Named"), "<control><shift>C", edit_named_copy_cmd_callback, 0 },
|
|
|
|
{ N_("/Edit/Paste Named"), "<control><shift>V", edit_named_paste_cmd_callback, 0 },
|
1998-08-06 07:46:04 +08:00
|
|
|
{ N_("/Edit/---"), NULL, NULL, 0, "<Separator>" },
|
1998-06-07 21:55:36 +08:00
|
|
|
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/Select/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Select/Invert"), "<control>I", select_invert_cmd_callback, 0 },
|
|
|
|
{ N_("/Select/All"), "<control>A", select_all_cmd_callback, 0 },
|
|
|
|
{ N_("/Select/None"), "<control><shift>A", select_none_cmd_callback, 0 },
|
|
|
|
{ N_("/Select/Float"), "<control><shift>L", select_float_cmd_callback, 0 },
|
new ui for the "Layer Offset" dialog.
1999-07-22 Michael Natterer <mitschel@cs.tu-berlin.de>
* app/channel_ops.[ch]: new ui for the "Layer Offset" dialog.
* app/channels_dialog.c
* app/layers_dialog.c: major code cleanup: Folded some callbacks
into common ones, "widget" instead of "w", indentation, ...
* app/commands.c
* app/interface.[ch]
* app/global_edit.c: the query boxes must be shown by the caller
now. There's no need to split up the string for the message box
manually as the Gtk 1.2 label widget handles newlines corectly.
Added the "edge_lock" toggle to the "Shrink Selection" dialog.
Nicer spacings for the query and message boxes.
* app/ink.c: tried to grab the pointer in the blob preview but
failed. Left the code there as a reminder (commented out).
* app/menus.c: reordered <Image>/Select.
I was bored and grep-ed the sources for ancient or deprecated stuff:
* app/about_dialog.[ch]
* app/actionarea.[ch]
* app/app_procs.c
* app/brush_edit.c
* app/brush_select.c
* app/color_select.c
* app/convert.c
* app/devices.c
* app/gdisplay.c
* app/gdisplay_ops.c
* app/histogram_tool.[ch]
* app/info_window.c
* app/install.c
* app/ops_buttons.c
* app/palette.c
* app/palette_select.c
* app/paths_dialog.c
* app/pattern_select.c
* app/resize.c
* app/scale_toolc.c
* app/text_tool.c:
s/container_border_width/container_set_border_width/g,
s/sprintf/g_snprintf/g, replaced some constant string lengths with
strlen(x).
* app/bezier_select.c
* app/blend.c
* app/boundary.c
* app/errors.[ch]
* app/free_select.c
* app/gimpbrushlist.c
* app/gimprc.c
* app/iscissors.c
* app/main.c
* app/patterns.[ch]
* app/text_tool.c: namespace fanaticism: prefixed all gimp error
functions with "gimp_" and formated the messages more uniformly.
* app/gradient.c
* app/gradient_select.c: same stuff as above for the ui
code. There are still some sub-dialogs which need cleanup.
Did some cleanup in most of these files: prototypes, removed tons
of #include's, i18n fixes, s/w/widget/ as above, indentation, ...
1999-07-23 00:21:10 +08:00
|
|
|
{ N_("/Select/---"), NULL, NULL, 0, "<Separator>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Select/Feather"), "<control><shift>F", select_feather_cmd_callback, 0 },
|
new ui for the "Layer Offset" dialog.
1999-07-22 Michael Natterer <mitschel@cs.tu-berlin.de>
* app/channel_ops.[ch]: new ui for the "Layer Offset" dialog.
* app/channels_dialog.c
* app/layers_dialog.c: major code cleanup: Folded some callbacks
into common ones, "widget" instead of "w", indentation, ...
* app/commands.c
* app/interface.[ch]
* app/global_edit.c: the query boxes must be shown by the caller
now. There's no need to split up the string for the message box
manually as the Gtk 1.2 label widget handles newlines corectly.
Added the "edge_lock" toggle to the "Shrink Selection" dialog.
Nicer spacings for the query and message boxes.
* app/ink.c: tried to grab the pointer in the blob preview but
failed. Left the code there as a reminder (commented out).
* app/menus.c: reordered <Image>/Select.
I was bored and grep-ed the sources for ancient or deprecated stuff:
* app/about_dialog.[ch]
* app/actionarea.[ch]
* app/app_procs.c
* app/brush_edit.c
* app/brush_select.c
* app/color_select.c
* app/convert.c
* app/devices.c
* app/gdisplay.c
* app/gdisplay_ops.c
* app/histogram_tool.[ch]
* app/info_window.c
* app/install.c
* app/ops_buttons.c
* app/palette.c
* app/palette_select.c
* app/paths_dialog.c
* app/pattern_select.c
* app/resize.c
* app/scale_toolc.c
* app/text_tool.c:
s/container_border_width/container_set_border_width/g,
s/sprintf/g_snprintf/g, replaced some constant string lengths with
strlen(x).
* app/bezier_select.c
* app/blend.c
* app/boundary.c
* app/errors.[ch]
* app/free_select.c
* app/gimpbrushlist.c
* app/gimprc.c
* app/iscissors.c
* app/main.c
* app/patterns.[ch]
* app/text_tool.c: namespace fanaticism: prefixed all gimp error
functions with "gimp_" and formated the messages more uniformly.
* app/gradient.c
* app/gradient_select.c: same stuff as above for the ui
code. There are still some sub-dialogs which need cleanup.
Did some cleanup in most of these files: prototypes, removed tons
of #include's, i18n fixes, s/w/widget/ as above, indentation, ...
1999-07-23 00:21:10 +08:00
|
|
|
{ N_("/Select/Sharpen"), "<control><shift>H", select_sharpen_cmd_callback, 0 },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Select/Shrink"), NULL, select_shrink_cmd_callback, 0 },
|
new ui for the "Layer Offset" dialog.
1999-07-22 Michael Natterer <mitschel@cs.tu-berlin.de>
* app/channel_ops.[ch]: new ui for the "Layer Offset" dialog.
* app/channels_dialog.c
* app/layers_dialog.c: major code cleanup: Folded some callbacks
into common ones, "widget" instead of "w", indentation, ...
* app/commands.c
* app/interface.[ch]
* app/global_edit.c: the query boxes must be shown by the caller
now. There's no need to split up the string for the message box
manually as the Gtk 1.2 label widget handles newlines corectly.
Added the "edge_lock" toggle to the "Shrink Selection" dialog.
Nicer spacings for the query and message boxes.
* app/ink.c: tried to grab the pointer in the blob preview but
failed. Left the code there as a reminder (commented out).
* app/menus.c: reordered <Image>/Select.
I was bored and grep-ed the sources for ancient or deprecated stuff:
* app/about_dialog.[ch]
* app/actionarea.[ch]
* app/app_procs.c
* app/brush_edit.c
* app/brush_select.c
* app/color_select.c
* app/convert.c
* app/devices.c
* app/gdisplay.c
* app/gdisplay_ops.c
* app/histogram_tool.[ch]
* app/info_window.c
* app/install.c
* app/ops_buttons.c
* app/palette.c
* app/palette_select.c
* app/paths_dialog.c
* app/pattern_select.c
* app/resize.c
* app/scale_toolc.c
* app/text_tool.c:
s/container_border_width/container_set_border_width/g,
s/sprintf/g_snprintf/g, replaced some constant string lengths with
strlen(x).
* app/bezier_select.c
* app/blend.c
* app/boundary.c
* app/errors.[ch]
* app/free_select.c
* app/gimpbrushlist.c
* app/gimprc.c
* app/iscissors.c
* app/main.c
* app/patterns.[ch]
* app/text_tool.c: namespace fanaticism: prefixed all gimp error
functions with "gimp_" and formated the messages more uniformly.
* app/gradient.c
* app/gradient_select.c: same stuff as above for the ui
code. There are still some sub-dialogs which need cleanup.
Did some cleanup in most of these files: prototypes, removed tons
of #include's, i18n fixes, s/w/widget/ as above, indentation, ...
1999-07-23 00:21:10 +08:00
|
|
|
{ N_("/Select/Grow"), NULL, select_grow_cmd_callback, 0 },
|
|
|
|
{ N_("/Select/Border"), "<control><shift>B", select_border_cmd_callback, 0 },
|
|
|
|
{ N_("/Select/---"), NULL, NULL, 0, "<Separator>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Select/Save To Channel"), NULL, select_save_cmd_callback, 0 },
|
1998-08-06 07:46:04 +08:00
|
|
|
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/View/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/View/Zoom In"), "equal", view_zoomin_cmd_callback, 0 },
|
|
|
|
{ N_("/View/Zoom Out"), "minus", view_zoomout_cmd_callback, 0 },
|
|
|
|
{ N_("/View/Zoom/16:1"), NULL, view_zoom_16_1_callback, 0 },
|
|
|
|
{ N_("/View/Zoom/8:1"), NULL, view_zoom_8_1_callback, 0 },
|
|
|
|
{ N_("/View/Zoom/4:1"), NULL, view_zoom_4_1_callback, 0 },
|
|
|
|
{ N_("/View/Zoom/2:1"), NULL, view_zoom_2_1_callback, 0 },
|
|
|
|
{ N_("/View/Zoom/1:1"), "1", view_zoom_1_1_callback, 0 },
|
1998-08-06 07:46:04 +08:00
|
|
|
{ N_("/View/Zoom/1:2"), NULL, view_zoom_1_2_callback, 0 },
|
|
|
|
{ N_("/View/Zoom/1:4"), NULL, view_zoom_1_4_callback, 0 },
|
|
|
|
{ N_("/View/Zoom/1:8"), NULL, view_zoom_1_8_callback, 0 },
|
|
|
|
{ N_("/View/Zoom/1:16"), NULL, view_zoom_1_16_callback, 0 },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/View/Dot for dot"), NULL, view_dot_for_dot_callback, 0, "<ToggleItem>"},
|
|
|
|
{ N_("/View/Window Info..."), "<control><shift>I", view_window_info_cmd_callback, 0 },
|
1999-08-13 06:21:04 +08:00
|
|
|
{ N_("/View/Window Nav..."), NULL, view_window_nav_cmd_callback, 0 },
|
1999-06-22 06:12:07 +08:00
|
|
|
|
|
|
|
{ N_("/View/---"), NULL, NULL, 0, "<Separator>" },
|
1999-07-03 01:40:10 +08:00
|
|
|
{ N_("/View/Toggle Selection"), "<control>T", view_toggle_selection_cmd_callback, 0, "<ToggleItem>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/View/Toggle Rulers"), "<control><shift>R", view_toggle_rulers_cmd_callback, 0, "<ToggleItem>" },
|
|
|
|
{ N_("/View/Toggle Statusbar"), "<control><shift>S", view_toggle_statusbar_cmd_callback, 0, "<ToggleItem>" },
|
|
|
|
{ N_("/View/Toggle Guides"), "<control><shift>T", view_toggle_guides_cmd_callback, 0, "<ToggleItem>" },
|
|
|
|
{ N_("/View/Snap To Guides"), NULL, view_snap_to_guides_cmd_callback, 0, "<ToggleItem>" },
|
1998-08-06 07:46:04 +08:00
|
|
|
{ N_("/View/---"), NULL, NULL, 0, "<Separator>" },
|
1999-06-22 06:12:07 +08:00
|
|
|
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/View/New View"), NULL, view_new_view_cmd_callback, 0 },
|
|
|
|
{ N_("/View/Shrink Wrap"), "<control>E", view_shrink_wrap_cmd_callback, 0 },
|
1999-08-31 10:00:34 +08:00
|
|
|
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/Image/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
|
|
|
{ N_("/Image/Colors/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Image/Colors/Equalize"), NULL, image_equalize_cmd_callback, 0 },
|
|
|
|
{ N_("/Image/Colors/Invert"), NULL, image_invert_cmd_callback, 0 },
|
1998-08-06 07:46:04 +08:00
|
|
|
{ N_("/Image/Colors/---"), NULL, NULL, 0, "<Separator>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Image/Colors/Desaturate"), NULL, image_desaturate_cmd_callback, 0 },
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/Image/Channel Ops/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Image/Channel Ops/Duplicate"), "<control>D", channel_ops_duplicate_cmd_callback, 0 },
|
|
|
|
{ N_("/Image/Channel Ops/Offset"), "<control><shift>O", channel_ops_offset_cmd_callback, 0 },
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/Image/Alpha/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Image/Alpha/Add Alpha Channel"), NULL, layers_add_alpha_channel_cmd_callback, 0 },
|
1998-06-07 21:55:36 +08:00
|
|
|
|
1998-08-06 07:46:04 +08:00
|
|
|
{ N_("/Image/---"), NULL, NULL, 0, "<Separator>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Image/RGB"), NULL, image_convert_rgb_cmd_callback, 0 },
|
|
|
|
{ N_("/Image/Grayscale"), NULL, image_convert_grayscale_cmd_callback, 0 },
|
|
|
|
{ N_("/Image/Indexed"), NULL, image_convert_indexed_cmd_callback, 0 },
|
1998-08-06 07:46:04 +08:00
|
|
|
{ N_("/Image/---"), NULL, NULL, 0, "<Separator>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Image/Resize"), NULL, image_resize_cmd_callback, 0 },
|
|
|
|
{ N_("/Image/Scale"), NULL, image_scale_cmd_callback, 0 },
|
1998-08-06 07:46:04 +08:00
|
|
|
{ N_("/Image/---"), NULL, NULL, 0, "<Separator>" },
|
1999-06-22 06:12:07 +08:00
|
|
|
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/Layers/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Layers/Layers & Channels..."), "<control>L", dialogs_lc_cmd_callback, 0 },
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/Layers/Stack/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1999-06-04 02:28:39 +08:00
|
|
|
{ N_("/Layers/Stack/Previous Layer"), "Prior", layers_previous_cmd_callback, 0 },
|
|
|
|
{ N_("/Layers/Stack/Next Layer"), "Next", layers_next_cmd_callback, 0 },
|
|
|
|
{ N_("/Layers/Stack/Raise Layer"), "<shift>Prior", layers_raise_cmd_callback, 0 },
|
|
|
|
{ N_("/Layers/Stack/Lower Layer"), "<shift>Next", layers_lower_cmd_callback, 0 },
|
|
|
|
{ N_("/Layers/Stack/Layer to Top"), "<control>Prior", layers_raise_to_top_cmd_callback, 0 },
|
|
|
|
{ N_("/Layers/Stack/Layer to Bottom"), "<control>Next", layers_lower_to_bottom_cmd_callback, 0 },
|
1999-06-02 04:19:49 +08:00
|
|
|
{ N_("/Layers/---"), NULL, NULL, 0, "<Separator>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Layers/Anchor Layer"), "<control>H", layers_anchor_cmd_callback, 0 },
|
|
|
|
{ N_("/Layers/Merge Visible Layers"), "<control>M", layers_merge_cmd_callback, 0 },
|
|
|
|
{ N_("/Layers/Flatten Image"), NULL, layers_flatten_cmd_callback, 0 },
|
|
|
|
{ N_("/Layers/Alpha To Selection"), NULL, layers_alpha_select_cmd_callback, 0 },
|
|
|
|
{ N_("/Layers/Mask To Selection"), NULL, layers_mask_select_cmd_callback, 0 },
|
|
|
|
{ N_("/Layers/Add Alpha Channel"), NULL, layers_add_alpha_channel_cmd_callback, 0 },
|
1999-06-07 01:26:51 +08:00
|
|
|
{ N_("/Layers/---"), NULL, NULL, 0, "<Separator>" },
|
1998-06-07 21:55:36 +08:00
|
|
|
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/Tools/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Tools/Toolbox"), NULL, toolbox_raise_callback, 0 },
|
|
|
|
{ N_("/Tools/Default Colors"), "D", tools_default_colors_cmd_callback, 0 },
|
|
|
|
{ N_("/Tools/Swap Colors"), "X", tools_swap_colors_cmd_callback, 0 },
|
1999-01-19 08:03:00 +08:00
|
|
|
{ N_("/Tools/---"), NULL, NULL, 0, "<Separator>" },
|
|
|
|
|
1999-06-22 06:12:07 +08:00
|
|
|
/* the tool entries themselves are built on the fly */
|
|
|
|
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/Filters/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Filters/Repeat last"), "<alt>F", filters_repeat_cmd_callback, 0x0 },
|
|
|
|
{ N_("/Filters/Re-show last"), "<alt><shift>F", filters_repeat_cmd_callback, 0x1 },
|
1998-08-06 07:46:04 +08:00
|
|
|
{ N_("/Filters/---"), NULL, NULL, 0, "<Separator>" },
|
1998-06-07 21:55:36 +08:00
|
|
|
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/Script-Fu/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1998-08-06 07:46:04 +08:00
|
|
|
{ N_("/Script-Fu/"), NULL, NULL, 0 },
|
1998-06-07 21:55:36 +08:00
|
|
|
|
1999-08-24 06:47:36 +08:00
|
|
|
{ N_("/Dialogs/tearoff1"), NULL, tearoff_cmd_callback, 0, "<Tearoff>" },
|
1999-04-11 05:51:25 +08:00
|
|
|
{ N_("/Dialogs/Brushes..."), "<control><shift>B", dialogs_brushes_cmd_callback, 0 },
|
|
|
|
{ N_("/Dialogs/Patterns..."), "<control><shift>P", dialogs_patterns_cmd_callback, 0 },
|
|
|
|
{ N_("/Dialogs/Palette..."), "<control>P", dialogs_palette_cmd_callback, 0 },
|
|
|
|
{ N_("/Dialogs/Gradient..."), "<control>G", dialogs_gradient_editor_cmd_callback, 0 },
|
|
|
|
{ N_("/Dialogs/Layers & Channels..."), "<control>L", dialogs_lc_cmd_callback, 0 },
|
|
|
|
{ N_("/Dialogs/Indexed Palette..."), NULL, dialogs_indexed_palette_cmd_callback, 0 },
|
|
|
|
{ N_("/Dialogs/Tool Options..."), NULL, dialogs_tools_options_cmd_callback, 0 },
|
|
|
|
{ N_("/Dialogs/Input Devices..."), NULL, dialogs_input_devices_cmd_callback, 0 },
|
|
|
|
{ N_("/Dialogs/Device Status..."), NULL, dialogs_device_status_cmd_callback, 0 },
|
1999-08-31 10:00:34 +08:00
|
|
|
{ N_("/Dialogs/Display Filters..."), NULL, dialogs_display_filters_cmd_callback, 0 }
|
1998-06-07 21:55:36 +08:00
|
|
|
};
|
|
|
|
static guint n_image_entries = sizeof (image_entries) / sizeof (image_entries[0]);
|
|
|
|
static GtkItemFactory *image_factory = NULL;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-06-22 04:04:04 +08:00
|
|
|
static GtkItemFactoryEntry load_entries[] =
|
1998-06-07 21:55:36 +08:00
|
|
|
{
|
1998-08-06 07:46:04 +08:00
|
|
|
{ N_("/Automatic"), NULL, file_load_by_extension_callback, 0 },
|
1998-06-07 21:55:36 +08:00
|
|
|
{ "/---", NULL, NULL, 0, "<Separator>" },
|
|
|
|
};
|
|
|
|
static guint n_load_entries = sizeof (load_entries) / sizeof (load_entries[0]);
|
|
|
|
static GtkItemFactory *load_factory = NULL;
|
1998-01-25 10:18:54 +08:00
|
|
|
|
1999-06-22 04:04:04 +08:00
|
|
|
static GtkItemFactoryEntry save_entries[] =
|
1998-06-07 21:55:36 +08:00
|
|
|
{
|
1998-08-06 07:46:04 +08:00
|
|
|
{ N_("/By extension"), NULL, file_save_by_extension_callback, 0 },
|
1998-06-07 21:55:36 +08:00
|
|
|
{ "/---", NULL, NULL, 0, "<Separator>" },
|
1997-11-25 06:05:25 +08:00
|
|
|
};
|
1998-06-07 21:55:36 +08:00
|
|
|
static guint n_save_entries = sizeof (save_entries) / sizeof (save_entries[0]);
|
|
|
|
static GtkItemFactory *save_factory = NULL;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-06-22 04:04:04 +08:00
|
|
|
static GtkItemFactoryEntry layers_entries[] =
|
1999-06-07 01:26:51 +08:00
|
|
|
{
|
|
|
|
{ N_("/New Layer"), "<control>N", layers_dialog_new_layer_callback, 0 },
|
|
|
|
{ N_("/Stack/Previous Layer"), "Prior", layers_dialog_previous_layer_callback, 0 },
|
|
|
|
{ N_("/Stack/Next Layer"), "Next", layers_dialog_next_layer_callback, 0 },
|
|
|
|
{ N_("/Stack/Raise Layer"), "<shift>Prior", layers_dialog_raise_layer_callback, 0 },
|
|
|
|
{ N_("/Stack/Lower Layer"), "<shift>Next", layers_dialog_lower_layer_callback, 0 },
|
|
|
|
{ N_("/Stack/Layer to Top"), "<control>Prior", layers_dialog_raise_layer_to_top_callback, 0 },
|
|
|
|
{ N_("/Stack/Layer to Bottom"), "<control>Next", layers_dialog_lower_layer_to_bottom_callback, 0 },
|
|
|
|
{ N_("/Duplicate Layer"), "<control>C", layers_dialog_duplicate_layer_callback, 0 },
|
|
|
|
{ N_("/Anchor Layer"), "<control>H", layers_dialog_anchor_layer_callback, 0 },
|
1999-06-22 06:12:07 +08:00
|
|
|
{ N_("/Delete Layer"), "<control>X", layers_dialog_delete_layer_callback, 0 },
|
1999-06-07 01:26:51 +08:00
|
|
|
{ "/---", NULL, NULL, 0, "<Separator>" },
|
|
|
|
{ N_("/Scale Layer"), "<control>S", layers_dialog_scale_layer_callback, 0 },
|
|
|
|
{ N_("/Resize Layer"), "<control>R", layers_dialog_resize_layer_callback, 0 },
|
|
|
|
{ "/---", NULL, NULL, 0, "<Separator>" },
|
|
|
|
{ N_("/Merge Visible Layers"), "<control>M", layers_dialog_merge_layers_callback, 0 },
|
|
|
|
{ N_("/Merge Down"), "<control><shift>M", layers_dialog_merge_down_callback, 0 },
|
|
|
|
{ N_("/Flatten Image"), NULL, layers_dialog_flatten_image_callback, 0 },
|
|
|
|
{ "/---", NULL, NULL, 0, "<Separator>" },
|
|
|
|
{ N_("/Add Layer Mask"), NULL, layers_dialog_add_layer_mask_callback, 0 },
|
|
|
|
{ N_("/Apply Layer Mask"), NULL, layers_dialog_apply_layer_mask_callback, 0 },
|
|
|
|
{ N_("/Alpha to Selection"), NULL, layers_dialog_alpha_select_callback, 0 },
|
|
|
|
{ N_("/Mask to Selection"), NULL, layers_dialog_mask_select_callback, 0 },
|
|
|
|
{ N_("/Add Alpha Channel"), NULL, layers_dialog_add_alpha_channel_callback, 0 }
|
|
|
|
};
|
|
|
|
static guint n_layers_entries = sizeof (layers_entries) / sizeof (layers_entries[0]);
|
|
|
|
static GtkItemFactory *layers_factory = NULL;
|
|
|
|
|
1999-06-22 04:04:04 +08:00
|
|
|
static GtkItemFactoryEntry channels_entries[] =
|
1999-06-07 01:26:51 +08:00
|
|
|
{
|
|
|
|
{ N_("/New Channel"), "<control>N", channels_dialog_new_channel_callback, 0 },
|
|
|
|
{ N_("/Raise Channel"), "<control>F", channels_dialog_raise_channel_callback, 0 },
|
|
|
|
{ N_("/Lower Channel"), "<control>B", channels_dialog_lower_channel_callback, 0 },
|
|
|
|
{ N_("/Duplicate Channel"), "<control>C", channels_dialog_duplicate_channel_callback, 0 },
|
|
|
|
{ "/---", NULL, NULL, 0, "<Separator>" },
|
|
|
|
{ N_("/Channel to Selection"), "<control>S", channels_dialog_channel_to_sel_callback, 0 },
|
|
|
|
{ N_("/Add to Selection"), NULL, channels_dialog_add_channel_to_sel_callback, 0 },
|
|
|
|
{ N_("/Subtract From Selection"), NULL, channels_dialog_sub_channel_from_sel_callback, 0 },
|
1999-06-22 06:12:07 +08:00
|
|
|
{ N_("/Intersect With Selection"), NULL, channels_dialog_sub_channel_from_sel_callback, 0 },
|
|
|
|
{ "/---", NULL, NULL, 0, "<Separator>" },
|
|
|
|
{ N_("/Delete Channel"), "<control>X", channels_dialog_delete_channel_callback, 0 }
|
1999-06-07 01:26:51 +08:00
|
|
|
};
|
|
|
|
static guint n_channels_entries = sizeof (channels_entries) / sizeof (channels_entries[0]);
|
|
|
|
static GtkItemFactory *channels_factory = NULL;
|
|
|
|
|
1999-06-22 04:04:04 +08:00
|
|
|
static GtkItemFactoryEntry paths_entries[] =
|
1999-06-07 01:26:51 +08:00
|
|
|
{
|
|
|
|
{ N_("/New Path"), "<control>N", paths_dialog_new_path_callback, 0 },
|
|
|
|
{ N_("/Duplicate Path"), "<control>U", paths_dialog_dup_path_callback, 0 },
|
|
|
|
{ N_("/Path to Selection"), "<control>S", paths_dialog_path_to_sel_callback, 0 },
|
|
|
|
{ N_("/Stroke Path"), "<control>T", paths_dialog_stroke_path_callback, 0 },
|
1999-06-22 06:12:07 +08:00
|
|
|
{ N_("/Delete Path"), "<control>X", paths_dialog_delete_path_callback, 0 },
|
1999-06-07 01:26:51 +08:00
|
|
|
{ "/---", NULL, NULL, 0, "<Separator>" },
|
|
|
|
{ N_("/Copy Path"), "<control>C", paths_dialog_copy_path_callback, 0 },
|
|
|
|
{ N_("/Paste Path"), "<control>V", paths_dialog_paste_path_callback, 0 },
|
|
|
|
{ N_("/Import Path"), "<control>I", paths_dialog_import_path_callback, 0 },
|
|
|
|
{ N_("/Export Path"), "<control>E", paths_dialog_export_path_callback, 0 }
|
|
|
|
};
|
|
|
|
static guint n_paths_entries = sizeof (paths_entries) / sizeof (paths_entries[0]);
|
|
|
|
static GtkItemFactory *paths_factory = NULL;
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
static int initialize = TRUE;
|
|
|
|
|
|
|
|
void
|
1999-06-07 01:26:51 +08:00
|
|
|
menus_get_toolbox_menubar (GtkWidget **menubar,
|
|
|
|
GtkAccelGroup **accel_group)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
|
|
|
if (initialize)
|
|
|
|
menus_init ();
|
1998-06-07 21:55:36 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
if (menubar)
|
1998-06-07 21:55:36 +08:00
|
|
|
*menubar = toolbox_factory->widget;
|
|
|
|
if (accel_group)
|
|
|
|
*accel_group = toolbox_factory->accel_group;
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-06-07 01:26:51 +08:00
|
|
|
menus_get_image_menu (GtkWidget **menu,
|
|
|
|
GtkAccelGroup **accel_group)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
|
|
|
if (initialize)
|
|
|
|
menus_init ();
|
|
|
|
|
|
|
|
if (menu)
|
1998-06-07 21:55:36 +08:00
|
|
|
*menu = image_factory->widget;
|
|
|
|
if (accel_group)
|
|
|
|
*accel_group = image_factory->accel_group;
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-06-07 01:26:51 +08:00
|
|
|
menus_get_load_menu (GtkWidget **menu,
|
|
|
|
GtkAccelGroup **accel_group)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
|
|
|
if (initialize)
|
|
|
|
menus_init ();
|
|
|
|
|
|
|
|
if (menu)
|
1998-06-07 21:55:36 +08:00
|
|
|
*menu = load_factory->widget;
|
|
|
|
if (accel_group)
|
|
|
|
*accel_group = load_factory->accel_group;
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-06-07 01:26:51 +08:00
|
|
|
menus_get_save_menu (GtkWidget **menu,
|
|
|
|
GtkAccelGroup **accel_group)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
|
|
|
if (initialize)
|
|
|
|
menus_init ();
|
|
|
|
|
|
|
|
if (menu)
|
1998-06-07 21:55:36 +08:00
|
|
|
*menu = save_factory->widget;
|
|
|
|
if (accel_group)
|
|
|
|
*accel_group = save_factory->accel_group;
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
1999-06-07 01:26:51 +08:00
|
|
|
void
|
|
|
|
menus_get_layers_menu (GtkWidget **menu,
|
|
|
|
GtkAccelGroup **accel_group)
|
|
|
|
{
|
|
|
|
if (initialize)
|
|
|
|
menus_init ();
|
|
|
|
|
|
|
|
if (menu)
|
|
|
|
*menu = layers_factory->widget;
|
|
|
|
if (accel_group)
|
|
|
|
*accel_group = layers_factory->accel_group;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
menus_get_channels_menu (GtkWidget **menu,
|
|
|
|
GtkAccelGroup **accel_group)
|
|
|
|
{
|
|
|
|
if (initialize)
|
|
|
|
menus_init ();
|
|
|
|
|
|
|
|
if (menu)
|
|
|
|
*menu = channels_factory->widget;
|
|
|
|
if (accel_group)
|
|
|
|
*accel_group = channels_factory->accel_group;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
menus_get_paths_menu (GtkWidget **menu,
|
|
|
|
GtkAccelGroup **accel_group)
|
|
|
|
{
|
|
|
|
if (initialize)
|
|
|
|
menus_init ();
|
|
|
|
|
|
|
|
if (menu)
|
|
|
|
*menu = paths_factory->widget;
|
|
|
|
if (accel_group)
|
|
|
|
*accel_group = paths_factory->accel_group;
|
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
void
|
|
|
|
menus_create (GtkMenuEntry *entries,
|
1999-06-07 01:26:51 +08:00
|
|
|
int n_menu_entries)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
1999-02-25 16:24:51 +08:00
|
|
|
GtkWidget *menu_item;
|
|
|
|
int i;
|
|
|
|
int redo_image_menu = FALSE;
|
1999-06-22 04:04:04 +08:00
|
|
|
GString *tearoff_path;
|
1999-02-25 16:24:51 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
if (initialize)
|
|
|
|
menus_init ();
|
|
|
|
|
1999-06-22 04:04:04 +08:00
|
|
|
tearoff_path = g_string_new ("");
|
1999-02-25 16:24:51 +08:00
|
|
|
|
1999-06-07 01:26:51 +08:00
|
|
|
for (i = 0; i < n_menu_entries; i++)
|
1999-06-22 04:04:04 +08:00
|
|
|
if (! strncmp (entries[i].path, "<Image>", 7))
|
|
|
|
{
|
|
|
|
char *p;
|
|
|
|
|
|
|
|
p = strchr (entries[i].path + 8, '/');
|
|
|
|
while (p)
|
|
|
|
{
|
|
|
|
g_string_assign (tearoff_path, entries[i].path + 7);
|
|
|
|
g_string_truncate (tearoff_path, p - entries[i].path + 1 - 7);
|
|
|
|
g_string_append (tearoff_path, "tearoff1");
|
|
|
|
|
|
|
|
if (! gtk_item_factory_get_widget (image_factory, tearoff_path->str))
|
|
|
|
{
|
|
|
|
GtkItemFactoryEntry entry = { NULL, NULL, NULL, 0, "<Tearoff>" };
|
|
|
|
entry.path = tearoff_path->str;
|
1999-08-24 06:47:36 +08:00
|
|
|
entry.callback = tearoff_cmd_callback;
|
|
|
|
gtk_item_factory_create_items_ac (image_factory, 1, &entry, NULL,2);
|
1999-06-22 04:04:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
p = strchr (p + 1, '/');
|
|
|
|
}
|
|
|
|
|
|
|
|
redo_image_menu = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
g_string_free (tearoff_path, TRUE);
|
|
|
|
|
|
|
|
gtk_item_factory_create_menu_entries (n_menu_entries, entries);
|
1999-02-25 16:24:51 +08:00
|
|
|
|
|
|
|
if (redo_image_menu)
|
|
|
|
{
|
1999-06-22 04:04:04 +08:00
|
|
|
menu_item = gtk_item_factory_get_widget (image_factory,
|
|
|
|
"<Image>/File/---moved");
|
|
|
|
if (menu_item && menu_item->parent)
|
|
|
|
gtk_menu_reorder_child (GTK_MENU (menu_item->parent), menu_item, -1);
|
|
|
|
|
|
|
|
menu_item = gtk_item_factory_get_widget (image_factory,
|
|
|
|
"<Image>/File/Close");
|
|
|
|
if (menu_item && menu_item->parent)
|
|
|
|
gtk_menu_reorder_child (GTK_MENU (menu_item->parent), menu_item, -1);
|
|
|
|
|
|
|
|
menu_item = gtk_item_factory_get_widget (image_factory,
|
|
|
|
"<Image>/File/Quit");
|
|
|
|
if (menu_item && menu_item->parent)
|
|
|
|
gtk_menu_reorder_child (GTK_MENU (menu_item->parent), menu_item, -1);
|
1999-02-25 16:24:51 +08:00
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
1998-06-22 04:17:21 +08:00
|
|
|
void
|
|
|
|
menus_tools_create (ToolInfo *tool_info)
|
|
|
|
{
|
|
|
|
GtkItemFactoryEntry entry;
|
1999-01-19 08:03:00 +08:00
|
|
|
|
1999-06-22 04:04:04 +08:00
|
|
|
entry.path = tool_info->menu_path;
|
1998-06-22 04:17:21 +08:00
|
|
|
entry.accelerator = tool_info->menu_accel;
|
|
|
|
entry.callback = tools_select_cmd_callback;
|
|
|
|
entry.callback_action = tool_info->tool_id;
|
|
|
|
entry.item_type = NULL;
|
1999-06-22 06:12:07 +08:00
|
|
|
|
1998-06-22 04:17:21 +08:00
|
|
|
gtk_item_factory_create_item (image_factory,
|
|
|
|
&entry,
|
1999-06-22 04:04:04 +08:00
|
|
|
(gpointer) tool_info,
|
1998-06-22 04:17:21 +08:00
|
|
|
2);
|
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
void
|
1999-06-07 05:58:48 +08:00
|
|
|
menus_set_sensitive (gchar *path,
|
|
|
|
gint sensitive)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
1998-06-07 21:55:36 +08:00
|
|
|
GtkItemFactory *ifactory;
|
|
|
|
GtkWidget *widget = NULL;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
if (initialize)
|
|
|
|
menus_init ();
|
|
|
|
|
1998-06-07 21:55:36 +08:00
|
|
|
ifactory = gtk_item_factory_from_path (path);
|
|
|
|
|
|
|
|
if (ifactory)
|
|
|
|
{
|
|
|
|
widget = gtk_item_factory_get_widget (ifactory, path);
|
1999-06-22 06:12:07 +08:00
|
|
|
|
1998-06-07 21:55:36 +08:00
|
|
|
gtk_widget_set_sensitive (widget, sensitive);
|
|
|
|
}
|
|
|
|
if (!ifactory || !widget)
|
1999-06-06 07:41:45 +08:00
|
|
|
g_warning ("Unable to set sensitivity for menu which doesn't exist:\n%s", path);
|
1999-06-22 06:12:07 +08:00
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-06-07 05:58:48 +08:00
|
|
|
/* The following function will enhance our localesystem because
|
|
|
|
we don't need to have our menuentries twice in our catalog */
|
|
|
|
|
|
|
|
void
|
1999-09-23 19:49:16 +08:00
|
|
|
menus_set_sensitive_glue (gchar *prepath,
|
|
|
|
gchar *path,
|
|
|
|
gint sensitive)
|
1999-06-07 05:58:48 +08:00
|
|
|
{
|
|
|
|
gchar *menupath;
|
1999-06-22 04:04:04 +08:00
|
|
|
|
1999-08-25 03:57:55 +08:00
|
|
|
menupath = g_strdup_printf ("%s%s", prepath, path);
|
1999-06-22 04:04:04 +08:00
|
|
|
menus_set_sensitive (menupath, sensitive);
|
|
|
|
g_free (menupath);
|
1999-06-07 05:58:48 +08:00
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
void
|
1999-06-07 05:58:48 +08:00
|
|
|
menus_set_state (gchar *path,
|
|
|
|
gint state)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
1998-06-07 21:55:36 +08:00
|
|
|
GtkItemFactory *ifactory;
|
|
|
|
GtkWidget *widget = NULL;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
if (initialize)
|
|
|
|
menus_init ();
|
|
|
|
|
1998-06-07 21:55:36 +08:00
|
|
|
ifactory = gtk_item_factory_from_path (path);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1998-06-07 21:55:36 +08:00
|
|
|
if (ifactory)
|
|
|
|
{
|
|
|
|
widget = gtk_item_factory_get_widget (ifactory, path);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1998-06-07 21:55:36 +08:00
|
|
|
if (widget && GTK_IS_CHECK_MENU_ITEM (widget))
|
1999-01-21 09:05:24 +08:00
|
|
|
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (widget), state);
|
1998-06-07 21:55:36 +08:00
|
|
|
else
|
|
|
|
widget = NULL;
|
|
|
|
}
|
|
|
|
if (!ifactory || !widget)
|
1999-06-06 07:41:45 +08:00
|
|
|
g_warning ("Unable to set state for menu which doesn't exist:\n%s\n", path);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
1999-06-07 05:58:48 +08:00
|
|
|
void
|
1999-09-23 19:49:16 +08:00
|
|
|
menus_set_state_glue (gchar *prepath,
|
|
|
|
gchar *path,
|
|
|
|
gint state)
|
1999-06-07 05:58:48 +08:00
|
|
|
{
|
|
|
|
gchar *menupath;
|
1999-06-22 04:04:04 +08:00
|
|
|
|
1999-08-25 03:57:55 +08:00
|
|
|
menupath = g_strdup_printf ("%s%s", prepath, path);
|
1999-06-22 04:04:04 +08:00
|
|
|
menus_set_state (menupath, state);
|
|
|
|
g_free (menupath);
|
1999-06-07 05:58:48 +08:00
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
void
|
|
|
|
menus_destroy (char *path)
|
|
|
|
{
|
|
|
|
if (initialize)
|
|
|
|
menus_init ();
|
|
|
|
|
1998-06-07 21:55:36 +08:00
|
|
|
gtk_item_factories_path_delete (NULL, path);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-06-05 10:11:16 +08:00
|
|
|
menus_quit (void)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
1998-06-07 21:55:36 +08:00
|
|
|
gchar *filename;
|
|
|
|
|
1999-03-07 20:56:03 +08:00
|
|
|
filename = gimp_personal_rc_file ("menurc");
|
1998-06-07 21:55:36 +08:00
|
|
|
gtk_item_factory_dump_rc (filename, NULL, TRUE);
|
|
|
|
g_free (filename);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1998-02-04 06:56:55 +08:00
|
|
|
if (!initialize)
|
|
|
|
{
|
1998-06-09 08:50:32 +08:00
|
|
|
gtk_object_unref (GTK_OBJECT (toolbox_factory));
|
|
|
|
gtk_object_unref (GTK_OBJECT (image_factory));
|
|
|
|
gtk_object_unref (GTK_OBJECT (load_factory));
|
|
|
|
gtk_object_unref (GTK_OBJECT (save_factory));
|
1999-06-07 01:26:51 +08:00
|
|
|
gtk_object_unref (GTK_OBJECT (layers_factory));
|
|
|
|
gtk_object_unref (GTK_OBJECT (channels_factory));
|
|
|
|
gtk_object_unref (GTK_OBJECT (paths_factory));
|
1998-02-04 06:56:55 +08:00
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
1998-07-12 13:18:17 +08:00
|
|
|
void
|
1999-06-22 04:04:04 +08:00
|
|
|
menus_last_opened_cmd_callback (GtkWidget *widget,
|
|
|
|
gpointer callback_data,
|
|
|
|
guint num)
|
1998-07-12 13:18:17 +08:00
|
|
|
{
|
|
|
|
gchar *filename, *raw_filename;
|
1999-07-15 00:02:32 +08:00
|
|
|
guint num_entries;
|
|
|
|
|
|
|
|
num_entries = g_slist_length (last_opened_raw_filenames);
|
|
|
|
if (num >= num_entries)
|
|
|
|
return;
|
1998-07-12 13:18:17 +08:00
|
|
|
|
|
|
|
raw_filename = ((GString *) g_slist_nth_data (last_opened_raw_filenames, num))->str;
|
1999-02-07 18:45:56 +08:00
|
|
|
filename = g_basename (raw_filename);
|
1998-07-12 13:18:17 +08:00
|
|
|
|
1999-09-12 01:26:05 +08:00
|
|
|
if (!file_open (raw_filename, raw_filename))
|
1998-08-06 07:46:04 +08:00
|
|
|
g_message (_("Error opening file: %s\n"), raw_filename);
|
1998-07-12 13:18:17 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-06-05 10:11:16 +08:00
|
|
|
menus_last_opened_update_labels (void)
|
1998-07-12 13:18:17 +08:00
|
|
|
{
|
1999-06-22 06:12:07 +08:00
|
|
|
GSList *filename_slist;
|
|
|
|
GString *entry_filename, *path;
|
|
|
|
GtkWidget *widget;
|
|
|
|
gint i;
|
|
|
|
guint num_entries;
|
1998-07-12 13:18:17 +08:00
|
|
|
|
|
|
|
entry_filename = g_string_new ("");
|
|
|
|
path = g_string_new ("");
|
|
|
|
|
|
|
|
filename_slist = last_opened_raw_filenames;
|
1998-07-14 06:31:45 +08:00
|
|
|
num_entries = g_slist_length (last_opened_raw_filenames);
|
1998-07-12 13:18:17 +08:00
|
|
|
|
|
|
|
for (i = 1; i <= num_entries; i++)
|
|
|
|
{
|
1999-02-07 18:45:56 +08:00
|
|
|
g_string_sprintf (entry_filename, "%d. %s", i, g_basename (((GString *) filename_slist->data)->str));
|
1998-07-12 13:18:17 +08:00
|
|
|
|
1999-08-25 03:57:55 +08:00
|
|
|
g_string_sprintf (path, N_("/File/MRU%02d"), i);
|
1998-07-12 13:18:17 +08:00
|
|
|
|
|
|
|
widget = gtk_item_factory_get_widget (toolbox_factory, path->str);
|
1999-08-25 03:57:55 +08:00
|
|
|
if (widget != NULL) {
|
|
|
|
gtk_widget_show (widget);
|
1998-07-12 13:18:17 +08:00
|
|
|
|
1999-08-25 03:57:55 +08:00
|
|
|
gtk_label_set (GTK_LABEL (GTK_BIN (widget)->child), entry_filename->str);
|
|
|
|
}
|
1998-07-12 13:18:17 +08:00
|
|
|
filename_slist = filename_slist->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
g_string_free (entry_filename, TRUE);
|
|
|
|
g_string_free (path, TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
menus_last_opened_add (gchar *filename)
|
|
|
|
{
|
1999-06-22 06:12:07 +08:00
|
|
|
GString *raw_filename;
|
|
|
|
GSList *item;
|
|
|
|
GtkWidget *widget;
|
|
|
|
guint num_entries;
|
1998-07-14 06:31:45 +08:00
|
|
|
|
1999-04-21 07:36:59 +08:00
|
|
|
/* ignore the add if we've already got the filename on the list */
|
|
|
|
item = last_opened_raw_filenames;
|
|
|
|
while (item)
|
1999-06-22 06:12:07 +08:00
|
|
|
{
|
1999-04-21 07:36:59 +08:00
|
|
|
raw_filename = item->data;
|
|
|
|
if (!strcmp (raw_filename->str, filename))
|
1999-06-22 06:12:07 +08:00
|
|
|
return;
|
1999-04-21 07:36:59 +08:00
|
|
|
item = g_slist_next (item);
|
1999-06-22 06:12:07 +08:00
|
|
|
}
|
1999-04-21 07:36:59 +08:00
|
|
|
|
1998-07-14 06:31:45 +08:00
|
|
|
num_entries = g_slist_length (last_opened_raw_filenames);
|
1998-07-12 13:18:17 +08:00
|
|
|
|
|
|
|
if (num_entries == last_opened_size)
|
|
|
|
{
|
1998-07-14 06:31:45 +08:00
|
|
|
g_slist_remove_link (last_opened_raw_filenames,
|
|
|
|
g_slist_last (last_opened_raw_filenames));
|
1998-07-12 13:18:17 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
raw_filename = g_string_new (filename);
|
|
|
|
last_opened_raw_filenames = g_slist_prepend (last_opened_raw_filenames, raw_filename);
|
|
|
|
|
|
|
|
if (num_entries == 0)
|
|
|
|
{
|
1999-08-25 03:57:55 +08:00
|
|
|
widget = gtk_item_factory_get_widget (toolbox_factory, file_menu_separator.path);
|
1998-07-12 13:18:17 +08:00
|
|
|
gtk_widget_show (widget);
|
|
|
|
}
|
|
|
|
|
|
|
|
menus_last_opened_update_labels ();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-01-27 14:30:37 +08:00
|
|
|
menus_init_mru (void)
|
1998-07-12 13:18:17 +08:00
|
|
|
{
|
|
|
|
gchar *paths, *accelerators;
|
|
|
|
gint i;
|
|
|
|
GtkItemFactoryEntry *last_opened_entries;
|
|
|
|
GtkWidget *widget;
|
|
|
|
|
|
|
|
last_opened_entries = g_new (GtkItemFactoryEntry, last_opened_size);
|
|
|
|
|
|
|
|
paths = g_new (gchar, last_opened_size * MRU_MENU_ENTRY_SIZE);
|
|
|
|
accelerators = g_new (gchar, 9 * MRU_MENU_ACCEL_SIZE);
|
|
|
|
|
|
|
|
for (i = 0; i < last_opened_size; i++)
|
|
|
|
{
|
|
|
|
gchar *path, *accelerator;
|
|
|
|
|
|
|
|
path = &paths[i * MRU_MENU_ENTRY_SIZE];
|
|
|
|
if (i < 9)
|
|
|
|
accelerator = &accelerators[i * MRU_MENU_ACCEL_SIZE];
|
|
|
|
else
|
|
|
|
accelerator = NULL;
|
|
|
|
|
|
|
|
last_opened_entries[i].path = path;
|
|
|
|
last_opened_entries[i].accelerator = accelerator;
|
|
|
|
last_opened_entries[i].callback = (GtkItemFactoryCallback) menus_last_opened_cmd_callback;
|
|
|
|
last_opened_entries[i].callback_action = i;
|
|
|
|
last_opened_entries[i].item_type = NULL;
|
|
|
|
|
1999-08-25 03:57:55 +08:00
|
|
|
g_snprintf (path, MRU_MENU_ENTRY_SIZE, N_("/File/MRU%02d"), i + 1);
|
1999-01-31 08:57:45 +08:00
|
|
|
if (accelerator != NULL)
|
|
|
|
g_snprintf (accelerator, MRU_MENU_ACCEL_SIZE, "<control>%d", i + 1);
|
1998-07-12 13:18:17 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
gtk_item_factory_create_items_ac (toolbox_factory, last_opened_size,
|
|
|
|
last_opened_entries, NULL, 2);
|
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
|
|
|
|
1998-07-12 13:18:17 +08:00
|
|
|
for (i=0; i < last_opened_size; i++)
|
|
|
|
{
|
|
|
|
widget = gtk_item_factory_get_widget (toolbox_factory,
|
|
|
|
last_opened_entries[i].path);
|
|
|
|
gtk_widget_hide (widget);
|
|
|
|
}
|
|
|
|
|
1999-08-25 03:57:55 +08:00
|
|
|
widget = gtk_item_factory_get_widget (toolbox_factory, file_menu_separator.path);
|
1998-07-12 13:18:17 +08:00
|
|
|
gtk_widget_hide (widget);
|
|
|
|
|
|
|
|
g_free (paths);
|
|
|
|
g_free (accelerators);
|
|
|
|
g_free (last_opened_entries);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
1999-06-05 10:11:16 +08:00
|
|
|
menus_init_toolbox (void)
|
1998-07-12 13:18:17 +08:00
|
|
|
{
|
|
|
|
toolbox_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<Toolbox>", NULL);
|
1999-06-22 04:04:04 +08:00
|
|
|
gtk_item_factory_set_translate_func (toolbox_factory, menu_translate,
|
|
|
|
NULL, NULL);
|
1998-07-12 13:18:17 +08:00
|
|
|
gtk_item_factory_create_items_ac (toolbox_factory, n_toolbox_entries,
|
1999-06-22 04:04:04 +08:00
|
|
|
toolbox_entries, NULL, 2);
|
1998-07-12 13:18:17 +08:00
|
|
|
menus_init_mru ();
|
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
|
|
|
|
1999-06-22 04:04:04 +08:00
|
|
|
gtk_item_factory_create_item (toolbox_factory, &file_menu_separator, NULL, 2);
|
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
|
|
|
|
1999-06-22 04:04:04 +08:00
|
|
|
gtk_item_factory_create_item (toolbox_factory, &toolbox_end, NULL, 2);
|
1998-08-06 07:46:04 +08:00
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
static void
|
1999-06-22 04:04:04 +08:00
|
|
|
menus_init (void)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
1998-06-22 04:17:21 +08:00
|
|
|
int i;
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
if (initialize)
|
|
|
|
{
|
1998-06-07 21:55:36 +08:00
|
|
|
gchar *filename;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1998-06-07 21:55:36 +08:00
|
|
|
initialize = FALSE;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1998-07-12 13:18:17 +08:00
|
|
|
menus_init_toolbox ();
|
|
|
|
|
1998-06-07 21:55:36 +08:00
|
|
|
image_factory = gtk_item_factory_new (GTK_TYPE_MENU, "<Image>", NULL);
|
1999-06-22 04:04:04 +08:00
|
|
|
gtk_item_factory_set_translate_func (image_factory,
|
|
|
|
menu_translate,
|
|
|
|
NULL, NULL);
|
1998-06-07 21:55:36 +08:00
|
|
|
gtk_item_factory_create_items_ac (image_factory,
|
|
|
|
n_image_entries,
|
1999-06-22 04:04:04 +08:00
|
|
|
image_entries,
|
1998-06-07 21:55:36 +08:00
|
|
|
NULL, 2);
|
1999-06-07 01:26:51 +08:00
|
|
|
|
1998-06-07 21:55:36 +08:00
|
|
|
load_factory = gtk_item_factory_new (GTK_TYPE_MENU, "<Load>", NULL);
|
1999-06-22 04:04:04 +08:00
|
|
|
gtk_item_factory_set_translate_func (load_factory,
|
|
|
|
menu_translate,
|
|
|
|
NULL, NULL);
|
1998-06-07 21:55:36 +08:00
|
|
|
gtk_item_factory_create_items_ac (load_factory,
|
|
|
|
n_load_entries,
|
1999-06-22 04:04:04 +08:00
|
|
|
load_entries,
|
1998-06-07 21:55:36 +08:00
|
|
|
NULL, 2);
|
1999-06-07 01:26:51 +08:00
|
|
|
|
1998-06-07 21:55:36 +08:00
|
|
|
save_factory = gtk_item_factory_new (GTK_TYPE_MENU, "<Save>", NULL);
|
1999-06-22 04:04:04 +08:00
|
|
|
gtk_item_factory_set_translate_func (save_factory,
|
|
|
|
menu_translate,
|
|
|
|
NULL, NULL);
|
1998-06-07 21:55:36 +08:00
|
|
|
gtk_item_factory_create_items_ac (save_factory,
|
|
|
|
n_save_entries,
|
1999-06-22 04:04:04 +08:00
|
|
|
save_entries,
|
1998-06-07 21:55:36 +08:00
|
|
|
NULL, 2);
|
1999-06-07 01:26:51 +08:00
|
|
|
|
|
|
|
layers_factory = gtk_item_factory_new (GTK_TYPE_MENU, "<Layers>", NULL);
|
1999-06-22 04:04:04 +08:00
|
|
|
gtk_item_factory_set_translate_func (layers_factory,
|
|
|
|
menu_translate,
|
|
|
|
NULL, NULL);
|
1999-06-07 01:26:51 +08:00
|
|
|
gtk_item_factory_create_items_ac (layers_factory,
|
|
|
|
n_layers_entries,
|
1999-06-22 04:04:04 +08:00
|
|
|
layers_entries,
|
1999-06-07 01:26:51 +08:00
|
|
|
NULL, 2);
|
|
|
|
|
|
|
|
channels_factory = gtk_item_factory_new (GTK_TYPE_MENU, "<Channels>", NULL);
|
1999-06-22 04:04:04 +08:00
|
|
|
gtk_item_factory_set_translate_func (channels_factory,
|
|
|
|
menu_translate,
|
|
|
|
NULL, NULL);
|
1999-06-07 01:26:51 +08:00
|
|
|
gtk_item_factory_create_items_ac (channels_factory,
|
|
|
|
n_channels_entries,
|
1999-06-22 04:04:04 +08:00
|
|
|
channels_entries,
|
1999-06-07 01:26:51 +08:00
|
|
|
NULL, 2);
|
|
|
|
|
|
|
|
paths_factory = gtk_item_factory_new (GTK_TYPE_MENU, "<Paths>", NULL);
|
1999-06-22 04:04:04 +08:00
|
|
|
gtk_item_factory_set_translate_func (paths_factory,
|
|
|
|
menu_translate,
|
|
|
|
NULL, NULL);
|
1999-06-07 01:26:51 +08:00
|
|
|
gtk_item_factory_create_items_ac (paths_factory,
|
|
|
|
n_paths_entries,
|
1999-06-22 04:04:04 +08:00
|
|
|
paths_entries,
|
1999-06-07 01:26:51 +08:00
|
|
|
NULL, 2);
|
|
|
|
|
1998-06-22 04:17:21 +08:00
|
|
|
for (i = 0; i < num_tools; i++)
|
|
|
|
{
|
|
|
|
/* FIXME this need to use access functions to check a flag */
|
|
|
|
if (tool_info[i].menu_path)
|
1999-06-22 06:12:07 +08:00
|
|
|
menus_tools_create (tool_info + i);
|
1998-06-22 04:17:21 +08:00
|
|
|
}
|
1999-06-07 01:26:51 +08:00
|
|
|
|
1999-03-07 20:56:03 +08:00
|
|
|
filename = gimp_personal_rc_file ("menurc");
|
1998-06-07 21:55:36 +08:00
|
|
|
gtk_item_factory_parse_rc (filename);
|
|
|
|
g_free (filename);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
}
|
1999-06-22 04:04:04 +08:00
|
|
|
|
|
|
|
static gchar *
|
|
|
|
menu_translate (const gchar *path,
|
|
|
|
gpointer data)
|
|
|
|
{
|
1999-08-28 05:06:00 +08:00
|
|
|
static gchar menupath[256];
|
|
|
|
gchar *retval;
|
|
|
|
|
|
|
|
retval = gettext (path);
|
|
|
|
if (!strcmp (path, retval))
|
|
|
|
{
|
|
|
|
strcpy (menupath, "<Image>");
|
|
|
|
strncat (menupath, path, sizeof(menupath) - sizeof("<Image>"));
|
|
|
|
retval = dgettext ("gimp-std-plugins", menupath) + strlen ("<Image>");
|
|
|
|
|
|
|
|
if (!strcmp (path, retval))
|
|
|
|
{
|
|
|
|
strcpy (menupath, "<Toolbox>");
|
|
|
|
strncat (menupath, path, sizeof(menupath) - sizeof("<Toolbox>"));
|
|
|
|
retval = dgettext ("gimp-std-plugins", menupath) + strlen ("<Toolbox>");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return retval;
|
1999-06-22 04:04:04 +08:00
|
|
|
}
|
1999-08-24 06:47:36 +08:00
|
|
|
|
|
|
|
static gint
|
|
|
|
tearoff_delete_cb (GtkWidget *widget,
|
|
|
|
GdkEvent *event,
|
|
|
|
gpointer data)
|
|
|
|
{
|
|
|
|
/* Unregister if dialog is deleted as well */
|
|
|
|
dialog_unregister((GtkWidget *)data);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
tearoff_cmd_callback (GtkWidget *widget,
|
|
|
|
gpointer callback_data,
|
|
|
|
guint callback_action)
|
|
|
|
{
|
|
|
|
if(GTK_IS_TEAROFF_MENU_ITEM(widget))
|
|
|
|
{
|
|
|
|
GtkTearoffMenuItem *tomi = (GtkTearoffMenuItem *)widget;
|
|
|
|
|
|
|
|
if(tomi->torn_off)
|
|
|
|
{
|
|
|
|
GtkWidget *top = gtk_widget_get_toplevel(widget);
|
|
|
|
|
|
|
|
/* This should be a window */
|
|
|
|
if(!GTK_IS_WINDOW(top))
|
|
|
|
{
|
|
|
|
g_message(_("tearoff menu not in top level window"));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
dialog_register(top);
|
|
|
|
gtk_signal_connect_object (GTK_OBJECT (top),
|
|
|
|
"delete_event",
|
|
|
|
GTK_SIGNAL_FUNC (tearoff_delete_cb),
|
|
|
|
GTK_OBJECT (top));
|
|
|
|
|
|
|
|
gtk_object_set_data (GTK_OBJECT (widget),"tearoff_menu_top",top);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
GtkWidget *top = (GtkWidget *)gtk_object_get_data (GTK_OBJECT (widget),"tearoff_menu_top");
|
|
|
|
if(!top)
|
|
|
|
{
|
|
|
|
g_message(_("can't unregister tearoff menu top level window"));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
dialog_unregister(top);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|