/*** This file is part of pavucontrol. Copyright 2006-2008 Lennart Poettering Copyright 2008 Sjoerd Simons pavucontrol is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. pavucontrol is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with pavucontrol. If not, see . ***/ #ifdef HAVE_CONFIG_H #include #endif #include "i18n.h" #include #include "pavuapplication.h" #include "pavucontrol.h" #include "mainwindow.h" PavuApplication::PavuApplication() : Gtk::Application("org.pulseaudio.pavucontrol", Gio::ApplicationFlags::APPLICATION_HANDLES_COMMAND_LINE) { } Glib::RefPtr PavuApplication::create() { return Glib::RefPtr(new PavuApplication()); } /* * Create the main window and connect its "on_hide_window" signal to our cleanup * function */ MainWindow* PavuApplication::create_window() { m = pa_glib_mainloop_new(g_main_context_default()); g_assert(m); MainWindow* pavucontrol_window = (MainWindow *)pavucontrol_get_window(m, maximize, retry, tab); pavucontrol_window->signal_hide().connect( sigc::bind(sigc::mem_fun(*this, &PavuApplication::on_hide_window), pavucontrol_window)); return pavucontrol_window; } /* "on_activate" signal handler * This is fired via the Gtk::Application framework either directly from the * run() function, or manually from the on_command_line signal handler. * This is always executed in the first-running process. */ void PavuApplication::on_activate() { /* See if we are already running */ if (mainWindow == NULL) { /* We aren't. Create the main window */ mainWindow = create_window(); /* and register it in the Gtk::Application */ add_window(*mainWindow); } else if (tab != -1) { /* We are, and a specific tab has been requested. Select it. */ mainWindow->selectTab(tab); } /* Present the main window. */ mainWindow->present(); } /* "on_hide_window" signal handler * This is executed in the first-running process and performs cleanup before * exiting : when the last registered window of Gtk::Application is closed, * the application's run() function returns. */ void PavuApplication::on_hide_window(Gtk::Window* window) { delete window; mainWindow = NULL; if (get_context()) { pa_context_unref(get_context()); } pa_glib_mainloop_free(m); m = NULL; } template static bool get_arg_value(const Glib::RefPtr& options, const Glib::ustring& arg_name, T_ArgType& arg_value) { arg_value = T_ArgType(); if (options->lookup_value(arg_name, arg_value)) { return true; } return false; } /* * "on_command_line" signal handler * This is executed in the first-running process. */ int on_command_line(const Glib::RefPtr& command_line, Glib::RefPtr& app) { const auto options = command_line->get_options_dict(); get_arg_value(options, "tab", app->tab); get_arg_value(options, "retry", app->retry); get_arg_value(options, "maximize", app->maximize); get_arg_value(options, "version", app->version); if (app->version) { printf("%s\n", PACKAGE_STRING); return 0; } app->activate(); return 0; } int main(int argc, char *argv[]) { /* Initialize the i18n stuff */ bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); signal(SIGPIPE, SIG_IGN); /* Create the application */ auto app = PavuApplication::create(); /* Add command-line options */ app->add_main_option_entry( Gio::Application::OptionType::OPTION_TYPE_INT, "tab", 't', _("Select a specific tab on load."), _("number")); app->add_main_option_entry( Gio::Application::OptionType::OPTION_TYPE_BOOL, "retry", 'r', _("Retry forever if pa quits (every 5 seconds).")); app->add_main_option_entry( Gio::Application::OptionType::OPTION_TYPE_BOOL, "maximize", 'm', _("Maximize the window.")); app->add_main_option_entry( Gio::Application::OptionType::OPTION_TYPE_BOOL, "version", 'v', _("Show version.")); /* Connect to the "on_command_line" signal which is fired * when the application receives command-line arguments */ app->signal_command_line().connect(sigc::bind(sigc::ptr_fun(&on_command_line), app), false); /* Run the application. * In the first launched instance, this will return when its window is * closed. In subsequently launches instances, this will only signal the * first instance to handle a new request, and exit immediately. * Handling a new request consists of presenting the existing window (and * optionally, select a tab). */ return app->run(argc, argv); }