📄 st-shell.c
字号:
}, { "/View/separator2", NULL, NULL, 0, "<Separator>", NULL }, { N_("/View/Stream _Columns"), NULL, st_shell_present_stream_columns, 0, "<StockItem>", ST_STOCK_STREAM_COLUMNS }, { "/View/separator3", NULL, NULL, 0, "<Separator>", NULL }, { N_("/View/_Stop"), "Escape", st_shell_stop, 0, "<StockItem>", GTK_STOCK_STOP }, { N_("/View/_Reload"), "<Control>R", st_shell_reload, 0, "<StockItem>", ST_STOCK_RELOAD }, { N_("/_Directories"), NULL, NULL, 0, "<Branch>", NULL }, { N_("/Directories/_Directory Preferences"), NULL, st_shell_present_directory_preferences, 0, "<StockItem>", ST_STOCK_DIRECTORY_PREFERENCES }, { N_("/Directories/_Visit Directory Homepage"), NULL, st_shell_visit_directory_homepage, 0, "<StockItem>", ST_STOCK_VISIT_DIRECTORY_HOMEPAGE }, { "/Directories/separator1", NULL, NULL, 0, "<Separator>", NULL }, { N_("/Directories/_Previous Directory"), "<Control>Page_Up", st_shell_select_previous_tab, 0, "<StockItem>", GTK_STOCK_GO_BACK }, { N_("/Directories/_Next Directory"), "<Control>Page_Down", st_shell_select_next_tab, 0, "<StockItem>", GTK_STOCK_GO_FORWARD }, { "/Directories/separator2", NULL, NULL, 0, "<Separator>", NULL }, { N_("/Directories/Move Directory _Left"), "<Shift><Control>Page_Up", st_shell_move_tab_left, 0, "<Item>", NULL }, { N_("/Directories/Move Directory _Right"), "<Shift><Control>Page_Down", st_shell_move_tab_right, 0, "<Item>", NULL }, { N_("/_Help"), NULL, NULL, 0, "<Branch>", NULL }, { N_("/Help/_Contents"), "F1", st_shell_help, 0, "<StockItem>", GTK_STOCK_HELP }, { N_("/Help/_Homepage"), NULL, st_shell_homepage, 0, "<StockItem>", GTK_STOCK_HOME }, { "/Help/separator1", NULL, NULL, 0, "<Separator>", NULL }, { N_("/Help/_About"), NULL, st_shell_present_about, 0, "<StockItem>", GTK_STOCK_DIALOG_INFO } }; GtkWidget *menu; char *accel_path; /* create factory */ shell->priv->factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<streamtuner-Browser>", shell->priv->accel_group); gtk_item_factory_set_translate_func(shell->priv->factory, sgtk_translate_func, NULL, NULL); gtk_item_factory_create_items(shell->priv->factory, G_N_ELEMENTS(entries), entries, shell); /* add stream items */ menu = gtk_item_factory_get_widget(shell->priv->factory, N_("/Stream")); shell->priv->stream_items = st_stream_menu_items_new(shell->priv->accel_group); st_stream_menu_items_insert_into_shell(shell->priv->stream_items, GTK_MENU_SHELL(menu), 2); accel_path = g_strdup_printf("<streamtuner-Browser>/Stream/%s", _("Tune in")); sgtk_accel_map_add_entry(accel_path, "<Control>T"); g_free(accel_path); accel_path = g_strdup_printf("<streamtuner-Browser>/Stream/%s", _("Delete")); sgtk_accel_map_add_entry(accel_path, "Delete"); g_free(accel_path); accel_path = g_strdup_printf("<streamtuner-Browser>/Stream/%s", _("Properties")); sgtk_accel_map_add_entry(accel_path, "<Alt>Return"); g_free(accel_path); /* remember the items we'll need later on */ shell->priv->menubar = gtk_item_factory_get_widget(shell->priv->factory, "<streamtuner-Browser>"); shell->priv->select_all_item = gtk_item_factory_get_item(shell->priv->factory, N_("/Edit/Select All")); shell->priv->find_item = gtk_item_factory_get_item(shell->priv->factory, N_("/Edit/Find...")); shell->priv->find_next_item = gtk_item_factory_get_item(shell->priv->factory, N_("/Edit/Find Next")); shell->priv->find_previous_item = gtk_item_factory_get_item(shell->priv->factory, N_("/Edit/Find Previous")); shell->priv->search_in_all_categories_item = gtk_item_factory_get_item(shell->priv->factory, N_("/Edit/Search in All Categories...")); shell->priv->stop_item = gtk_item_factory_get_item(shell->priv->factory, N_("/View/Stop")); shell->priv->reload_item = gtk_item_factory_get_item(shell->priv->factory, N_("/View/Reload")); shell->priv->view_tab_icons_item = gtk_item_factory_get_item(shell->priv->factory, N_("/View/Tab Icons")); shell->priv->directories_menu = gtk_item_factory_get_widget(shell->priv->factory, N_("/Directories")); shell->priv->directory_preferences_item = gtk_item_factory_get_item(shell->priv->factory, N_("/Directories/Directory Preferences")); shell->priv->directory_homepage_item = gtk_item_factory_get_item(shell->priv->factory, N_("/Directories/Visit Directory Homepage")); shell->priv->previous_directory_item = gtk_item_factory_get_widget(shell->priv->factory, N_("/Directories/Previous Directory")); shell->priv->next_directory_item = gtk_item_factory_get_widget(shell->priv->factory, N_("/Directories/Next Directory")); shell->priv->move_directory_left_item = gtk_item_factory_get_widget(shell->priv->factory, N_("/Directories/Move Directory Left")); shell->priv->move_directory_right_item = gtk_item_factory_get_widget(shell->priv->factory, N_("/Directories/Move Directory Right")); /* add directory items */ st_shell_menubar_make_directory_items(shell); /* configure the view menu items */ st_shell_menubar_init_view_item(shell, N_("/View/Toolbar"), &st_settings.view_toolbar); st_shell_menubar_init_view_item(shell, N_("/View/Tabs"), &st_settings.view_tabs); st_shell_menubar_init_view_item(shell, N_("/View/Tab Icons"), &st_settings.view_tab_icons); st_shell_menubar_init_view_item(shell, N_("/View/Statusbar"), &st_settings.view_statusbar); st_shell_menubar_init_toolbar_style_item(shell, N_("/View/Toolbar Style/Desktop Default"), ST_SHELL_TOOLBAR_STYLE_GTK); st_shell_menubar_init_toolbar_style_item(shell, N_("/View/Toolbar Style/Icons Only"), GTK_TOOLBAR_ICONS); st_shell_menubar_init_toolbar_style_item(shell, N_("/View/Toolbar Style/Text Only"), GTK_TOOLBAR_TEXT); st_shell_menubar_init_toolbar_style_item(shell, N_("/View/Toolbar Style/Text Below Icons"), GTK_TOOLBAR_BOTH); st_shell_menubar_init_toolbar_style_item(shell, N_("/View/Toolbar Style/Text Beside Icons"), GTK_TOOLBAR_BOTH_HORIZ); st_shell_menubar_init_toolbar_size_item(shell, N_("/View/Toolbar Size/Desktop Default"), ST_SHELL_TOOLBAR_SIZE_GTK); st_shell_menubar_init_toolbar_size_item(shell, N_("/View/Toolbar Size/Small"), GTK_ICON_SIZE_SMALL_TOOLBAR); st_shell_menubar_init_toolbar_size_item(shell, N_("/View/Toolbar Size/Large"), GTK_ICON_SIZE_LARGE_TOOLBAR); /* pack the menubar */ gtk_box_pack_start(GTK_BOX(shell->priv->box), shell->priv->menubar, FALSE, FALSE, 0); gtk_widget_show(shell->priv->menubar);}static voidst_shell_menubar_make_directory_items (STShell *shell){ GtkWidget *separator; GSList *group = NULL; GSList *l; unsigned int num = 0; g_return_if_fail(ST_IS_SHELL(shell)); /* destroy the old items */ g_slist_foreach(shell->priv->directory_items, (GFunc) gtk_widget_destroy, NULL); g_slist_free(shell->priv->directory_items); shell->priv->directory_items = NULL; separator = gtk_separator_menu_item_new(); gtk_widget_show(separator); gtk_menu_shell_append(GTK_MENU_SHELL(shell->priv->directories_menu), separator); shell->priv->directory_items = g_slist_append(shell->priv->directory_items, separator); SG_LIST_FOREACH(l, st_handlers_list) { STHandler *handler = l->data; const char *label = st_handler_get_label(handler); GtkWidget *item; unsigned int hid; item = gtk_radio_menu_item_new_with_label(group, label); group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item)); gtk_widget_show(item); gtk_menu_shell_append(GTK_MENU_SHELL(shell->priv->directories_menu), item); if (++num < 10) { char *accel_path; char *accelerator; accel_path = g_strdup_printf("<streamtuner-Browser>/Directories/%s", label); accelerator = g_strdup_printf("<Control>%i", num); sgtk_accel_map_change_entry(accel_path, accelerator, TRUE); g_free(accel_path); g_free(accelerator); } hid = g_signal_connect(item, "toggled", G_CALLBACK(st_shell_menubar_directory_toggled_h), shell); g_object_set_data(G_OBJECT(item), "handler", handler); g_object_set_data(G_OBJECT(item), "hid", GINT_TO_POINTER(hid)); shell->priv->directory_items = g_slist_append(shell->priv->directory_items, item); }}/* * Select the menu item corresponding to the currently selected tab. */static voidst_shell_menubar_select_directory_item (STShell *shell){ STBrowserTab *tab; GSList *l; g_return_if_fail(ST_IS_SHELL(shell)); tab = st_shell_get_selected_tab(shell); SG_LIST_FOREACH(l, shell->priv->directory_items) { GtkWidget *item = l->data; STHandler *handler = g_object_get_data(G_OBJECT(item), "handler"); unsigned int hid = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(item), "hid")); if (handler == tab->handler) { g_signal_handler_block(item, hid); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE); g_signal_handler_unblock(item, hid); break; } }}static voidst_shell_menubar_init_view_item (STShell *shell, const char *path, gboolean *var){ GtkWidget *item; g_return_if_fail(ST_IS_SHELL(shell)); g_return_if_fail(path != NULL); g_return_if_fail(var != NULL); item = gtk_item_factory_get_item(shell->priv->factory, path); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), *var); if (var == &st_settings.view_tabs) gtk_widget_set_sensitive(shell->priv->view_tab_icons_item, st_settings.view_tabs); g_object_set_data(G_OBJECT(item), "shell", shell); g_signal_connect(item, "toggled", G_CALLBACK(st_shell_menubar_view_toggled_h), var);}static voidst_shell_menubar_view_toggled_h (GtkCheckMenuItem *item, gpointer user_data){ gboolean *var = user_data; STShell *shell = g_object_get_data(G_OBJECT(item), "shell"); *var = gtk_check_menu_item_get_active(item); st_shell_update_visibility(shell); if (var == &st_settings.view_tabs) gtk_widget_set_sensitive(shell->priv->view_tab_icons_item, st_settings.view_tabs);}static voidst_shell_menubar_init_toolbar_style_item (STShell *shell, const char *path, int style){ GtkWidget *item; g_return_if_fail(ST_IS_SHELL(shell)); g_return_if_fail(path != NULL); item = gtk_item_factory_get_item(shell->priv->factory, path); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), st_settings.toolbar_style == style); g_object_set_data(G_OBJECT(item), "shell", shell); g_signal_connect(item, "toggled", G_CALLBACK(st_shell_menubar_toolbar_style_toggled_h), GINT_TO_POINTER(style));}static voidst_shell_menubar_toolbar_style_toggled_h (GtkCheckMenuItem *item, gpointer user_data){ if (gtk_check_menu_item_get_active(item)) { int style = GPOINTER_TO_INT(user_data); STShell *shell = g_object_get_data(G_OBJECT(item), "shell"); st_settings.toolbar_style = style; st_shell_update_toolbar_style(shell); }}static voidst_shell_menubar_init_toolbar_size_item (STShell *shell, const char *path, int size){ GtkWidget *item; g_return_if_fail(ST_IS_SHELL(shell)); g_return_if_fail(path != NULL); item = gtk_item_factory_get_item(shell->priv->factory, path); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), st_settings.toolbar_size == size); g_object_set_data(G_OBJECT(item), "shell", shell); g_signal_connect(item, "toggled", G_CALLBACK(st_shell_menubar_toolbar_size_toggled_h), GINT_TO_POINTER(size));}static voidst_shell_menubar_toolbar_size_toggled_h (GtkCheckMenuItem *item, gpointer user_data){ if (gtk_check_menu_item_get_active(item)) { int size = GPOINTER_TO_INT(user_data); STShell *shell = g_object_get_data(G_OBJECT(item), "shell"); st_settings.toolbar_size = size; st_shell_update_toolbar_size(shell); }}static voidst_shell_menubar_directory_toggled_h (GtkCheckMenuItem *item, gpointer user_data){ if (gtk_check_menu_item_get_active(item)) { STShell *shell = user_data; STHandler *handler = g_object_get_data(G_OBJECT(item), "handler"); STBrowserTab *tab = st_shell_get_tab_with_handler(shell, handler); st_shell_select_tab(shell, tab, FALSE); }}static voidst_shell_make_toolbar (STShell *shell){ shell->priv->toolbar = gtk_toolbar_new(); shell->priv->tune_in_button = gtk_toolbar_insert_stock(GTK_TOOLBAR(shell->priv->toolbar), ST_STOCK_TUNE_IN, _("Listen to the selected stream"), NULL, (GtkSignalFunc) st_shell_toolbar_button_clicked_h, shell, -1); shell->priv->record_button = gtk_toolbar_insert_stock(GTK_TOOLBAR(shell->priv->toolbar), ST_STOCK_RECORD, _("Record the selected stream"), NULL, (GtkSignalFunc) st_shell_toolbar_button_clicked_h, shell, -1); shell->priv->browse_button = gtk_toolbar_insert_stock(GTK_TOOLBAR(shell->priv->toolbar), ST_STOCK_BROWSE, _("Browse the selected stream's web page"), NULL, (GtkSignalFunc) st_shell_toolbar_button_clicked_h, shell, -1); shell->priv->stop_button = gtk_toolbar_insert_stock(GTK_TOOLBAR(shell->priv->toolbar), GTK_STOCK_STOP, _("Stop the selected tab"), NULL, (GtkSignalFunc) st_shell_toolbar_button_clicked_h, shell, -1); shell->priv->reload_button = gtk_toolbar_insert_stock(GTK_TOOLBAR(shell->priv->toolbar), ST_STOCK_RELOAD, _("Reload the selected category"), NULL, (GtkSignalFunc) st_shell_toolbar_button_clicked_h, shell, -1); gtk_toolbar_append_space(GTK_TOOLBAR(shell->priv->toolbar)); shell->priv->link = st_link_new(); gtk_widget_show(shell->priv->link); gtk_container_set_border_width(GTK_CONTAINER(shell->priv->link), SGTK_HIG_CONTROL_SPACING); gtk_toolbar_append_widget(GTK_TOOLBAR(shell->priv->toolbar), shell->priv->link, NULL, NULL); gtk_box_pack_start(GTK_BOX(shell->priv->box), shell->priv->toolbar, FALSE, FALSE, 0); gtk_widget_show(shell->priv->toolbar);}static voidst_shell_toolbar_button_clicked_h (GtkButton *button, gpointer user_data){ STShell *shell = user_data; if ((GtkWidget *) button == shell->priv->tune_in_button)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -