st-shell.c

来自「linux下网络收音机的源码」· C语言 代码 · 共 2,166 行 · 第 1/5 页

C
2,166
字号
  gtk_widget_destroy(shell->priv->window);  while (gtk_events_pending())    gtk_main_iteration();  /* save session and restart or quit */  st_session_save();  if (shell->priv->restart)    {      char *secondary;      char *normalized;      execvp(st_main_argv[0], st_main_argv);      secondary = g_strdup_printf(_("Unable to restart streamtuner: %s"), g_strerror(errno));      normalized = st_dialog_normalize(secondary);      g_free(secondary);      st_error_dialog(_("A fatal error has occurred"), "%s", normalized);      g_free(normalized);    }    gtk_main_quit();  parent_class->finalize(object);}static voidst_shell_make_window (STShell *shell){  shell->priv->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  g_object_add_weak_pointer(G_OBJECT(shell->priv->window), (gpointer *) &shell->priv->window);  shell->priv->accel_group = gtk_accel_group_new();  gtk_window_add_accel_group(GTK_WINDOW(shell->priv->window), shell->priv->accel_group);  st_window_set_icon(GTK_WINDOW(shell->priv->window));  shell->priv->box = gtk_vbox_new(FALSE, 0);  gtk_container_add(GTK_CONTAINER(shell->priv->window), shell->priv->box);  gtk_widget_show(shell->priv->box);  sgtk_window_link_size(GTK_WINDOW(shell->priv->window),			&st_settings.main_window_width,			&st_settings.main_window_height);  g_object_connect(shell->priv->window,		   "signal::window-state-event", st_shell_window_state_event_h, shell,		   "signal::delete-event", st_shell_window_delete_event_h, shell,		   NULL);}static gbooleanst_shell_window_state_event_h (GtkWidget *widget,			       GdkEventWindowState *event,			       gpointer user_data){  STShell *shell = user_data;  if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN)    {      if (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)	st_shell_fullscreen(shell);      else	st_shell_unfullscreen(shell);    }  return FALSE;			/* propagate event */}static gbooleanst_shell_window_delete_event_h (GtkWidget *widget,				GdkEvent *event,				gpointer user_data){  STShell *shell = user_data;  g_object_unref(shell);  return TRUE;			/* do not propagate event */}static voidst_shell_fullscreen (STShell *shell){  GtkWidget *button;  g_return_if_fail(ST_IS_SHELL(shell));  shell->priv->fullscreen = TRUE;  shell->priv->leave_fullscreen_popup = gtk_window_new(GTK_WINDOW_POPUP);    button = gtk_button_new_from_stock(ST_STOCK_LEAVE_FULLSCREEN);  gtk_container_add(GTK_CONTAINER(shell->priv->leave_fullscreen_popup), button);  gtk_widget_show(button);  g_signal_connect(button, "clicked", G_CALLBACK(st_shell_leave_fullscreen_button_clicked_h), shell);  st_shell_update_visibility(shell);  st_shell_update_toolbar_style(shell);  shell->priv->leave_fullscreen_popup_visible = TRUE;  st_shell_update_leave_fullscreen_popup_position(shell);  gtk_widget_show(shell->priv->leave_fullscreen_popup);  shell->priv->screen_size_changed_hid    = g_signal_connect(gdk_screen_get_default(),		       "size-changed",		       G_CALLBACK(st_shell_screen_size_changed_h),		       shell);  shell->priv->key_press_event_hid    = g_signal_connect(shell->priv->window,		       "key-press-event",		       G_CALLBACK(st_shell_window_key_press_event_h),		       shell);  g_object_connect(shell->priv->leave_fullscreen_popup,		   "signal::enter-notify-event", st_shell_leave_fullscreen_enter_notify_event_h, shell,		   "signal::leave-notify-event", st_shell_leave_fullscreen_leave_notify_event_h, shell,		   NULL);  shell->priv->leave_fullscreen_timeout_id = g_timeout_add(5000, st_shell_leave_fullscreen_timeout_cb, shell);}static voidst_shell_unfullscreen (STShell *shell){  g_return_if_fail(ST_IS_SHELL(shell));  g_signal_handler_disconnect(gdk_screen_get_default(), shell->priv->screen_size_changed_hid);  g_signal_handler_disconnect(shell->priv->window, shell->priv->key_press_event_hid);  if (shell->priv->leave_fullscreen_timeout_id)    {      g_source_remove(shell->priv->leave_fullscreen_timeout_id);      shell->priv->leave_fullscreen_timeout_id = 0;    }  gtk_widget_destroy(shell->priv->leave_fullscreen_popup);  shell->priv->leave_fullscreen_popup = NULL;  shell->priv->fullscreen = FALSE;  st_shell_update_visibility(shell);  st_shell_update_toolbar_style(shell);}static voidst_shell_leave_fullscreen_button_clicked_h (GtkButton *button,					    gpointer user_data){  STShell *shell = user_data;  gtk_window_unfullscreen(GTK_WINDOW(shell->priv->window));}static gbooleanst_shell_leave_fullscreen_timeout_cb (gpointer data){  STShell *shell = data;  GDK_THREADS_ENTER();  shell->priv->leave_fullscreen_popup_visible = FALSE;  st_shell_update_leave_fullscreen_popup_position(shell);  shell->priv->leave_fullscreen_timeout_id = 0;  GDK_THREADS_LEAVE();    return FALSE;			/* remove timeout */}static gbooleanst_shell_leave_fullscreen_enter_notify_event_h (GtkWidget *widget,						GdkEventCrossing *event,						gpointer user_data){  STShell *shell = user_data;  if (shell->priv->leave_fullscreen_timeout_id)    {      g_source_remove(shell->priv->leave_fullscreen_timeout_id);      shell->priv->leave_fullscreen_timeout_id = 0;    }  shell->priv->leave_fullscreen_popup_visible = TRUE;  st_shell_update_leave_fullscreen_popup_position(shell);  return FALSE;			/* propagate event */}static gbooleanst_shell_leave_fullscreen_leave_notify_event_h (GtkWidget *widget,						GdkEventCrossing *event,						gpointer user_data){  STShell *shell = user_data;  if (shell->priv->leave_fullscreen_timeout_id)    {      g_source_remove(shell->priv->leave_fullscreen_timeout_id);      shell->priv->leave_fullscreen_timeout_id = 0;    }  shell->priv->leave_fullscreen_timeout_id = g_timeout_add(5000, st_shell_leave_fullscreen_timeout_cb, shell);  return FALSE;			/* propagate event */}static voidst_shell_update_leave_fullscreen_popup_position (STShell *shell){  GdkScreen *screen;  int monitor_num;  GdkRectangle screen_rect;  int popup_width;  int popup_height;  int y;  g_return_if_fail(ST_IS_SHELL(shell));  g_return_if_fail(shell->priv->leave_fullscreen_popup != NULL);  screen = gdk_screen_get_default();  monitor_num = gdk_screen_get_monitor_at_window(screen, shell->priv->window->window);  gdk_screen_get_monitor_geometry(screen, monitor_num, &screen_rect);  gtk_window_get_size(GTK_WINDOW(shell->priv->leave_fullscreen_popup), &popup_width, &popup_height);  y = screen_rect.y;  if (! shell->priv->leave_fullscreen_popup_visible)    y -= popup_height - 2;  gtk_window_move(GTK_WINDOW(shell->priv->leave_fullscreen_popup), screen_rect.width - popup_width, y);}static voidst_shell_screen_size_changed_h (GdkScreen *screen, gpointer user_data){  STShell *shell = user_data;  st_shell_update_leave_fullscreen_popup_position(shell);}static gbooleanst_shell_window_key_press_event_h (GtkWidget *widget,				   GdkEventKey *event,				   gpointer user_data){  STShell *shell = user_data;  static unsigned int escape_key = 0;  static GdkModifierType escape_mods;  if (! escape_key)    gtk_accelerator_parse("Escape", &escape_key, &escape_mods);  if (event->keyval == escape_key && (escape_mods & event->state) == escape_mods)    {      gtk_window_unfullscreen(GTK_WINDOW(shell->priv->window));      return TRUE;	/* Escape is the shortcut for "Stop", block it */    }  else    return FALSE;	/* propagate event */}static voidst_shell_make_menubar (STShell *shell){  /* keep in sync with the stock items in st-stock.c */  static GtkItemFactoryEntry entries[] = {    {      N_("/_Stream"),				NULL,      NULL,					0,      "<Branch>",				NULL    },    {      N_("/Stream/_New Preselection..."),	"<Control>N",      st_shell_new_preselection,		0,      "<StockItem>",				ST_STOCK_NEW_PRESELECTION    },    {      "/Stream/separator1",			NULL,      NULL,					0,      "<Separator>",				NULL    },    {      "/Stream/separator2",			NULL,      NULL,					0,      "<Separator>",				NULL    },    {      N_("/Stream/_Quit"),			NULL,      g_object_unref,				0,      "<StockItem>",				GTK_STOCK_QUIT    },    {      N_("/_Edit"),				NULL,      NULL,					0,      "<Branch>",				NULL    },    {      N_("/Edit/Select _All"),			"<Control>A",      st_shell_select_all,			0,      "<StockItem>",				ST_STOCK_SELECT_ALL    },    {      "/Edit/separator1",			NULL,      NULL,					0,      "<Separator>",				NULL    },    {      N_("/Edit/_Find..."),			NULL,      st_shell_find,				0,      "<StockItem>",				GTK_STOCK_FIND    },    {      N_("/Edit/Find Ne_xt"),			"<Control>G",      st_shell_find_next,			0,      "<Item>",					NULL    },    {      N_("/Edit/Find Pre_vious"),		"<Shift><Control>G",      st_shell_find_previous,			0,      "<Item>",					NULL    },    {      "/Edit/separator2",			NULL,      NULL,					0,      "<Separator>",				NULL    },    {      N_("/Edit/_Search in All Categories..."),	"<Shift><Control>S",      st_shell_search_in_all_categories,	0,      "<Item>",					NULL    },    {      "/Edit/separator3",			NULL,      NULL,					0,      "<Separator>",				NULL    },    {      N_("/Edit/_Preferences"),			NULL,      st_shell_present_preferences,		0,      "<StockItem>",				GTK_STOCK_PREFERENCES    },    {      N_("/_View"),				NULL,      NULL,					0,      "<Branch>",				NULL    },    {      N_("/View/_Toolbar"),			NULL,      NULL,					0,      "<CheckItem>",				NULL    },    {      N_("/View/Ta_bs"),			NULL,      NULL,					0,      "<CheckItem>",				NULL    },    {      N_("/View/Tab Ic_ons"),			NULL,      NULL,					0,      "<CheckItem>",				NULL    },    {      N_("/View/St_atusbar"),			NULL,      NULL,					0,      "<CheckItem>",				NULL    },    {      "/View/separator1",			NULL,      NULL,					0,      "<Separator>",				NULL    },    {      N_("/View/Toolbar Styl_e"),		NULL,      NULL,					0,      "<Branch>",				NULL    },    {      N_("/View/Toolbar Style/_Desktop Default"), NULL,      NULL,					0,      "<RadioItem>",				NULL    },    {      "/View/Toolbar Style/separator1",		NULL,      NULL,					0,      "<Separator>",				NULL    },    {      N_("/View/Toolbar Style/I_cons Only"),	NULL,      NULL,					0,      N_("/View/Toolbar Style/Desktop Default"), NULL    },    {      N_("/View/Toolbar Style/_Text Only"),	NULL,      NULL,					0,      N_("/View/Toolbar Style/Desktop Default"), NULL    },    {      N_("/View/Toolbar Style/Text Belo_w Icons"), NULL,      NULL,					0,      N_("/View/Toolbar Style/Desktop Default"), NULL    },    {      N_("/View/Toolbar Style/Text Be_side Icons"), NULL,      NULL,					0,      N_("/View/Toolbar Style/Desktop Default"), NULL    },    {      N_("/View/Toolbar Si_ze"),		NULL,      NULL,					0,      "<Branch>",				NULL    },    {      N_("/View/Toolbar Size/_Desktop Default"), NULL,      NULL,					0,      "<RadioItem>",				NULL    },    {      "/View/Toolbar Size/separator1",		NULL,      NULL,					0,      "<Separator>",				NULL    },    {      N_("/View/Toolbar Size/_Small"),		NULL,      NULL,					0,      N_("/View/Toolbar Size/Desktop Default"),	NULL    },    {      N_("/View/Toolbar Size/_Large"),		NULL,      NULL,					0,      N_("/View/Toolbar Size/Desktop Default"),	NULL

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?