📄 st-shell.c
字号:
g_return_if_fail(ST_IS_SHELL(shell)); g_return_if_fail(st_shell_can_reload(shell)); selected_tab = st_shell_get_selected_tab(shell); st_browser_tab_reload(selected_tab);}static gbooleanst_shell_can_select_all (STShell *shell){ STBrowserTab *selected_tab; g_return_val_if_fail(ST_IS_SHELL(shell), FALSE); selected_tab = st_shell_get_selected_tab(shell); return selected_tab != NULL;}static voidst_shell_select_all (STShell *shell){ STBrowserTab *selected_tab; g_return_if_fail(ST_IS_SHELL(shell)); g_return_if_fail(st_shell_can_select_all(shell)); selected_tab = st_shell_get_selected_tab(shell); st_stream_view_select_all(selected_tab->stream_view);}static gbooleanst_shell_can_find (STShell *shell){ STBrowserTab *selected_tab; g_return_val_if_fail(ST_IS_SHELL(shell), FALSE); selected_tab = st_shell_get_selected_tab(shell); return selected_tab != NULL;}static voidst_shell_find (STShell *shell){ g_return_if_fail(ST_IS_SHELL(shell)); if (shell->priv->find) gtk_window_present(GTK_WINDOW(shell->priv->find)); else { shell->priv->find = sgtk_find_dialog_new(GTK_WINDOW(shell->priv->window)); g_object_add_weak_pointer(G_OBJECT(shell->priv->find), (gpointer *) &shell->priv->find); sgtk_find_dialog_set_token(SGTK_FIND_DIALOG(shell->priv->find), st_settings.find_token ? st_settings.find_token : ""); sgtk_find_dialog_set_history(SGTK_FIND_DIALOG(shell->priv->find), st_settings.find_history); sgtk_find_dialog_set_case_sensitive(SGTK_FIND_DIALOG(shell->priv->find), st_settings.find_case_sensitive); sgtk_find_dialog_set_wrap_around(SGTK_FIND_DIALOG(shell->priv->find), st_settings.find_wrap_around); sgtk_find_dialog_set_previous_sensitive(SGTK_FIND_DIALOG(shell->priv->find), FIND_NAVIGATION_SENSITIVE); sgtk_find_dialog_set_next_sensitive(SGTK_FIND_DIALOG(shell->priv->find), FIND_NAVIGATION_SENSITIVE); g_object_connect(shell->priv->find, "signal::notify", st_shell_find_notify_h, NULL, "signal::response", st_shell_find_response_h, shell, NULL); gtk_widget_show(shell->priv->find); }}static voidst_shell_find_notify_h (GObject *object, GParamSpec *pspec, gpointer user_data){ sGtkFindDialog *dialog = SGTK_FIND_DIALOG(object); const char *name = g_param_spec_get_name(pspec); if (! strcmp(name, "token")) { const char *token; token = sgtk_find_dialog_get_token(dialog); g_free(st_settings.find_token); st_settings.find_token = *token ? g_strdup(token) : NULL; sgtk_find_dialog_set_previous_sensitive(dialog, FIND_NAVIGATION_SENSITIVE); sgtk_find_dialog_set_next_sensitive(dialog, FIND_NAVIGATION_SENSITIVE); } else if (! strcmp(name, "history")) { sg_pointers_free(st_settings.find_history); st_settings.find_history = sgtk_find_dialog_get_history(dialog); if (g_slist_length(st_settings.find_history) > ST_SETTINGS_FIND_HISTORY_MAX_LENGTH) { GSList *elem; elem = g_slist_nth(st_settings.find_history, ST_SETTINGS_FIND_HISTORY_MAX_LENGTH - 1); g_return_if_fail(elem != NULL); sg_pointers_free(elem->next); elem->next = NULL; sgtk_find_dialog_set_history(dialog, st_settings.find_history); } } else if (! strcmp(name, "case-sensitive")) { st_settings.find_case_sensitive = sgtk_find_dialog_get_case_sensitive(dialog); sgtk_find_dialog_set_previous_sensitive(dialog, FIND_NAVIGATION_SENSITIVE); sgtk_find_dialog_set_next_sensitive(dialog, FIND_NAVIGATION_SENSITIVE); } else if (! strcmp(name, "wrap-around")) { st_settings.find_wrap_around = sgtk_find_dialog_get_wrap_around(dialog); if (st_settings.find_wrap_around) { sgtk_find_dialog_set_previous_sensitive(dialog, FIND_NAVIGATION_SENSITIVE); sgtk_find_dialog_set_next_sensitive(dialog, FIND_NAVIGATION_SENSITIVE); } }}static voidst_shell_find_response_h (GtkDialog *dialog, int response, gpointer data){ STShell *shell = data; sGtkDirection direction; const char *token; switch (response) { case SGTK_RESPONSE_PREVIOUS: direction = SGTK_PREVIOUS; break; case SGTK_RESPONSE_NEXT: direction = SGTK_NEXT; break; case GTK_RESPONSE_DELETE_EVENT: case GTK_RESPONSE_CLOSE: gtk_widget_destroy(GTK_WIDGET(dialog)); return; /* finish */ default: g_return_if_reached(); } token = sgtk_find_dialog_get_token(SGTK_FIND_DIALOG(dialog)); g_free(shell->priv->find_token); shell->priv->find_token = *token ? g_strdup(token) : NULL; shell->priv->find_case_sensitive = sgtk_find_dialog_get_case_sensitive(SGTK_FIND_DIALOG(dialog)); st_shell_find_real(shell, direction, sgtk_find_dialog_get_wrap_around(SGTK_FIND_DIALOG(dialog)));}static gbooleanst_shell_can_find_next (STShell *shell){ return st_shell_can_find(shell) && shell->priv->find_token;}static voidst_shell_find_next (STShell *shell){ g_return_if_fail(ST_IS_SHELL(shell)); st_shell_find_real(shell, SGTK_NEXT, TRUE);}static gbooleanst_shell_can_find_previous (STShell *shell){ return st_shell_can_find(shell) && shell->priv->find_token;}static voidst_shell_find_previous (STShell *shell){ g_return_if_fail(ST_IS_SHELL(shell)); st_shell_find_real(shell, SGTK_PREVIOUS, TRUE);}static voidst_shell_find_real (STShell *shell, sGtkDirection direction, gboolean wrap_around){ STBrowserTab *selected_tab; gboolean found; g_return_if_fail(ST_IS_SHELL(shell)); selected_tab = st_shell_get_selected_tab(shell); found = st_stream_view_find(selected_tab->stream_view, direction, shell->priv->find_token, shell->priv->find_case_sensitive, wrap_around); if (shell->priv->find) { if (found) switch (direction) { case SGTK_PREVIOUS: sgtk_find_dialog_set_next_sensitive(SGTK_FIND_DIALOG(shell->priv->find), TRUE); break; case SGTK_NEXT: sgtk_find_dialog_set_previous_sensitive(SGTK_FIND_DIALOG(shell->priv->find), TRUE); break; default: g_return_if_reached(); } else switch (direction) { case SGTK_PREVIOUS: sgtk_find_dialog_set_previous_sensitive(SGTK_FIND_DIALOG(shell->priv->find), FALSE); break; case SGTK_NEXT: sgtk_find_dialog_set_next_sensitive(SGTK_FIND_DIALOG(shell->priv->find), FALSE); break; default: g_return_if_reached(); } }}static gbooleanst_shell_can_search_in_all_categories (STShell *shell){ STBrowserTab *selected_tab; g_return_val_if_fail(ST_IS_SHELL(shell), FALSE); selected_tab = st_shell_get_selected_tab(shell); return selected_tab && st_handler_get_stock_category(selected_tab->handler, ST_CATEGORY_BAG_SEARCH);}static voidst_shell_search_in_all_categories (STShell *shell){ STBrowserTab *selected_tab; STCategoryBag *search_category; g_return_if_fail(ST_IS_SHELL(shell)); g_return_if_fail(st_shell_can_search_in_all_categories(shell)); selected_tab = st_shell_get_selected_tab(shell); g_return_if_fail(selected_tab != NULL); search_category = st_handler_get_stock_category(selected_tab->handler, ST_CATEGORY_BAG_SEARCH); g_return_if_fail(search_category != NULL); st_category_view_select_category(selected_tab->category_view, search_category); st_browser_tab_reload(selected_tab);}gbooleanst_shell_can_tune_in (STShell *shell){ STBrowserTab *selected_tab; g_return_val_if_fail(ST_IS_SHELL(shell), FALSE); selected_tab = st_shell_get_selected_tab(shell); return selected_tab && st_browser_tab_can_run_stream_task(selected_tab, ST_BROWSER_TAB_STREAM_TASK_TUNE_IN);}voidst_shell_tune_in (STShell *shell){ STBrowserTab *selected_tab; g_return_if_fail(ST_IS_SHELL(shell)); g_return_if_fail(st_shell_can_tune_in(shell)); selected_tab = st_shell_get_selected_tab(shell); st_browser_tab_run_stream_task(selected_tab, ST_BROWSER_TAB_STREAM_TASK_TUNE_IN);}gbooleanst_shell_can_record (STShell *shell){ STBrowserTab *selected_tab; g_return_val_if_fail(ST_IS_SHELL(shell), FALSE); selected_tab = st_shell_get_selected_tab(shell); return selected_tab && st_browser_tab_can_run_stream_task(selected_tab, ST_BROWSER_TAB_STREAM_TASK_RECORD);}voidst_shell_record (STShell *shell){ STBrowserTab *selected_tab; g_return_if_fail(ST_IS_SHELL(shell)); g_return_if_fail(st_shell_can_record(shell)); selected_tab = st_shell_get_selected_tab(shell); st_browser_tab_run_stream_task(selected_tab, ST_BROWSER_TAB_STREAM_TASK_RECORD);}gbooleanst_shell_can_browse (STShell *shell){ STBrowserTab *selected_tab; g_return_val_if_fail(ST_IS_SHELL(shell), FALSE); selected_tab = st_shell_get_selected_tab(shell); return selected_tab && st_browser_tab_can_run_stream_task(selected_tab, ST_BROWSER_TAB_STREAM_TASK_BROWSE);}voidst_shell_browse (STShell *shell){ STBrowserTab *selected_tab; g_return_if_fail(ST_IS_SHELL(shell)); g_return_if_fail(st_shell_can_browse(shell)); selected_tab = st_shell_get_selected_tab(shell); st_browser_tab_run_stream_task(selected_tab, ST_BROWSER_TAB_STREAM_TASK_BROWSE);}gbooleanst_shell_can_present_stream_properties (STShell *shell){ STBrowserTab *selected_tab; g_return_val_if_fail(ST_IS_SHELL(shell), FALSE); selected_tab = st_shell_get_selected_tab(shell); return selected_tab && st_stream_view_has_selected_streams(selected_tab->stream_view);}voidst_shell_present_stream_properties (STShell *shell){ g_return_if_fail(ST_IS_SHELL(shell)); if (shell->priv->stream_properties) gtk_window_present(GTK_WINDOW(shell->priv->stream_properties)); else { shell->priv->stream_properties = st_stream_properties_dialog_new(GTK_WINDOW(shell->priv->window)); g_object_add_weak_pointer(G_OBJECT(shell->priv->stream_properties), (gpointer *) &shell->priv->stream_properties); g_signal_connect(shell->priv->stream_properties, "response", G_CALLBACK(st_shell_stream_properties_response_h), shell); st_shell_stream_properties_update_stream(shell); gtk_widget_show(shell->priv->stream_properties); }}static voidst_shell_stream_properties_response_h (GtkDialog *dialog, int response, gpointer data){ STShell *shell = data; STBrowserTab *selected_tab = st_shell_get_selected_tab(shell); switch (response) { case SGTK_RESPONSE_PREVIOUS: st_stream_view_select_previous(selected_tab->stream_view); break; case SGTK_RESPONSE_NEXT: st_stream_view_select_next(selected_tab->stream_view); break; case GTK_RESPONSE_APPLY: st_stream_properties_dialog_apply(ST_STREAM_PROPERTIES_DIALOG(dialog)); break; case GTK_RESPONSE_DELETE_EVENT: case GTK_RESPONSE_CANCEL: gtk_widget_hide(GTK_WIDGET(dialog)); st_stream_properties_dialog_cancel(ST_STREAM_PROPERTIES_DIALOG(dialog)); gtk_widget_destroy(GTK_WIDGET(dialog)); break; case GTK_RESPONSE_OK: gtk_widget_hide(GTK_WIDGET(dialog)); st_stream_properties_dialog_apply(ST_STREAM_PROPERTIES_DIALOG(dialog)); gtk_widget_destroy(GTK_WIDGET(dialog)); break; }}voidst_shell_present_stream_columns (STShell *shell){ g_return_if_fail(ST_IS_SHELL(shell)); if (shell->priv->stream_columns) gtk_window_present(GTK_WINDOW(shell->priv->stream_columns)); else { STBrowserTab *selected_tab; shell->priv->stream_columns = st_stream_columns_dialog_new(GTK_WINDOW(shell->priv->window));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -