📄 gtk_gui.cpp
字号:
g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "openurl"), "activate", G_CALLBACK (gtk_C_callback_open_url), (void*)this); g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "reload"), "activate", G_CALLBACK (gtk_C_callback_reload), (void*)this); g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "preferences"), "activate", G_CALLBACK (gtk_C_callback_settings_select), (void *) this ); g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "loadsettings"), "activate", G_CALLBACK (gtk_C_callback_load_settings), (void*)this); g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "quit"), "activate", G_CALLBACK (gtk_C_callback_quit), (void*)this); g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "play"), "activate", G_CALLBACK (gtk_C_callback_play), (void*)this); g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "pause"), "activate", G_CALLBACK (gtk_C_callback_pause), (void*)this ); g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "stop"), "activate", G_CALLBACK (gtk_C_callback_stop), (void*)this); g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "fullscreen"), "activate", G_CALLBACK (gtk_C_callback_full_screen), (void*)this); g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "window"), "activate", G_CALLBACK (gtk_C_callback_normal_screen), (void*)this); g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "logwindow"), "activate", G_CALLBACK (gtk_C_callback_logger_window), (void*)this); g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "about"), "activate", G_CALLBACK (gtk_C_callback_about), (void*)this); g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "help"), "activate", G_CALLBACK (gtk_C_callback_help), (void*)this); g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "website"), "activate", G_CALLBACK (gtk_C_callback_homepage), (void*)this); g_signal_connect_swapped (gtk_action_group_get_action (m_actions, "welcome"), "activate", G_CALLBACK (gtk_C_callback_welcome), (void*)this); /* Creation of the Menubar and Menu Items */ menubar = gtk_ui_manager_get_widget (ui, "/MenuBar"); gtk_box_pack_start (GTK_BOX (m_guicontainer), menubar, FALSE, FALSE, 0); gtk_widget_show_all(GTK_WIDGET (m_toplevelcontainer)); /* Creation of the document area */ m_documentcontainer = gtk_drawing_area_new(); gtk_widget_hide(m_documentcontainer); gtk_box_pack_start (GTK_BOX (m_guicontainer), m_documentcontainer, TRUE, TRUE, 0); // creates the main loop main_loop = g_main_loop_new(NULL, FALSE); _update_menus();}gtk_gui::~gtk_gui() { AM_DBG printf("%s0x%X\n", "gtk_gui::~gtk_gui(), m_mainloop=",m_mainloop); // remove all dynamic data in the same order as they are declared // m_programfilename - not dynamic if (m_smilfilename) { free((void*)m_smilfilename); m_smilfilename = NULL; } if (m_settings) { delete m_settings; m_settings = NULL; } if (m_toplevelcontainer) { /* Although it seems a good idea to destroy the top-level widget at this point, by some unrevealed magic it seems already been done by gtk, resulting in cryptic error messages like: GLib-GObject-WARNING **: invalid uninstantiatable type `(null)' in cast to `GtkWidget' Gtk-CRITICAL **: gtk_widget_destroy: assertion `GTK_IS_WIDGET (widget)' failed Commenting out next line doesn't seem to contribute to any extra memory leaks, gtk_init() alone is responsible for almost all of them gtk_widget_destroy(GTK_WIDGET (m_toplevelcontainer)); */ m_toplevelcontainer = NULL; } if (menubar) { gtk_widget_destroy(GTK_WIDGET (menubar)); menubar = NULL; }/*KB these seem to be destroyed already by destroying m_toplevelcontainer if (m_guicontainer) { gtk_widget_destroy(GTK_WIDGET (m_guicontainer)); m_guicontainer = NULL; } if (m_documentcontainer) { gtk_widget_destroy(GTK_WIDGET (m_documentcontainer)); m_documentcontainer = NULL; }*/ if (m_actions) { g_object_unref(G_OBJECT (m_actions)); m_actions = NULL; } if (m_file_chooser) { gtk_widget_destroy(GTK_WIDGET (m_file_chooser)); m_file_chooser = NULL; } if (m_settings_chooser) { gtk_widget_destroy(GTK_WIDGET (m_settings_chooser)); m_settings_chooser = NULL; } if (m_url_text_entry) { gtk_widget_destroy(GTK_WIDGET (m_url_text_entry)); m_url_text_entry = NULL; } if (m_mainloop) { delete m_mainloop; m_mainloop = NULL; }}GtkWindow*gtk_gui::get_toplevel_container(){ return this->m_toplevelcontainer;}GtkWidget*gtk_gui::get_gui_container(){ return this->m_guicontainer;}GtkWidget*gtk_gui::get_document_container(){ return this->m_documentcontainer;}void gtk_gui::do_about() { GtkMessageDialog* dialog = (GtkMessageDialog*) gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, gettext("About AmbulantPlayer")); gtk_message_dialog_format_secondary_text(dialog,about_text,get_version()); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (GTK_WIDGET (dialog));}void gtk_gui::do_homepage() { open_web_browser("http://www.ambulantplayer.org");}void gtk_gui::do_welcome() { const char *welcome_doc = find_datafile(welcome_locations); if (welcome_doc) { if( openSMILfile(welcome_doc, 0, true)) { do_play(); } } else { GtkMessageDialog* dialog = (GtkMessageDialog*) gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, gettext("Cannot find Welcome.smil document")); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (GTK_WIDGET (dialog)); }}void gtk_gui::do_help() { const char *help_doc = find_datafile(helpfile_locations); if (help_doc) { open_web_browser(help_doc); } else { GtkMessageDialog* dialog = (GtkMessageDialog*) gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, gettext("Cannot find Ambulant Player Help")); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (GTK_WIDGET (dialog)); }}voidgtk_gui::do_logger_window() { AM_DBG printf("do_logger_window()\n"); GtkWindow* logger_window = gtk_logger::get_gtk_logger()->get_logger_window(); if (GTK_WIDGET_VISIBLE (GTK_WIDGET (logger_window))) gtk_widget_hide(GTK_WIDGET (logger_window)); else gtk_widget_show(GTK_WIDGET (logger_window));}voidgtk_gui::fileError(const gchar* smilfilename) { char buf[1024]; sprintf(buf, gettext(gettext("%s: Cannot open file: %s")), (const char*) smilfilename, strerror(errno)); GtkMessageDialog* dialog = (GtkMessageDialog*) gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, m_programfilename); gtk_message_dialog_format_secondary_text(dialog, buf); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (GTK_WIDGET (dialog));}bool gtk_gui::openSMILfile(const char *smilfilename, int mode, bool dupFlag) { if (smilfilename==NULL) return false; gtk_window_set_title(GTK_WINDOW (m_toplevelcontainer), smilfilename); if (dupFlag) { if (m_smilfilename) free ((void*)m_smilfilename); m_smilfilename = strdup(smilfilename); } if (m_mainloop) delete m_mainloop; m_mainloop = new gtk_mainloop(this); _update_menus(); return m_mainloop->is_open();}void gtk_gui::do_open(){ m_file_chooser = GTK_FILE_CHOOSER (gtk_file_chooser_dialog_new(gettext("Please, select a file"), NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL)); GtkFileFilter *filter_smil = gtk_file_filter_new(); gtk_file_filter_set_name(filter_smil, gettext("SMIL files")); gtk_file_filter_add_pattern(filter_smil, "*.smil"); gtk_file_filter_add_pattern(filter_smil, "*.smi"); gtk_file_chooser_add_filter(m_file_chooser, filter_smil); GtkFileFilter *filter_all = gtk_file_filter_new(); gtk_file_filter_set_name(filter_all, gettext("All files")); gtk_file_filter_add_pattern(filter_all, "*.smil"); gtk_file_filter_add_pattern(filter_all, "*.smi"); gtk_file_filter_add_pattern(filter_all, "*.mms"); gtk_file_filter_add_pattern(filter_all, "*.grins"); gtk_file_chooser_add_filter(m_file_chooser, filter_all); GtkFileFilter *filter_any = gtk_file_filter_new(); gtk_file_filter_set_name(filter_any, gettext("Any file")); gtk_file_filter_add_pattern(filter_any, "*"); gtk_file_chooser_add_filter(m_file_chooser, filter_any); gint result = gtk_dialog_run (GTK_DIALOG (m_file_chooser)); switch (result){ case GTK_RESPONSE_ACCEPT: do_file_selected(); break; default: break; } gtk_widget_hide(GTK_WIDGET (m_file_chooser)); }void gtk_gui::do_file_selected() { const gchar *smilfilename = gtk_file_chooser_get_filename (m_file_chooser); if (openSMILfile(smilfilename, 0, true)) { g_free((void*)smilfilename); do_play(); }}voidgtk_gui::setDocument(const char* smilfilename) {#ifdef GTK_NO_FILEDIALOG /* Assume embedded GTK */ if (openSMILfile(smilfilename, 0, true)) do_play();#endif/*GTK_NO_FILEDIALOG*/}voidgtk_gui::do_settings_selected() { const gchar *settings_filename = gtk_file_chooser_get_filename (m_settings_chooser); if ( settings_filename != NULL) { smil2::test_attrs::load_test_attrs(settings_filename); if (openSMILfile(m_smilfilename, 0, false)) do_play(); }}void gtk_gui::do_load_settings() { if (m_mainloop && m_mainloop->is_open()) do_stop(); m_settings_chooser = GTK_FILE_CHOOSER (gtk_file_chooser_dialog_new(gettext("Please, select a settings file"), NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL)); GtkFileFilter *filter_xml = gtk_file_filter_new(); gtk_file_filter_set_name(filter_xml, gettext("XML files")); gtk_file_filter_add_pattern(filter_xml, "*.xml"); gtk_file_chooser_add_filter(m_settings_chooser, filter_xml); gint result = gtk_dialog_run (GTK_DIALOG (m_settings_chooser)); switch (result){ case GTK_RESPONSE_ACCEPT: do_settings_selected(); break; default: break; } gtk_widget_hide(GTK_WIDGET (m_settings_chooser)); /* Ensure that the dialog box is hidden when the user clicks a button. We don't need anymore the callbacks, because they can be embedded in this part of the code *//* g_signal_connect_swapped (GTK_FILE_SELECTION (m_settings_selector)->ok_button, "clicked", G_CALLBACK (gtk_widget_hide), m_settings_selector); g_signal_connect_swapped (GTK_FILE_SELECTION (m_settings_selector)->cancel_button, "clicked", G_CALLBACK (gtk_widget_hide), m_settings_selector); g_signal_connect_swapped (GTK_OBJECT ((m_settings_selector)->ok_button),"clicked", G_CALLBACK (gtk_C_callback_settings_selected),(void*) this);*/}void gtk_gui::do_open_url() { GtkDialog* url_dialog = GTK_DIALOG (gtk_dialog_new_with_buttons ("AmbulantPlayer", NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL)); GtkLabel* label = GTK_LABEL (gtk_label_new(gettext("URL to open:"))); gtk_misc_set_alignment (GTK_MISC (label), 0, 0); gtk_widget_show(GTK_WIDGET (label)); m_url_text_entry = GTK_ENTRY (gtk_entry_new()); gtk_entry_set_editable(m_url_text_entry, true); gtk_entry_set_text(m_url_text_entry,"http://www"); gtk_widget_show(GTK_WIDGET (m_url_text_entry)); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(url_dialog)->vbox), GTK_WIDGET (label)); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(url_dialog)->vbox), GTK_WIDGET (m_url_text_entry)); gint result = gtk_dialog_run (GTK_DIALOG (url_dialog)); switch (result){ case GTK_RESPONSE_ACCEPT: do_url_selected(); break; default: break; } gtk_widget_destroy (GTK_WIDGET (url_dialog));/* g_signal_connect_swapped (url_dialog,"response", G_CALLBACK (gtk_C_callback_url_selected), (void*) this); g_signal_connect_swapped (url_dialog, "response", G_CALLBACK (gtk_widget_hide), GTK_WIDGET (url_dialog)); gtk_widget_show_all(GTK_WIDGET (url_dialog));*/}void gtk_gui::do_url_selected() { /* Next string points to internally allocated storage in the widget and must not be freed, modified or stored.*/ const gchar *smilfilename = gtk_entry_get_text(m_url_text_entry); gtk_window_set_title(GTK_WINDOW (m_toplevelcontainer), smilfilename); if (openSMILfile(smilfilename, 0, true)) { do_play(); }}void gtk_gui::do_player_done() { AM_DBG printf("%s-%s\n", m_programfilename, "do_player_done"); _update_menus();}void gtk_gui::need_redraw (const void* r, void* w, const void* pt) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -