static void ide_preferences_builtin_register_languages (IdePreferences *preferences) { GtkSourceLanguageManager *manager; const gchar * const *language_ids; g_autoptr(GHashTable) sections = NULL; guint section_count = 0; gint i; sections = g_hash_table_new (g_str_hash, g_str_equal); ide_preferences_add_page (preferences, "languages", _("Programming Languages"), 200); manager = gtk_source_language_manager_get_default (); language_ids = gtk_source_language_manager_get_language_ids (manager); for (i = 0; language_ids [i]; i++) { IdePreferencesLanguageRow *row; GtkSourceLanguage *language; const gchar *name; const gchar *section; if (ide_str_equal0 (language_ids [i], "def")) continue; language = gtk_source_language_manager_get_language (manager, language_ids [i]); name = gtk_source_language_get_name (language); section = gtk_source_language_get_section (language); if (!g_hash_table_contains (sections, section)) { ide_preferences_add_list_group (preferences, "languages", section, section, section_count++); g_hash_table_insert (sections, (gchar *)section, NULL); } row = g_object_new (IDE_TYPE_PREFERENCES_LANGUAGE_ROW, "id", language_ids [i], "title", name, "visible", TRUE, NULL); ide_preferences_add_custom (preferences, "languages", section, GTK_WIDGET (row), NULL, 0); } ide_preferences_add_page (preferences, "languages.id", NULL, 0); ide_preferences_add_list_group (preferences, "languages.id", "basic", NULL, 0); ide_preferences_add_switch (preferences, "languages.id", "basic", "org.gnome.builder.editor.language", "trim-trailing-whitespace", "/org/gnome/builder/editor/language/{id}/", NULL, _("Trim trailing whitespace"), _("Upon saving, trailing whitespace from modified lines will be trimmed."), NULL, 10); ide_preferences_add_switch (preferences, "languages.id", "basic", "org.gnome.builder.editor.language", "overwrite-braces", "/org/gnome/builder/editor/language/{id}/", NULL, _("Overwrite Braces"), _("Overwrite closing braces"), NULL, 20); ide_preferences_add_list_group (preferences, "languages.id", "margin", _("Margins"), 0); ide_preferences_add_radio (preferences, "languages.id", "margin", "org.gnome.builder.editor.language", "show-right-margin", "/org/gnome/builder/editor/language/{id}/", NULL, _("Show right margin"), NULL, NULL, 0); ide_preferences_add_spin_button (preferences, "languages.id", "margin", "org.gnome.builder.editor.language", "right-margin-position", "/org/gnome/builder/editor/language/{id}/", _("Right margin position"), _("Position in spaces for the right margin"), NULL, 10); ide_preferences_add_list_group (preferences, "languages.id", "indentation", _("Indentation"), 100); ide_preferences_add_spin_button (preferences, "languages.id", "indentation", "org.gnome.builder.editor.language", "tab-width", "/org/gnome/builder/editor/language/{id}/", _("Tab width"), _("Width of a tab character in spaces"), NULL, 10); ide_preferences_add_radio (preferences, "languages.id", "indentation", "org.gnome.builder.editor.language", "insert-spaces-instead-of-tabs", "/org/gnome/builder/editor/language/{id}/", NULL, _("Insert spaces instead of tabs"), _("Prefer spaces over use of tabs"), NULL, 20); ide_preferences_add_radio (preferences, "languages.id", "indentation", "org.gnome.builder.editor.language", "auto-indent", "/org/gnome/builder/editor/language/{id}/", NULL, _("Automatically indent"), _("Indent source code as you type"), NULL, 30); }
GSList * cedit_language_manager_list_languages_sorted (GtkSourceLanguageManager *lm, gboolean include_hidden) { GSList *languages = NULL; const gchar * const *ids; ids = gtk_source_language_manager_get_language_ids (lm); if (ids == NULL) return NULL; while (*ids != NULL) { GtkSourceLanguage *lang; lang = gtk_source_language_manager_get_language (lm, *ids); #if GTK_CHECK_VERSION (3, 0, 0) g_return_val_if_fail (GTK_SOURCE_IS_LANGUAGE (lang), NULL); #else g_return_val_if_fail (GTK_IS_SOURCE_LANGUAGE (lang), NULL); #endif ++ids; if (include_hidden || !gtk_source_language_get_hidden (lang)) { languages = g_slist_prepend (languages, lang); } } return g_slist_sort (languages, (GCompareFunc)language_compare); }
static gboolean is_a_lang_id (GbBeautifierWorkbenchAddin *self, const gchar *lang_id) { GtkSourceLanguageManager *lang_manager; const gchar * const * lang_ids = NULL; lang_manager = gtk_source_language_manager_get_default (); lang_ids = gtk_source_language_manager_get_language_ids (lang_manager); return g_strv_contains (lang_ids, lang_id); }
GtkSourceLanguage * gitg_utils_get_language(gchar const *content_type) { if (!gitg_utils_can_display_content_type(content_type)) return NULL; gchar *mime = g_content_type_get_mime_type(content_type); GtkSourceLanguageManager *manager = gtk_source_language_manager_get_default(); gchar const * const *ids = gtk_source_language_manager_get_language_ids(manager); gchar const *ptr; GtkSourceLanguage *ret; while ((ptr = *ids++)) { ret = gtk_source_language_manager_get_language(manager, ptr); gchar **mime_types = gtk_source_language_get_mime_types(ret); gchar **types = mime_types; gchar *m; if (types) { while ((m = *types++)) { if (strcmp(mime, m) == 0) { g_free(mime); g_strfreev(mime_types); return ret; } } g_strfreev(mime_types); } ret = NULL; } g_free(mime); return NULL; }
PUSS_EXPORT void* puss_plugin_create(Puss* app) { GTree* sections; GtkSourceLanguageManager* lm; const gchar* const* ids; const gchar* const* id; GtkSourceLanguage* lang; const gchar* name; gchar* action_name; GtkAction* action; const gchar* section; GList* section_list; GtkUIManager* ui_mgr; IToolMenuAction* tool_menu_interface; GString* gstr; gchar* ui_info; GError* err; tool_menu_interface = app->extend_query("puss_controls", INTERFACE_TOOL_MENU_ACTION); if( !tool_menu_interface ) return 0; bindtextdomain(TEXT_DOMAIN, app->get_locale_path()); bind_textdomain_codeset(TEXT_DOMAIN, "UTF-8"); g_self = g_new0(LanguageSelector, 1); g_self->app = app; g_self->action_group = gtk_action_group_new("puss_language_selector_action_group"); // set select language menu sections = g_tree_new_full((GCompareDataFunc)&g_ascii_strcasecmp, 0, 0, (GDestroyNotify)g_list_free); lm = gtk_source_language_manager_get_default(); ids = gtk_source_language_manager_get_language_ids(lm); g_self->last_favory_lang = gtk_source_language_manager_get_language(lm, "cpp"); for( id=ids; *id; ++id ) { lang = gtk_source_language_manager_get_language(lm, *id); if( lang ) { name = gtk_source_language_get_name(lang); action_name = g_strdup_printf("pls_lang_%s", name); action = gtk_action_new(action_name, name, NULL, NULL); g_signal_connect(action, "activate", G_CALLBACK(&pls_lang_active), lang); gtk_action_group_add_action(g_self->action_group, action); g_object_unref(action); g_free(action_name); section = gtk_source_language_get_section(lang); section_list = (GList*)g_tree_lookup(sections, section); if( section_list ) { g_tree_steal(sections, section); } else { action_name = g_strdup_printf("pls_sec_%s", section); action = GTK_ACTION(gtk_action_new(action_name, section, NULL, NULL)); gtk_action_group_add_action(g_self->action_group, action); g_object_unref(action); g_free(action_name); } section_list = g_list_insert_sorted(section_list, (gchar*)name, (GCompareFunc)&g_ascii_strcasecmp); g_tree_insert(sections, (gchar*)section, section_list); } } // insert language selector menu-tool-button // action = gtk_action_new("language_selector_open", _("Language"), _("select high-light source language, default use last"), GTK_STOCK_SELECT_COLOR); gtk_action_group_add_action(g_self->action_group, action); g_object_unref(action); action = GTK_ACTION( g_object_new(tool_menu_interface->get_type () , "name", "language_selector_toolmenu_open" , "label", _("Language") , "tooltip", _("select high-light source language, default use last") , "stock-id", GTK_STOCK_SELECT_COLOR , NULL) ); g_signal_connect(action, "activate", G_CALLBACK(&pls_lang_active), 0); gtk_action_group_add_action(g_self->action_group, action); g_object_unref(action); ui_mgr = GTK_UI_MANAGER(gtk_builder_get_object(app->get_ui_builder(), "main_ui_manager")); gtk_ui_manager_insert_action_group(ui_mgr, g_self->action_group, 0); // main selector menu gstr= g_string_new(NULL); g_tree_foreach(sections, (GTraverseFunc)&fill_language_section, gstr); g_tree_destroy(sections); ui_info = g_strdup_printf( "<ui>" " <menubar name='main_menubar'>" " <menu action='view_menu'>\n" " <placeholder name='view_menu_extend_place'>" " <menu action='language_selector_open'>" " %s" " <placeholder name='pls_favory_menu_place'>" " </placeholder>" " </menu>" " </placeholder>" " </menu>" " </menubar>" "" " <toolbar name='main_toolbar'>" " <placeholder name='main_toolbar_view_place'>" " <toolitem action='language_selector_toolmenu_open'>" " <menu action='language_selector_toolmenu_open'>" " %s" " <placeholder name='pls_favory_toolmenu_place'>" " </placeholder>" " </menu>" " </toolitem>" " </placeholder>" " </toolbar>" "</ui>" , gstr->str , gstr->str ); //g_print(ui_info); err = 0; g_self->merge_id = gtk_ui_manager_add_ui_from_string(ui_mgr, ui_info, -1, &err); if( err ) { g_printerr("%s", err->message); g_error_free(err); } g_free(ui_info); g_string_free(gstr, TRUE); gtk_ui_manager_ensure_update(ui_mgr); fill_favory_language_menu(); return g_self; }
/** * gb_view_source_init: * @: (in): A #GbViewSource. * * Initializes the newly created #GbViewSource instance. */ static void gb_view_source_init (GbViewSource *source) { GbViewSourcePrivate *priv; GtkWidget *overlay; ENTRY; source->priv = priv = G_TYPE_INSTANCE_GET_PRIVATE(source, GB_TYPE_VIEW_SOURCE, GbViewSourcePrivate); g_object_set(source, "icon-name", GTK_STOCK_FILE, "name", _("Unsaved Document"), NULL); priv->buffer = gtk_source_buffer_new(NULL); g_signal_connect_swapped(priv->buffer, "notify::cursor-position", G_CALLBACK(gb_view_source_notify_cursor), source); g_signal_connect_swapped(priv->buffer, "modified-changed", G_CALLBACK(gb_view_source_buffer_modified_changed), source); overlay = g_object_new(GTK_TYPE_OVERLAY, "visible", TRUE, NULL); g_signal_connect(overlay, "get-child-position", G_CALLBACK(gb_view_source_position_progress), NULL); gtk_container_add_with_properties(GTK_CONTAINER(source), overlay, "left-attach", 0, "width", 1, "top-attach", 0, "height", 1, NULL); priv->vpaned = g_object_new(GTK_TYPE_VPANED, "visible", TRUE, NULL); gtk_container_add(GTK_CONTAINER(overlay), priv->vpaned); priv->progress = g_object_new(GB_TYPE_PROGRESS_BAR, "visible", FALSE, NULL); gtk_overlay_add_overlay(GTK_OVERLAY(overlay), priv->progress); priv->scroller1 = g_object_new(gb_get_scrolled_window_gtype(), "expand", TRUE, "visible", TRUE, NULL); gtk_container_add_with_properties(GTK_CONTAINER(priv->vpaned), priv->scroller1, "shrink", FALSE, "resize", TRUE, NULL); priv->source1 = gb_view_source_create_source_view(source); gtk_container_add(GTK_CONTAINER(priv->scroller1), priv->source1); { GtkSourceLanguageManager *langs = gtk_source_language_manager_get_default(); const gchar * const * ids = gtk_source_language_manager_get_language_ids(langs); GtkSourceLanguage *lang; const gchar *section; GHashTable *section_menu; GPtrArray *sorted; GtkWidget *controls = gb_view_get_controls(GB_VIEW(source)); GtkWidget *menu; GtkWidget *mitem; GtkWidget *submenu; guint i; section_menu = g_hash_table_new(g_str_hash, g_str_equal); menu = gtk_menu_new(); sorted = g_ptr_array_new(); for (i = 0; ids[i]; i++) { lang = gtk_source_language_manager_get_language(langs, ids[i]); g_ptr_array_add(sorted, lang); } g_ptr_array_sort(sorted, lang_sort_func); for (i = 0; i < sorted->len; i++) { lang = g_ptr_array_index(sorted, i); section = gtk_source_language_get_section(lang); if (!(submenu = g_hash_table_lookup(section_menu, section))) { submenu = gtk_menu_new(); mitem = g_object_new(GTK_TYPE_MENU_ITEM, "label", section, "submenu", submenu, "visible", TRUE, NULL); gtk_container_add(GTK_CONTAINER(menu), mitem); g_hash_table_insert(section_menu, (gchar*)section, submenu); } mitem = g_object_new(GTK_TYPE_MENU_ITEM, "label", gtk_source_language_get_name(lang), "visible", TRUE, NULL); g_signal_connect_swapped(mitem, "activate", G_CALLBACK(gb_view_source_lang_activate), source); g_object_set_data(G_OBJECT(mitem), "language-id", (gchar *)gtk_source_language_get_id(lang)); gtk_container_add(GTK_CONTAINER(submenu), mitem); } g_ptr_array_free(sorted, TRUE); priv->lang_combo = g_object_new(GB_TYPE_MENU_BUTTON, "hexpand", FALSE, "label", "", "menu", menu, "tooltip-text", _("Set source language."), "visible", TRUE, NULL); gb_widget_shrink_font( gb_menu_button_get_label_widget( GB_MENU_BUTTON(priv->lang_combo))); gtk_style_context_add_class(gtk_widget_get_style_context(priv->lang_combo), GB_STYLE_CLASS_TOP_BAR); gtk_container_add_with_properties(GTK_CONTAINER(controls), priv->lang_combo, "expand", FALSE, NULL); g_hash_table_unref(section_menu); } { GtkWidget *controls = gb_view_get_controls(GB_VIEW(source)); GtkWidget *b; GtkWidget *item; GtkWidget *menu; GtkWidget *group = NULL; gboolean active; gchar *str; int tabs[] = { 2, 3, 4, 5, 8, 0 }; int i; b = g_object_new(GB_TYPE_MENU_BUTTON, "hexpand", FALSE, "label", "4", "tooltip-text", _("Set tab-character width."), "visible", TRUE, "width-request", 45, NULL); menu = gtk_menu_new(); for (i = 0; tabs[i]; i++) { str = g_strdup_printf("%d", tabs[i]); item = g_object_new(GTK_TYPE_RADIO_MENU_ITEM, "group", group, "label", str, "visible", TRUE, NULL); if (!group) { group = item; } active = (tabs[i] == gtk_source_view_get_tab_width( GTK_SOURCE_VIEW(priv->source1))); g_object_set(item, "active", active, NULL); if (active) { g_object_set(b, "label", str, NULL); } g_signal_connect(item, "activate", G_CALLBACK(gb_view_source_tab_size_activate), source); gtk_container_add(GTK_CONTAINER(menu), item); g_free(str); } g_object_set(b, "menu", menu, NULL); item = g_object_new(GTK_TYPE_SEPARATOR_MENU_ITEM, "visible", TRUE, NULL); gtk_container_add(GTK_CONTAINER(menu), item); item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM, "active", TRUE, "label", _("Use Spaces"), "visible", TRUE, NULL); g_signal_connect(item, "toggled", G_CALLBACK(gb_view_source_spaces_toggled), source); gtk_container_add(GTK_CONTAINER(menu), item); gb_widget_shrink_font(gb_menu_button_get_label_widget(GB_MENU_BUTTON(b))); gtk_style_context_add_class(gtk_widget_get_style_context(b), GB_STYLE_CLASS_TOP_BAR); gtk_container_add_with_properties(GTK_CONTAINER(controls), b, "expand", FALSE, NULL); priv->size_combo = b; } { GtkWidget *controls = gb_view_get_controls(GB_VIEW(source)); GtkWidget *img; GtkWidget *b; img = g_object_new(GTK_TYPE_IMAGE, "icon-name", "gb-split", "icon-size", GTK_ICON_SIZE_MENU, "visible", TRUE, NULL); b = g_object_new(GTK_TYPE_TOGGLE_BUTTON, "child", img, "tooltip-text", _("Split the editor into two views."), "visible", TRUE, NULL); gtk_style_context_add_class(gtk_widget_get_style_context(b), GB_STYLE_CLASS_TOP_BAR); gtk_container_add_with_properties(GTK_CONTAINER(controls), b, "expand", FALSE, NULL); g_signal_connect(b, "toggled", G_CALLBACK(split_toggled), source); } { GtkWidget *hbox; GtkWidget *vp; GtkWidget *c; hbox = g_object_new(GTK_TYPE_HBOX, "height-request", 30, "visible", TRUE, NULL); gtk_container_add_with_properties(GTK_CONTAINER(source), hbox, "height", 1, "left-attach", 0, "top-attach", 1, "width", 1, NULL); gtk_container_add(GTK_CONTAINER(hbox), (c = g_object_new(GTK_TYPE_COMBO_BOX, "visible", TRUE, NULL))); gtk_style_context_add_class(gtk_widget_get_style_context(c), GB_STYLE_CLASS_BOTTOM_BAR); vp = g_object_new(GTK_TYPE_VIEWPORT, "visible", TRUE, NULL); gtk_style_context_add_class(gtk_widget_get_style_context(vp), GB_STYLE_CLASS_BOTTOM_BAR); gtk_container_add_with_properties(GTK_CONTAINER(hbox), vp, "expand", FALSE, "fill", TRUE, NULL); priv->pos_label = g_object_new(GTK_TYPE_LABEL, "label", _("Line 1, Column 1"), "visible", TRUE, "xalign", 1.0f, "xpad", 6, NULL); gb_widget_shrink_font(priv->pos_label); gtk_container_add(GTK_CONTAINER(vp), priv->pos_label); } priv->theme_handler = g_signal_connect_swapped(gtk_settings_get_default(), "notify::gtk-application-prefer-dark-theme", G_CALLBACK(gb_view_source_update_style), source); EXIT; }
Gobby::MenuManager::MenuManager(GtkSourceLanguageManager* language_manager) { Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_resource( "/de/0x539/gobby/ui/menu.ui"); m_app_menu = Glib::RefPtr<Gio::Menu>::cast_dynamic( builder->get_object("appmenu")); m_menu = Glib::RefPtr<Gio::Menu>::cast_dynamic( builder->get_object("winmenu")); Glib::RefPtr<Gio::Menu> highlight_mode_menu = get_highlight_mode_menu(); const gchar* const* language_ids = gtk_source_language_manager_get_language_ids( language_manager); if(language_ids != NULL) { typedef std::list<GtkSourceLanguage*> LanguageList; typedef std::map<std::string, LanguageList> LanguageMap; LanguageMap languages; for(const gchar* const* id = language_ids; *id != NULL; ++id) { GtkSourceLanguage* language = gtk_source_language_manager_get_language( language_manager, *id); if(gtk_source_language_get_hidden(language)) continue; const std::string section = gtk_source_language_get_section(language); languages[section].push_back(language); } for(LanguageMap::iterator iter = languages.begin(); iter != languages.end(); ++iter) { Glib::RefPtr<Gio::Menu> submenu(Gio::Menu::create()); LanguageList& list = iter->second; list.sort(language_sort_func); for(LanguageList::const_iterator liter = list.begin(); liter != list.end(); ++liter) { GtkSourceLanguage* language = *liter; const std::string id = gtk_source_language_get_id(language); const std::string name = gtk_source_language_get_name(language); Glib::RefPtr<Gio::MenuItem> item( Gio::MenuItem::create( name, Glib::ustring::compose( "win.highlight-mode" "('%1')", id))); submenu->append_item(item); } highlight_mode_menu->append_submenu( iter->first, submenu); } } }