⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 st-shell.c

📁 linux下网络收音机的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -