static gboolean ide_editor_frame__search_key_press_event (IdeEditorFrame *self, GdkEventKey *event, GdTaggedEntry *entry) { g_assert (IDE_IS_EDITOR_FRAME (self)); g_assert (GD_IS_TAGGED_ENTRY (entry)); switch (event->keyval) { case GDK_KEY_Escape: ide_widget_action (GTK_WIDGET (self->search_frame), "search-entry", "exit-search", NULL); return GDK_EVENT_STOP; case GDK_KEY_KP_Enter: case GDK_KEY_Return: /* stash the search string for later */ g_free (self->previous_search_string); g_object_get (self->search_entry, "text", &self->previous_search_string, NULL); ide_widget_action (GTK_WIDGET (self), "frame", "next-search-result", NULL); gtk_widget_grab_focus (GTK_WIDGET (self->source_view)); return GDK_EVENT_STOP; case GDK_KEY_Down: ide_widget_action (GTK_WIDGET (self), "frame", "next-search-result", NULL); return GDK_EVENT_STOP; case GDK_KEY_Up: ide_widget_action (GTK_WIDGET (self), "frame", "previous-search-result", NULL); return GDK_EVENT_STOP; default: { if (!ide_source_view_get_rubberband_search (self->source_view)) ide_source_view_set_rubberband_search (self->source_view, TRUE); } break; } return GDK_EVENT_PROPAGATE; }
static gboolean gb_vim_command_buffers (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { g_assert (GTK_IS_WIDGET (active_widget)); ide_widget_action (GTK_WIDGET (active_widget), "view-stack", "show-list", NULL); return TRUE; }
static gboolean gb_vim_command_make (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { g_assert (GTK_IS_WIDGET (active_widget)); /* TODO: check for an open project */ ide_widget_action (GTK_WIDGET (active_widget), "workbench", "build", NULL); return TRUE; }
static void child_exited_cb (VteTerminal *terminal, gint exit_status, GbTerminalView *self) { g_assert (VTE_IS_TERMINAL (terminal)); g_assert (GB_IS_TERMINAL_VIEW (self)); if (!ide_widget_action (GTK_WIDGET (self), "view-stack", "close", NULL)) { if (!gtk_widget_in_destruction (GTK_WIDGET (terminal))) gb_terminal_respawn (self, terminal); } }
static gboolean gb_vim_command_tabe (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { g_assert (GTK_IS_WIDGET (active_widget)); if (!ide_str_empty0 (options)) return gb_vim_command_edit (active_widget, command, options, error); ide_widget_action (GTK_WIDGET (active_widget), "perspective", "new-file", NULL); return TRUE; }
static gboolean gb_vim_command_split (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { g_assert (GTK_IS_WIDGET (active_widget)); if (IDE_IS_LAYOUT_VIEW (active_widget)) ide_widget_action (GTK_WIDGET (active_widget), "view-stack", "split-down", NULL); else return gb_vim_set_no_view_error (error); return TRUE; }
static gboolean gb_vim_command_help (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { GVariant *param; g_assert (GTK_IS_WIDGET (active_widget)); param = g_variant_new_string (options); ide_widget_action (GTK_WIDGET (active_widget), "workbench", "search-docs", param); return TRUE; }
static void ide_editor_frame__drag_data_received (IdeEditorFrame *self, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint timestamp, GtkWidget *widget) { gchar **uri_list; g_return_if_fail (IDE_IS_SOURCE_VIEW (widget)); switch (info) { case TARGET_URI_LIST: uri_list = ide_dnd_get_uri_list (selection_data); if (uri_list) { GVariantBuilder *builder; GVariant *variant; guint i; builder = g_variant_builder_new (G_VARIANT_TYPE_STRING_ARRAY); for (i = 0; uri_list [i]; i++) g_variant_builder_add (builder, "s", uri_list [i]); variant = g_variant_builder_end (builder); g_variant_builder_unref (builder); g_strfreev (uri_list); /* * request that we get focus first so the workbench will deliver the * document to us in the case it is not already open */ gtk_widget_grab_focus (GTK_WIDGET (self)); ide_widget_action (GTK_WIDGET (self), "workbench", "open-uri-list", variant); } gtk_drag_finish (context, TRUE, FALSE, timestamp); break; default: break; } }
static void search_revealer_on_child_revealed_changed (IdeEditorFrame *self, GParamSpec *pspec, GtkRevealer *search_revealer) { g_assert (IDE_IS_EDITOR_FRAME (self)); g_assert (GTK_IS_REVEALER (search_revealer)); if (self->pending_replace_confirm == 0 || !gtk_revealer_get_child_revealed (search_revealer)) return; ide_widget_action (GTK_WIDGET (self), "frame", "next-search-result", NULL); self->pending_replace_confirm--; gtk_widget_grab_focus (GTK_WIDGET (self->replace_button)); }
static gboolean gb_vim_command_edit (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { IdeWorkbench *workbench; IdeContext *context; IdeVcs *vcs; GFile *workdir; GFile *file = NULL; g_assert (GTK_IS_WIDGET (active_widget)); if (ide_str_empty0 (options)) { ide_widget_action (GTK_WIDGET (active_widget), "win", "open-with-dialog", NULL); return TRUE; } if (!(workbench = ide_widget_get_workbench (active_widget)) || !(context = ide_workbench_get_context (workbench)) || !(vcs = ide_context_get_vcs (context)) || !(workdir = ide_vcs_get_working_directory (vcs))) { g_set_error (error, GB_VIM_ERROR, GB_VIM_ERROR_NOT_SOURCE_VIEW, _("Failed to locate working directory")); return FALSE; } if (g_path_is_absolute (options)) file = g_file_new_for_path (options); else file = g_file_get_child (workdir, options); ide_workbench_open_files_async (workbench, &file, 1, "editor", IDE_WORKBENCH_OPEN_FLAGS_NONE, NULL, NULL, NULL); g_clear_object (&file); return TRUE; }
static gboolean gb_vim_command_write (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { g_assert (GTK_IS_WIDGET (active_widget)); if (IDE_IS_EDITOR_VIEW (active_widget)) { GtkSourceView *source_view = GTK_SOURCE_VIEW (IDE_EDITOR_VIEW (active_widget)->frame1->source_view); ide_widget_action (GTK_WIDGET (source_view), "view", "save", NULL); return TRUE; } else return gb_vim_set_source_view_error (error); }
static void gb_vim_command_vsplit_cb (GObject *object, GAsyncResult *result, gpointer user_data) { SplitCallbackData *split_callback_data = (SplitCallbackData *)user_data; GtkWidget *active_widget; const gchar *file_path; GVariant *variant; active_widget = split_callback_data->active_widget; file_path = split_callback_data->file_path; variant = g_variant_new_string (file_path); ide_widget_action (GTK_WIDGET (active_widget), "view-stack", "split-left", variant); g_object_unref (split_callback_data->active_widget); g_free (split_callback_data->file_path); g_slice_free (SplitCallbackData, split_callback_data); }
static void ide_editor_view_actions_close (GSimpleAction *action, GVariant *param, gpointer user_data) { IdeEditorView *self = user_data; g_assert (IDE_IS_EDITOR_VIEW (self)); /* just close our current frame if we have split view */ if (self->frame2 != NULL) { /* todo: swap frame1/frame2 if frame2 was last focused. */ g_timeout_add (0, set_split_view, g_object_ref (self)); } else { ide_widget_action (GTK_WIDGET (self), "view-stack", "close", NULL); } }
static gboolean ide_editor_spell_widget__key_press_event_cb (IdeEditorSpellWidget *self, GdkEventKey *event) { g_assert (IDE_IS_SOURCE_VIEW (self->view)); g_assert (event != NULL); switch (event->keyval) { case GDK_KEY_Escape: ide_widget_action (GTK_WIDGET (self->view), "frame", "show-spellcheck", g_variant_new_int32 (0)); return GDK_EVENT_STOP; default: break; } return GDK_EVENT_PROPAGATE; }
static gboolean gb_vim_command_bprevious (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { IdeWorkbench *workbench; IdeContext *context; IdeBufferManager *bufmgr; guint n_buffers; g_assert (GTK_IS_WIDGET (active_widget)); workbench = ide_widget_get_workbench (GTK_WIDGET (active_widget)); context = ide_workbench_get_context (workbench); bufmgr = ide_context_get_buffer_manager (context); n_buffers = ide_buffer_manager_get_n_buffers (bufmgr); if (n_buffers > 0) ide_widget_action (GTK_WIDGET (active_widget), "view-stack", "previous-view", NULL); return TRUE; }
static void gb_terminal_view_wait_cb (GObject *object, GAsyncResult *result, gpointer user_data) { IdeSubprocess *subprocess = (IdeSubprocess *)object; VteTerminal *terminal = user_data; GbTerminalView *self; g_autoptr(GError) error = NULL; IDE_ENTRY; g_assert (IDE_IS_SUBPROCESS (subprocess)); g_assert (G_IS_ASYNC_RESULT (result)); g_assert (VTE_IS_TERMINAL (terminal)); if (!ide_subprocess_wait_finish (subprocess, result, &error)) { g_warning ("%s", error->message); IDE_GOTO (failure); } self = (GbTerminalView *)gtk_widget_get_ancestor (GTK_WIDGET (terminal), GB_TYPE_TERMINAL_VIEW); if (self == NULL) IDE_GOTO (failure); if (!ide_widget_action (GTK_WIDGET (self), "view-stack", "close", NULL)) { if (!gtk_widget_in_destruction (GTK_WIDGET (terminal))) gb_terminal_respawn (self, terminal); } failure: g_clear_object (&terminal); IDE_EXIT; }
gboolean ide_widget_action_with_string (GtkWidget *widget, const gchar *group, const gchar *name, const gchar *param) { GVariant *variant = NULL; gboolean ret; IDE_ENTRY; g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); g_return_val_if_fail (group != NULL, FALSE); g_return_val_if_fail (name != NULL, FALSE); if (param == NULL) param = ""; if (*param != 0) { g_autoptr(GError) error = NULL; variant = g_variant_parse (NULL, param, NULL, NULL, &error); if (variant == NULL) { g_warning ("can't parse keybinding parameters \"%s\": %s", param, error->message); IDE_RETURN (FALSE); } } ret = ide_widget_action (widget, group, name, variant); IDE_RETURN (ret); }
static gboolean gb_vim_command_search (GtkWidget *active_widget, const gchar *command, const gchar *options, GError **error) { GtkSourceView *source_view; GtkTextBuffer *buffer; const gchar *search_begin = NULL; const gchar *search_end = NULL; const gchar *replace_begin = NULL; const gchar *replace_end = NULL; gchar *search_text = NULL; gchar *replace_text = NULL; gunichar separator; gboolean confirm_replace = FALSE; g_assert (GTK_IS_WIDGET (active_widget)); g_assert (g_str_has_prefix (command, "%s") || g_str_has_prefix (command, "s")); if (IDE_IS_EDITOR_VIEW (active_widget)) source_view = GTK_SOURCE_VIEW (IDE_EDITOR_VIEW (active_widget)->frame1->source_view); else return gb_vim_set_source_view_error (error); if (*command == '%') command++; command++; separator = g_utf8_get_char (command); if (!separator) goto invalid_request; search_begin = command = g_utf8_next_char (command); for (; *command; command = g_utf8_next_char (command)) { if (*command == '\\') { command = g_utf8_next_char (command); if (!*command) goto invalid_request; continue; } if (g_utf8_get_char (command) == separator) { search_end = command; break; } } if (!search_end) goto invalid_request; replace_begin = command = g_utf8_next_char (command); for (; *command; command = g_utf8_next_char (command)) { if (*command == '\\') { command = g_utf8_next_char (command); if (!*command) goto invalid_request; continue; } if (g_utf8_get_char (command) == separator) { replace_end = command; break; } } if (!replace_end) goto invalid_request; command = g_utf8_next_char (command); if (*command) { for (; *command; command++) { switch (*command) { case 'c': confirm_replace = TRUE; break; case 'g': break; /* what other options are supported? */ default: break; } } } search_text = g_strndup (search_begin, search_end - search_begin); replace_text = g_strndup (replace_begin, replace_end - replace_begin); if (confirm_replace) { GVariant *variant; GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY); g_variant_builder_add (&builder, "s", search_text); g_variant_builder_add (&builder, "s", replace_text); variant = g_variant_builder_end (&builder); ide_widget_action (GTK_WIDGET (IDE_EDITOR_VIEW (active_widget)->frame1), "frame", "replace-confirm", variant); return TRUE; } buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (source_view)); if (gtk_text_buffer_get_has_selection (buffer)) { GtkTextIter begin; GtkTextIter end; gtk_text_buffer_get_selection_bounds (buffer, &begin, &end); gtk_text_iter_order (&begin, &end); gb_vim_do_search_and_replace (buffer, &begin, &end, search_text, replace_text, FALSE); } else gb_vim_do_search_and_replace (buffer, NULL, NULL, search_text, replace_text, TRUE); g_free (search_text); g_free (replace_text); return TRUE; invalid_request: g_set_error (error, GB_VIM_ERROR, GB_VIM_ERROR_UNKNOWN_OPTION, _("Invalid search and replace request")); return FALSE; }