📄 st-shell.c
字号:
st_shell_tune_in(shell); else if ((GtkWidget *) button == shell->priv->record_button) st_shell_record(shell); else if ((GtkWidget *) button == shell->priv->browse_button) st_shell_browse(shell); else if ((GtkWidget *) button == shell->priv->stop_button) st_shell_stop(shell); else if ((GtkWidget *) button == shell->priv->reload_button) st_shell_reload(shell); else g_return_if_reached();}static voidst_shell_make_notebook (STShell *shell){ GSList *l; GdkPixbuf *drag_pixbuf; shell->priv->notebook = gtk_notebook_new(); gtk_notebook_set_scrollable(GTK_NOTEBOOK(shell->priv->notebook), TRUE); /* * The tab labels will be moved in realtime by * st_shell_tab_label_drag_motion_h(): using a drag icon would be * visually redundant, so we use a blank icon. */ drag_pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, 1, 1); gdk_pixbuf_fill(drag_pixbuf, 0); /* fill with transparent black */ SG_LIST_FOREACH(l, st_handlers_list) { STHandler *handler = l->data; GtkWidget *tab; GtkWidget *tab_label; static GtkTargetEntry drag_targets[] = { { "STBrowserTabLabel", 0, 0 } }; STStreamMenuItems *stream_menu_items; tab = st_browser_tab_new(handler); tab_label = ST_BROWSER_TAB(tab)->label; stream_menu_items = st_stream_menu_items_new(shell->priv->accel_group); st_stream_view_set_menu_items(ST_BROWSER_TAB(tab)->stream_view, stream_menu_items); gtk_drag_source_set(tab_label, GDK_BUTTON1_MASK, drag_targets, G_N_ELEMENTS(drag_targets), GDK_ACTION_MOVE); gtk_drag_dest_set(tab_label, GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP, drag_targets, G_N_ELEMENTS(drag_targets), GDK_ACTION_MOVE); gtk_drag_source_set_icon_pixbuf(tab_label, drag_pixbuf); g_object_connect(tab_label, "signal::drag-begin", st_shell_tab_label_drag_begin_h, shell, "signal::drag-end", st_shell_tab_label_drag_end_h, shell, "signal::drag-motion", st_shell_tab_label_drag_motion_h, shell, NULL); g_object_connect(tab, "signal::notify::running", st_shell_tab_notify_running_h, shell, "signal::stream-task-added", st_shell_tab_stream_task_added_h, shell, "signal::stream-task-removed", st_shell_tab_stream_task_removed_h, shell, NULL); if (ST_BROWSER_TAB(tab)->category_view) g_signal_connect(ST_BROWSER_TAB(tab)->category_view, "selection-changed", G_CALLBACK(st_shell_category_selection_changed_h), shell); g_object_connect(ST_BROWSER_TAB(tab)->stream_view, "signal::selection-changed", st_shell_stream_selection_changed_h, shell, "signal::row-activated", st_shell_stream_activated_h, shell, NULL); gtk_widget_show(tab); gtk_notebook_append_page(GTK_NOTEBOOK(shell->priv->notebook), tab, tab_label); shell->priv->tabs = g_slist_append(shell->priv->tabs, tab); } g_object_unref(drag_pixbuf); shell->priv->switch_page_hid = g_signal_connect_after(shell->priv->notebook, "switch-page", G_CALLBACK(st_shell_switch_page_h), shell); gtk_box_pack_start(GTK_BOX(shell->priv->box), shell->priv->notebook, TRUE, TRUE, 0); gtk_widget_show(shell->priv->notebook);}static voidst_shell_tab_label_drag_begin_h (GtkWidget *widget, GdkDragContext *drag_context, gpointer user_data){ STShell *shell = user_data; GdkCursor *cursor = gdk_cursor_new(GDK_FLEUR); gdk_pointer_grab(shell->priv->notebook->window, FALSE, GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, NULL, cursor, drag_context->start_time); gdk_cursor_unref(cursor);}static voidst_shell_tab_label_drag_end_h (GtkWidget *widget, GdkDragContext *drag_context, gpointer user_data){ STShell *shell = user_data; /* a tab might have been moved */ st_shell_tab_moved(shell);}static intst_shell_handlers_compare (gconstpointer a, gconstpointer b, gpointer user_data){ STShell *shell = user_data; STBrowserTab *tab1 = st_shell_get_tab_with_handler(shell, (STHandler *) a); STBrowserTab *tab2 = st_shell_get_tab_with_handler(shell, (STHandler *) b); int num1 = gtk_notebook_page_num(GTK_NOTEBOOK(shell->priv->notebook), (GtkWidget *) tab1); int num2 = gtk_notebook_page_num(GTK_NOTEBOOK(shell->priv->notebook), (GtkWidget *) tab2); return num1 - num2;}static voidst_shell_tab_label_drag_motion_h (GtkWidget *widget, GdkDragContext *drag_context, int x, int y, unsigned int _time, gpointer user_data){ GtkWidget *source; source = gtk_drag_get_source_widget(drag_context); if (source) { STShell *shell = user_data; STBrowserTabLabel *source_tab_label = ST_BROWSER_TAB_LABEL(source); STBrowserTabLabel *dest_tab_label = ST_BROWSER_TAB_LABEL(widget); int num = gtk_notebook_page_num(GTK_NOTEBOOK(shell->priv->notebook), GTK_WIDGET(dest_tab_label->tab)); g_return_if_fail(num != -1); gtk_notebook_reorder_child(GTK_NOTEBOOK(shell->priv->notebook), GTK_WIDGET(source_tab_label->tab), num); }}static voidst_shell_switch_page_h (GtkNotebook *notebook, GtkNotebookPage *page, unsigned int page_num, gpointer user_data){ STShell *shell = user_data; st_shell_tab_selected(shell);}static voidst_shell_tab_selected (STShell *shell){ STBrowserTab *tab; const char *description; char *markup; g_return_if_fail(ST_IS_SHELL(shell)); tab = st_shell_get_selected_tab(shell); st_shell_update_title(shell); /* update toolbar */ description = st_handler_get_description(tab->handler); markup = g_markup_printf_escaped("<span size=\"x-large\">%s</span>", description ? description : st_handler_get_label(tab->handler)); st_link_set_text(ST_LINK(shell->priv->link), markup); g_free(markup); st_link_set_uri(ST_LINK(shell->priv->link), st_handler_get_home(tab->handler)); /* update menubar */ st_shell_menubar_select_directory_item(shell); /* pack statusbar */ st_shell_set_statusbar_of_tab(shell, tab); /* misc */ if (! gtk_tree_view_get_model(GTK_TREE_VIEW(tab->stream_view))) st_browser_tab_update(tab); st_shell_update_sensitivity(shell); if (shell->priv->stream_properties) st_stream_properties_dialog_update_sensitivity(ST_STREAM_PROPERTIES_DIALOG(shell->priv->stream_properties)); if (shell->priv->stream_columns) st_stream_columns_dialog_set_stream_view(ST_STREAM_COLUMNS_DIALOG(shell->priv->stream_columns), tab->stream_view); if (shell->priv->find) { 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); }}static voidst_shell_tab_moved (STShell *shell){ g_return_if_fail(ST_IS_SHELL(shell)); /* reorder the handlers lists */ st_handlers_list = g_slist_sort_with_data(st_handlers_list, st_shell_handlers_compare, shell); st_handlers_full_list = g_slist_sort_with_data(st_handlers_full_list, st_shell_handlers_compare, shell); /* reorder the directories menu by recreating it */ st_shell_menubar_make_directory_items(shell); st_shell_menubar_select_directory_item(shell); st_shell_update_sensitivity(shell);}static voidst_shell_make_statusbox (STShell *shell){ shell->priv->statusbox = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(shell->priv->statusbox), FALSE); gtk_box_pack_start(GTK_BOX(shell->priv->box), shell->priv->statusbox, FALSE, FALSE, 0); gtk_widget_show(shell->priv->statusbox);}static voidst_shell_update_visibility (STShell *shell){ GSList *l; /* * FIXME: fullscreen mode: HIG 2.0 says: * * "However, make its menus and items accessible from the keyboard * as usual." */ g_object_set(shell->priv->menubar, "visible", ! shell->priv->fullscreen, NULL); g_object_set(shell->priv->toolbar, "visible", st_settings.view_toolbar, NULL); gtk_notebook_set_show_tabs(GTK_NOTEBOOK(shell->priv->notebook), st_settings.view_tabs); SG_LIST_FOREACH(l, shell->priv->tabs) { STBrowserTab *tab = l->data; st_browser_tab_label_set_icon_visible(ST_BROWSER_TAB_LABEL(tab->label), st_settings.view_tab_icons); } g_object_set(shell->priv->statusbox, "visible", st_settings.view_statusbar && ! shell->priv->fullscreen, NULL);}static voidst_shell_update_toolbar_style (STShell *shell){ GtkToolbarStyle style = st_settings.toolbar_style; if (style == ST_SHELL_TOOLBAR_STYLE_GTK) { GtkSettings *settings; settings = gtk_widget_get_settings(GTK_WIDGET(shell->priv->toolbar)); g_object_get(settings, "gtk-toolbar-style", &style, NULL); } if (shell->priv->fullscreen && style == GTK_TOOLBAR_BOTH) style = GTK_TOOLBAR_ICONS; gtk_toolbar_set_style(GTK_TOOLBAR(shell->priv->toolbar), style);}static voidst_shell_update_toolbar_size (STShell *shell){ GtkIconSize size = st_settings.toolbar_size; if (size == ST_SHELL_TOOLBAR_SIZE_GTK) { GtkSettings *settings; settings = gtk_widget_get_settings(GTK_WIDGET(shell->priv->toolbar)); g_object_get(settings, "gtk-toolbar-icon-size", &size, NULL); } gtk_toolbar_set_icon_size(GTK_TOOLBAR(shell->priv->toolbar), size);}STShell *st_shell_new (void){ return g_object_new(ST_TYPE_SHELL, NULL);}static voidst_shell_update_title (STShell *shell){ STBrowserTab *selected_tab; GString *title; g_return_if_fail(ST_IS_SHELL(shell)); selected_tab = st_shell_get_selected_tab(shell); if (selected_tab) { STCategoryBag *category_bag; title = g_string_new(st_handler_get_label(selected_tab->handler)); category_bag = st_handler_get_selected_category(selected_tab->handler); g_return_if_fail(category_bag != NULL); if (ST_CATEGORY(category_bag)->label) { g_string_append_printf(title, ", %s", ST_CATEGORY(category_bag)->label); g_object_unref(category_bag); } } else title = g_string_new("streamtuner"); gtk_window_set_title(GTK_WINDOW(shell->priv->window), title->str); g_string_free(title, TRUE);}static voidst_shell_update_sensitivity (STShell *shell){ g_return_if_fail(ST_IS_SHELL(shell)); /* menubar */ st_stream_menu_items_update_sensitivity(shell->priv->stream_items); gtk_widget_set_sensitive(shell->priv->select_all_item, st_shell_can_select_all(shell)); gtk_widget_set_sensitive(shell->priv->find_item, st_shell_can_find(shell)); gtk_widget_set_sensitive(shell->priv->find_next_item, st_shell_can_find_next(shell)); gtk_widget_set_sensitive(shell->priv->find_previous_item, st_shell_can_find_previous(shell)); gtk_widget_set_sensitive(shell->priv->search_in_all_categories_item, st_shell_can_search_in_all_categories(shell)); gtk_widget_set_sensitive(shell->priv->stop_item, st_shell_can_stop(shell)); gtk_widget_set_sensitive(shell->priv->reload_item, st_shell_can_reload(shell)); gtk_widget_set_sensitive(shell->priv->directory_preferences_item, st_shell_can_present_directory_preferences(shell)); gtk_widget_set_sensitive(shell->priv->directory_homepage_item, st_shell_can_visit_directory_homepage(shell)); gtk_widget_set_sensitive(shell->priv->previous_directory_item, st_shell_can_select_previous_tab(shell)); gtk_widget_set_sensitive(shell->priv->next_directory_item, st_shell_can_select_next_tab(shell)); gtk_widget_set_sensitive(shell->priv->move_directory_left_item, st_shell_can_move_tab_left(shell)); gtk_widget_set_sensitive(shell->priv->move_directory_right_item, st_shell_can_move_tab_right(shell)); /* toolbar */ gtk_widget_set_sensitive(shell->priv->tune_in_button, st_shell_can_tune_in(shell)); gtk_widget_set_sensitive(shell->priv->record_button, st_shell_can_record(shell)); gtk_widget_set_sensitive(shell->priv->browse_button, st_shell_can_browse(shell)); gtk_widget_set_sensitive(shell->priv->stop_button, st_shell_can_stop(shell)); gtk_widget_set_sensitive(shell->priv->reload_button, st_shell_can_reload(shell)); /* tabs */ g_slist_foreach(shell->priv->tabs, (GFunc) st_browser_tab_update_sensitivity, NULL);}static STBrowserTab *st_shell_get_selected_tab (STShell *shell){ int num; g_return_val_if_fail(ST_IS_SHELL(shell), NULL); num = gtk_notebook_get_current_page(GTK_NOTEBOOK(shell->priv->notebook)); return num != -1 ? (STBrowserTab *) gtk_notebook_get_nth_page(GTK_NOTEBOOK(shell->priv->notebook), num) : NULL;}static gbooleanst_shell_can_stop (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_stop(selected_tab);}static voidst_shell_stop (STShell *shell){ STBrowserTab *selected_tab; g_return_if_fail(ST_IS_SHELL(shell)); g_return_if_fail(st_shell_can_stop(shell)); selected_tab = st_shell_get_selected_tab(shell); st_browser_tab_stop(selected_tab);}static gbooleanst_shell_can_reload (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_reload(selected_tab);}static voidst_shell_reload (STShell *shell){ STBrowserTab *selected_tab;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -