📄 gtkedit.c
字号:
return def;}void gtk_edit_dialog_message (guchar * heading, char *fmt,...){ gchar s[8192]; va_list ap; va_start (ap, fmt); vsprintf (s, fmt, ap); va_end (ap); gtk_dialog_cauldron ( heading, GTK_CAULDRON_TOPLEVEL | GTK_CAULDRON_GRAB, " [ ( %Ld )xf ]xf / ( %Bxfgq )f ", s, GNOME_STOCK_BUTTON_CANCEL ); return;}int gtk_edit_dialog_query (guchar * heading, guchar * first,...){ char *buttons[16]; char s[1024], *r; int n; va_list ap; va_start (ap, first); n = 0; while ((buttons[n++] = va_arg (ap, char *)) && n < 15); va_end (ap); buttons[n] = 0; strcpy (s, " [ ( %Lxf )xf ]xf / ( "); n = 0; while (buttons[n]) { strcat (s, " %Bqxf "); if (!buttons[n]) break; strcat (s, " ||"); n++; } strcat (s, " )f"); r = gtk_dialog_cauldron (heading, GTK_CAULDRON_TOPLEVEL | GTK_CAULDRON_IGNOREENTER | GTK_CAULDRON_GRAB, s, first, buttons[0], buttons[1], buttons[2], buttons[3], buttons[4], buttons[5], buttons[6], buttons[7], buttons[8], buttons[9], buttons[10], buttons[11], buttons[12], buttons[13], buttons[14], buttons[15] ); n = 0; if (r == GTK_CAULDRON_ESCAPE || !r || r == GNOME_STOCK_BUTTON_CANCEL) return -1; while (buttons[n]) { if (!strcmp (buttons[n], r)) return n; n++; } return -1;}void gtk_edit_dialog_error (guchar * heading, char *fmt, ...){ gchar s[8192]; va_list ap; va_start (ap, fmt); vsprintf (s, fmt, ap); va_end (ap); gtk_dialog_cauldron ( heading, GTK_CAULDRON_TOPLEVEL | GTK_CAULDRON_GRAB, " [ ( %Ld )xf ]xf / ( %Bxfgq )f", s, GNOME_STOCK_BUTTON_CANCEL ); return;}struct color_matrix_struct { unsigned int R, G, B;} color_matrix[27] ={ {0, 0, 0}, {0, 0, 128}, {0, 0, 255}, {0, 139, 0}, {0, 139, 139}, {0, 154, 205}, {0, 255, 0}, {0, 250, 154}, {0, 255, 255}, {139, 37, 0}, {139, 0, 139}, {125, 38, 205}, {139, 117, 0}, {127, 127, 127}, {123, 104, 238}, {127, 255, 0}, {135, 206, 235}, {127, 255, 212}, {238, 0, 0}, {238, 18, 137}, {238, 0, 238}, {205, 102, 0}, {248, 183, 183}, {224, 102, 255}, {238, 238, 0}, {238, 230, 133}, {248, 248, 255}};void gtk_edit_alloc_colors (GtkEdit *edit, GdkColormap *colormap){ int i; for (i = 0; i < 27; i++) { edit->color[i].red = (gushort) color_matrix[i].R << 8; edit->color[i].green = (gushort) color_matrix[i].G << 8; edit->color[i].blue = (gushort) color_matrix[i].B << 8; if (!gdk_color_alloc (colormap, &edit->color[i])) g_warning ("cannot allocate color"); } edit->color_last_pixel = 27;}int allocate_color (WEdit *edit, gchar *color){ GtkEdit *win; win = (GtkEdit *) edit->widget; if (!color) return NO_COLOR; if (*color >= '0' && *color <= '9') { return atoi (color); } else { int i; GdkColor c; if (!color) return NO_COLOR; if (!gdk_color_parse (color, &c)) return NO_COLOR; if (!gdk_color_alloc (gtk_widget_get_colormap(GTK_WIDGET (edit->widget)), &c)) return NO_COLOR; for (i = 0; i < (GTK_EDIT (edit->widget))->color_last_pixel; i++) if (color_palette (i) == c.pixel) return i; GTK_EDIT (edit->widget)->color[(GTK_EDIT (edit->widget))->color_last_pixel].pixel = c.pixel; return (GTK_EDIT (edit->widget))->color_last_pixel++; }}static void gtk_edit_set_position (GtkEditable * editable, gint position){ WEdit *edit; edit = GTK_EDIT(editable)->editor; edit_cursor_move (edit, position - edit->curs1); edit_move_to_prev_col (edit, 0); edit->force |= REDRAW_PAGE; edit->search_start = 0; edit_update_curs_row (edit);}/* returns 1 on error */gint gtk_edit_load_file_from_filename (GtkWidget * edit, const gchar * filename){ return edit_load_file_from_filename (GTK_EDIT (edit)->editor, (char *) filename);}void gtk_edit_set_top_line (GtkWidget * e, int line){ WEdit *edit; edit = GTK_EDIT (e)->editor; edit_move_display (edit, line - edit->num_widget_lines / 2 - 1); edit->force |= REDRAW_COMPLETELY;}void gtk_edit_set_cursor_line (GtkWidget * e, int line){ WEdit *edit; edit = GTK_EDIT (e)->editor; edit_move_to_line (edit, line - 1); edit->force |= REDRAW_COMPLETELY;}void about_cb (GtkWidget * widget, void *data){ gtk_dialog_cauldron ("About", GTK_CAULDRON_TOPLEVEL | GTK_CAULDRON_GRAB, " [ (Mcedit - an editor for the midnight commander\n\ported from Cooledit - a user friendly text editor for the X Window System.)xf ]xf / ( %Bgqxf )f ", GNOME_STOCK_BUTTON_OK); return;}void gtk_edit_command (GtkEdit * edit, gint command){ int r; gtk_widget_grab_focus (GTK_WIDGET (edit)); r = edit_execute_key_command (edit->editor, command, -1); if (r) edit_update_screen (edit->editor);}void gtk_edit_quit (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Exit); }void gtk_edit_load_file (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Load); }void gtk_edit_new_file (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_New); }void gtk_edit_save_file (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Save); }void gtk_edit_save_as_file (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Save_As); }void gtk_edit_insert_file (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Insert_File); }void gtk_edit_copy_to_file (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Save_Block); }void gtk_edit_clip_cut (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_XCut); }void gtk_edit_clip_copy (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_XStore); }void gtk_edit_clip_paste (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_XPaste); }void gtk_edit_toggle_mark (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Mark); }void gtk_edit_search (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Find); }void gtk_edit_search_again (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Find_Again); }void gtk_edit_replace (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Replace); }void gtk_edit_copy (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Copy); }void gtk_edit_move (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Move); }void gtk_edit_delete (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Remove); }void gtk_edit_undo (GtkEdit * widget, void *data) { GtkEdit *edit = (GtkEdit *) data ; gtk_edit_command (edit, CK_Undo); }#if 0struct _GnomeUIInfo { GnomeUIInfoType type; gchar *label; gchar *hint; /* For toolbar items, the tooltip. For menu items, the status bar message */ /* For an item, toggleitem, or radioitem, procedure to call when activated. For a subtree, point to the GnomeUIInfo array for that subtree. For a radioitem lead entry, point to the GnomeUIInfo array for the radio item group. For the radioitem array, procedure to call when activated. For a help item, specifies the help node to load (or NULL for main prog's name) For builder data, point to the GnomeUIBuilderData structure for the following items */ gpointer moreinfo; gpointer user_data; gpointer unused_data; GnomeUIPixmapType pixmap_type; /* Either * a pointer to the char for the pixmap (GNOME_APP_PIXMAP_DATA), * a char* for the filename (GNOME_APP_PIXMAP_FILENAME), * or a char* for the stock pixmap name (GNOME_APP_PIXMAP_STOCK). */ gpointer pixmap_info; guint accelerator_key; /* Accelerator key... Set to 0 to ignore */ GdkModifierType ac_mods; /* An OR of the masks for the accelerator */ GtkWidget *widget; /* Filled in by gnome_app_create* */};#endiftypedef struct _TbItems TbItems;struct _TbItems { char *key, *text, *tooltip, *icon; void (*cb) (GtkEdit *, void *); GtkWidget *widget; /* will be filled in */};#define TB_PROP 7static TbItems tb_items[] ={ {"F1", "Help", "Interactive help browser", GNOME_STOCK_MENU_BLANK, 0, NULL}, {"F2", "Save", "Save to current file name", GNOME_STOCK_MENU_SAVE, gtk_edit_save_file, NULL}, {"F3", "Mark", "Toggle In/Off invisible marker to highlight text", GNOME_STOCK_MENU_BLANK, gtk_edit_toggle_mark, NULL}, {"F4", "Replc", "Find and replace strings/regular expressions", GNOME_STOCK_MENU_SRCHRPL, gtk_edit_replace, NULL}, {"F5", "Copy", "Copy highlighted block to cursor postition", GNOME_STOCK_MENU_COPY, gtk_edit_copy, NULL}, {"F6", "Move", "Copy highlighted block to cursor postition", GNOME_STOCK_MENU_BLANK, gtk_edit_move, NULL}, {"F7", "Find", "Find strings/regular expressions", GNOME_STOCK_MENU_SEARCH, gtk_edit_search, NULL}, {"F8", "Dlete", "Delete highlighted text", GNOME_STOCK_MENU_BLANK, gtk_edit_delete, NULL}, {"F9", "Menu", "Pull down menu", GNOME_STOCK_MENU_BLANK, /* gtk_edit_menu*/ 0, NULL}, {"F10", "Quit", "Exit editor", GNOME_STOCK_MENU_QUIT, gtk_edit_quit, NULL}, {0, 0, 0, 0, 0, 0}};static GtkWidget *create_toolbar (GtkWidget * window, GtkEdit * edit){ GtkWidget *toolbar; TbItems *t; toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_BOTH); for (t = &tb_items[0]; t->text; t++) { t->widget = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), t->text, t->tooltip, 0, gnome_stock_pixmap_widget (window, t->icon), t->cb, t->cb ? edit : 0); } return toolbar;}/* returns 1 on error */int edit (const char *file, int line){ GtkWidget *app; GtkWidget *edit, *statusbar; edit = gtk_edit_new (NULL, NULL); app = gnome_app_new ("mcedit", (char *) (file ? file : "Mcedit")); { GnomeUIInfo file_menu[] = { { GNOME_APP_UI_ITEM, N_ ("Open/Load"), N_ ("Load a different/new file"), gtk_edit_load_file, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_OPEN, 'O', GDK_CONTROL_MASK, 0 }, { GNOME_APP_UI_ITEM, N_ ("New"), N_ ("Clear the edit buffer"), gtk_edit_new_file, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_NEW, 'N', GDK_CONTROL_MASK, 0 }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_ ("Save"), N_ ("Save the current edit buffer to filename"), gtk_edit_save_file, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_SAVE, 'S', GDK_CONTROL_MASK, 0 }, { GNOME_APP_UI_ITEM, N_ ("Save As"), N_ ("Save the current edit buffer as filename"), gtk_edit_save_as_file, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_SAVE_AS, 'A', GDK_CONTROL_MASK, 0 }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_ ("Insert File"), N_ ("Insert text from a file"), gtk_edit_insert_file, edit, 0, 0, 0, 'I', GDK_CONTROL_MASK, 0 }, { GNOME_APP_UI_ITEM, N_ ("Copy to file"), N_ ("copy a block to a file"), gtk_edit_copy_to_file, edit, 0, 0, 0, 'C', GDK_CONTROL_MASK, 0 }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_ ("Exit"), N_ ("Quit editor"), gtk_edit_quit, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_QUIT, 'Q', GDK_CONTROL_MASK, NULL }, GNOMEUIINFO_END }; GnomeUIInfo edit_menu[] = { { GNOME_APP_UI_ITEM, N_ ("Copy"), N_ ("Copy selection to clipboard"), gtk_edit_clip_copy, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_COPY, 'C', GDK_CONTROL_MASK, 0 }, { GNOME_APP_UI_ITEM, N_ ("Cut"), N_ ("Cut selection to clipboard"), gtk_edit_clip_cut, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_CUT, 'X', GDK_CONTROL_MASK, 0 }, { GNOME_APP_UI_ITEM, N_ ("Paste"), N_ ("Paste clipboard"), gtk_edit_clip_paste, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PASTE, 'V', GDK_CONTROL_MASK, 0 }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_ ("Undo"), N_ ("Go back in time one key press"), gtk_edit_undo, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PASTE, 'U', GDK_CONTROL_MASK, 0 }, GNOMEUIINFO_END }; GnomeUIInfo search_menu[] = { { GNOME_APP_UI_ITEM, N_ ("Find"), N_ ("Find string/regular expression"), gtk_edit_search, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_OPEN, 'F', GDK_MOD1_MASK, 0 }, { GNOME_APP_UI_ITEM, N_ ("Find again"), N_ ("Repeat most recent search"), gtk_edit_search_again, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_NEW, 'A', GDK_MOD1_MASK, 0 }, { GNOME_APP_UI_ITEM, N_ ("Search/Replace"), N_ ("Find and replace text/regular expressions"), gtk_edit_replace, edit, 0, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_SAVE, 'R', GDK_MOD1_MASK, 0 }, GNOMEUIINFO_END }; GnomeUIInfo help_menu[] = { { GNOME_APP_UI_ITEM, N_ ("About..."), N_ ("Info about GNOME hello"), about_cb, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_ABOUT, 0, (GdkModifierType) 0, NULL },#if 0 GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_HELP ("hello"),#endif GNOMEUIINFO_END }; GnomeUIInfo main_menu[] = { GNOMEUIINFO_SUBTREE (N_ ("File"), file_menu), GNOMEUIINFO_SUBTREE (N_ ("Edit"), edit_menu), GNOMEUIINFO_SUBTREE (N_ ("Search/Replace"), search_menu), GNOMEUIINFO_SUBTREE (N_ ("Help"), help_menu), GNOMEUIINFO_END }; gtk_widget_realize (app); statusbar = gtk_label_new (file ? file : "<no-filename>"); gtk_widget_set_usize (app, 400, 400); gnome_app_create_menus (GNOME_APP (app), main_menu); gnome_app_set_contents (GNOME_APP (app), edit); gnome_app_set_statusbar (GNOME_APP (app), GTK_WIDGET (statusbar)); GTK_EDIT (edit)->menubar = GNOME_APP (app)->menubar; GTK_EDIT (edit)->status = statusbar; gnome_app_set_toolbar(GNOME_APP (app), GTK_TOOLBAR(create_toolbar(app, GTK_EDIT (edit)))); GTK_EDIT(edit)->destroy_me = gtk_widget_destroy; GTK_EDIT(edit)->destroy_me_user_data = app; gtk_widget_show (edit); gtk_widget_realize (edit); if (file) if (*file) if (gtk_edit_load_file_from_filename (edit, file)) { gtk_widget_destroy (app); return 1; } gtk_edit_set_cursor_line (edit, line); gtk_widget_show (app); gtk_widget_grab_focus (edit); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -