/** * gtk_source_map_set_view: * @map: a #GtkSourceMap * @view: a #GtkSourceView * * Sets the view that @map will be doing the mapping to. * * Since: 3.18 */ void gtk_source_map_set_view (GtkSourceMap *map, GtkSourceView *view) { GtkSourceMapPrivate *priv; g_return_if_fail (GTK_SOURCE_IS_MAP (map)); g_return_if_fail (view == NULL || GTK_SOURCE_IS_VIEW (view)); priv = gtk_source_map_get_instance_private (map); if (priv->view == view) { return; } if (priv->view != NULL) { disconnect_view (map); } if (view != NULL) { connect_view (map, view); } g_object_notify_by_pspec (G_OBJECT (map), pspecs[PROP_VIEW]); }
static gchar * ide_xml_indenter_format (IdeIndenter *indenter, GtkTextView *view, GtkTextIter *begin, GtkTextIter *end, gint *cursor_offset, GdkEventKey *trigger) { IdeXmlIndenter *xml = (IdeXmlIndenter *)indenter; guint tab_width = 2; gint indent_width = -1; g_return_val_if_fail (IDE_IS_XML_INDENTER (xml), NULL); *cursor_offset = 0; if (GTK_SOURCE_IS_VIEW (view)) { tab_width = gtk_source_view_get_tab_width (GTK_SOURCE_VIEW (view)); indent_width = gtk_source_view_get_indent_width (GTK_SOURCE_VIEW (view)); if (indent_width != -1) tab_width = indent_width; } xml->tab_width = tab_width; xml->use_tabs = !gtk_source_view_get_insert_spaces_instead_of_tabs (GTK_SOURCE_VIEW (view)); if (indent_width <= 0) xml->indent_width = tab_width; else xml->indent_width = indent_width; /* do nothing if we are in a cdata section */ if (text_iter_in_cdata (begin)) return NULL; switch (trigger->keyval) { case GDK_KEY_Return: case GDK_KEY_KP_Enter: if ((trigger->state & GDK_SHIFT_MASK) == 0) return ide_xml_indenter_indent (xml, begin, end, cursor_offset); return NULL; case GDK_KEY_slash: return ide_xml_indenter_maybe_unindent (xml, begin, end); case GDK_KEY_greater: return ide_xml_indenter_maybe_add_closing (xml, begin, end, cursor_offset); default: g_return_val_if_reached (NULL); } return NULL; }
static void ide_source_map__view_notify_buffer (IdeSourceMap *self, GParamSpec *pspec, GtkSourceView *view) { GtkTextBuffer *buffer; g_assert (IDE_IS_SOURCE_MAP (self)); g_assert (GTK_SOURCE_IS_VIEW (view)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); if (IDE_IS_BUFFER (buffer)) dzl_signal_group_set_target (self->buffer_signals, buffer); }
/* * GtkWindow catches keybindings for the menu items _before_ passing them to * the focused widget. This is unfortunate and means that pressing ctrl+V * in an entry on a panel ends up pasting text in the TextView. * Here we override GtkWindow's handler to do the same things that it * does, but in the opposite order and then we chain up to the grand * parent handler, skipping gtk_window_key_press_event. */ static gboolean anjuta_window_key_press_event (GtkWidget *widget, GdkEventKey *event) { static gpointer grand_parent_class = NULL; GtkWindow *window = GTK_WINDOW (widget); GtkWidget *focus = gtk_window_get_focus (window); gboolean handled = FALSE; if (grand_parent_class == NULL) grand_parent_class = g_type_class_peek_parent (parent_class); /* Special case the editor - it catches all shortcuts otherwise */ if (GTK_SOURCE_IS_VIEW (focus)) if (gtk_window_activate_key (window, event)) return TRUE; switch (event->keyval) { case GDK_KEY_F1: case GDK_KEY_F2: case GDK_KEY_F3: case GDK_KEY_F4: case GDK_KEY_F5: case GDK_KEY_F6: case GDK_KEY_F7: case GDK_KEY_F8: case GDK_KEY_F9: case GDK_KEY_F10: case GDK_KEY_F11: case GDK_KEY_F12: /* handle mnemonics and accelerators */ if (!handled) handled = gtk_window_activate_key (window, event); break; default: /* handle focus widget key events */ if (!handled) handled = gtk_window_propagate_key_event (window, event); } /* handle mnemonics and accelerators */ if (!handled) handled = gtk_window_activate_key (window, event); /* Chain up, invokes binding set */ if (!handled) handled = GTK_WIDGET_CLASS (grand_parent_class)->key_press_event (widget, event); return handled; }
gboolean gb_vim_execute (GtkSourceView *source_view, const gchar *line, GError **error) { GtkTextBuffer *buffer; g_autofree gchar *name_slice = NULL; const GbVimCommand *command; const gchar *command_name = line; const gchar *options; g_autofree gchar *all_options = NULL; gboolean result; g_return_val_if_fail (GTK_SOURCE_IS_VIEW (source_view), FALSE); g_return_val_if_fail (line, FALSE); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (source_view)); if (!GTK_SOURCE_IS_BUFFER (buffer)) { g_set_error (error, GB_VIM_ERROR, GB_VIM_ERROR_NOT_SOURCE_VIEW, _("vim mode requires GtkSourceView")); return FALSE; } for (options = line; *options; options = g_utf8_next_char (options)) { gunichar ch; ch = g_utf8_get_char (options); if (g_unichar_isspace (ch)) break; } if (g_unichar_isspace (g_utf8_get_char (options))) { command_name = name_slice = g_strndup (line, options - line); options = g_utf8_next_char (options); } command = lookup_command (command_name); if (command == NULL) { if (looks_like_search_and_replace (line)) return gb_vim_command_search (source_view, line, "", error); g_set_error (error, GB_VIM_ERROR, GB_VIM_ERROR_NOT_FOUND, _("Not an editor command: %s"), command_name); return FALSE; } if (command->options_sup) all_options = g_strconcat (options, " ", command->options_sup, NULL); else all_options = g_strdup (options); result = command->func (source_view, command_name, all_options, error); g_free (command->options_sup); return result; }
static gboolean gb_vim_command_set (GtkSourceView *source_view, const gchar *command, const gchar *options, GError **error) { gboolean ret = FALSE; gchar **parts; gsize i; g_assert (GTK_SOURCE_IS_VIEW (source_view)); g_assert (command); g_assert (options); parts = g_strsplit (options, " ", 0); if (parts [0] == NULL) { ret = TRUE; goto cleanup; } for (i = 0; parts [i]; i++) { const GbVimSet *set; const gchar *value = ""; gchar *key = parts [i]; gchar *tmp; for (tmp = key; *tmp; tmp = g_utf8_next_char (tmp)) { if (g_utf8_get_char (tmp) == '=') { *tmp = '\0'; value = ++tmp; break; } } set = lookup_set (key); if (set == NULL) { g_set_error (error, GB_VIM_ERROR, GB_VIM_ERROR_UNKNOWN_OPTION, _("Unknown option: %s"), key); goto cleanup; } if (!set->func (source_view, key, value, error)) goto cleanup; } ret = TRUE; cleanup: g_strfreev (parts); return ret; }