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 + -
显示快捷键?