diff options
author | Mateusz Łukasik <mati75@linuxmint.pl> | 2016-04-03 13:42:15 +0200 |
---|---|---|
committer | Mateusz Łukasik <mati75@linuxmint.pl> | 2016-04-03 13:42:15 +0200 |
commit | 6f99159ef80694a47b9e7acae189efa7702b3148 (patch) | |
tree | 80a1dd972eaf8d828d1cf8b12c3487a794a57097 /src | |
parent | 7f08dcfc78675bed63f962f6d01cfb18264e12c7 (diff) |
Imported Upstream version 3.7.2
Diffstat (limited to 'src')
-rw-r--r-- | src/audacious/main.cc | 26 | ||||
-rw-r--r-- | src/libaudcore/playback.cc | 5 | ||||
-rw-r--r-- | src/libaudcore/playlist.cc | 30 | ||||
-rw-r--r-- | src/libaudqt/prefs-builder.cc | 5 | ||||
-rw-r--r-- | src/libaudqt/prefs-plugin.cc | 35 | ||||
-rw-r--r-- | src/libaudqt/prefs-widget.cc | 56 | ||||
-rw-r--r-- | src/libaudqt/prefs-widget.h | 32 |
7 files changed, 119 insertions, 70 deletions
diff --git a/src/audacious/main.cc b/src/audacious/main.cc index 2f436ef..8aa7e02 100644 --- a/src/audacious/main.cc +++ b/src/audacious/main.cc @@ -28,6 +28,7 @@ #include <libaudcore/hook.h> #include <libaudcore/i18n.h> #include <libaudcore/interface.h> +#include <libaudcore/mainloop.h> #include <libaudcore/playlist.h> #include <libaudcore/runtime.h> #include <libaudcore/tuple.h> @@ -296,7 +297,10 @@ static void do_commands () else if (aud_drct_get_paused ()) aud_drct_pause (); } +} +static void do_commands_at_idle (void *) +{ if (options.show_jump_box && ! options.headless) aud_ui_show_jump_to_song (); if (options.mainwin && ! options.headless) @@ -377,20 +381,22 @@ int main (int argc, char * * argv) do_commands (); - if (check_should_quit ()) - goto QUIT; + if (! check_should_quit ()) + { + QueuedFunc at_idle_func; + at_idle_func.queue (do_commands_at_idle, nullptr); - hook_associate ("playback stop", (HookFunction) maybe_quit, nullptr); - hook_associate ("playlist add complete", (HookFunction) maybe_quit, nullptr); - hook_associate ("quit", (HookFunction) aud_quit, nullptr); + hook_associate ("playback stop", (HookFunction) maybe_quit, nullptr); + hook_associate ("playlist add complete", (HookFunction) maybe_quit, nullptr); + hook_associate ("quit", (HookFunction) aud_quit, nullptr); - aud_run (); + aud_run (); - hook_dissociate ("playback stop", (HookFunction) maybe_quit); - hook_dissociate ("playlist add complete", (HookFunction) maybe_quit); - hook_dissociate ("quit", (HookFunction) aud_quit); + hook_dissociate ("playback stop", (HookFunction) maybe_quit); + hook_dissociate ("playlist add complete", (HookFunction) maybe_quit); + hook_dissociate ("quit", (HookFunction) aud_quit); + } -QUIT: #ifdef USE_DBUS dbus_server_cleanup (); #endif diff --git a/src/libaudcore/playback.cc b/src/libaudcore/playback.cc index 11fb17d..1391990 100644 --- a/src/libaudcore/playback.cc +++ b/src/libaudcore/playback.cc @@ -361,9 +361,10 @@ static void finish_playback_locked () if (pb_info.error) { failed_entries ++; - aud_ui_show_error (str_printf (_("Error opening %s:\n%s"), + aud_ui_show_error (str_printf (_("Error playing %s:\n%s"), (const char *) pb_info.filename, pb_info.error_s ? - (const char *) pb_info.error_s : _("Unknown playback error"))); + (const char *) pb_info.error_s : _("Unknown playback error " + "(check the console for detailed error information)"))); } else failed_entries = 0; diff --git a/src/libaudcore/playlist.cc b/src/libaudcore/playlist.cc index 6c186c2..a2b413c 100644 --- a/src/libaudcore/playlist.cc +++ b/src/libaudcore/playlist.cc @@ -497,7 +497,7 @@ static ScanItem * scan_list_find_request (ScanRequest * request) static void scan_queue_entry (PlaylistData * playlist, Entry * entry, bool for_playback = false) { int flags = 0; - if (! entry->scanned) + if (! entry->scanned || entry->failed) flags |= SCAN_TUPLE; if (for_playback) flags |= (SCAN_IMAGE | SCAN_FILE); @@ -611,7 +611,7 @@ static void scan_finish (ScanRequest * request) if (! entry->decoder) entry->decoder = request->decoder; - if (! entry->scanned && request->tuple) + if ((! entry->scanned || entry->failed) && request->tuple) { playlist->set_entry_tuple (entry, std::move (request->tuple)); queue_update (Metadata, playlist, entry->number, 1, DelayedUpdate); @@ -678,25 +678,35 @@ static Entry * get_entry (int playlist_num, int entry_num, warn_main_thread_blocked (); #endif + bool scan_started = false; + while (1) { PlaylistData * playlist = lookup_playlist (playlist_num); Entry * entry = playlist ? lookup_entry (playlist, entry_num) : nullptr; - // blacklist stdin - if (! entry || entry->failed || ! strncmp (entry->filename, "stdin://", 8)) + // check whether entry was deleted; also blacklist stdin + if (! entry || ! strncmp (entry->filename, "stdin://", 8)) + return entry; + + // check whether requested data (decoder and/or tuple) has been read + if ((! need_decoder || entry->decoder) && + (! need_tuple || (entry->scanned && ! entry->failed))) return entry; - if ((need_decoder && ! entry->decoder) || (need_tuple && ! entry->scanned)) + // start scan if not already running ... + if (! scan_list_find_entry (entry)) { - if (! scan_list_find_entry (entry)) - scan_queue_entry (playlist, entry); + // ... but only once + if (scan_started) + return entry; - pthread_cond_wait (& cond, & mutex); - continue; + scan_queue_entry (playlist, entry); } - return entry; + // wait for scan to finish + scan_started = true; + pthread_cond_wait (& cond, & mutex); } } diff --git a/src/libaudqt/prefs-builder.cc b/src/libaudqt/prefs-builder.cc index 7ff1605..33cd0e9 100644 --- a/src/libaudqt/prefs-builder.cc +++ b/src/libaudqt/prefs-builder.cc @@ -84,7 +84,7 @@ void prefs_populate (QBoxLayout * layout, ArrayRef<PreferencesWidget> widgets, c /* enable/disable child widgets */ if (parent_widget) - parent_widget->update (); + parent_widget->update_from_cfg (); parent_widget = nullptr; } @@ -191,6 +191,7 @@ void prefs_populate (QBoxLayout * layout, ArrayRef<PreferencesWidget> widgets, c { QFrame * f = new QFrame; f->setFrameShape (w.data.separator.horizontal ? QFrame::HLine : QFrame::VLine); + f->setFrameShadow (QFrame::Sunken); layout->addWidget (f); break; } @@ -204,7 +205,7 @@ void prefs_populate (QBoxLayout * layout, ArrayRef<PreferencesWidget> widgets, c /* enable/disable child widgets */ if (parent_widget) - parent_widget->update (); + parent_widget->update_from_cfg (); } } // namespace audqt diff --git a/src/libaudqt/prefs-plugin.cc b/src/libaudqt/prefs-plugin.cc index 0853f45..8b38950 100644 --- a/src/libaudqt/prefs-plugin.cc +++ b/src/libaudqt/prefs-plugin.cc @@ -78,7 +78,7 @@ EXPORT void plugin_prefs (PluginHandle * ph) { ConfigWindow * cw = find_config_window (ph); - if (cw) + if (cw && cw->root) { window_bring_to_front (cw->root); return; @@ -92,15 +92,25 @@ EXPORT void plugin_prefs (PluginHandle * ph) if (! p) return; - cw = new ConfigWindow; - config_windows.append (cw); + if (! cw) + { + cw = new ConfigWindow {ph}; + config_windows.append (cw); + } - cw->ph = ph; cw->root = new QDialog; + cw->root->setAttribute (Qt::WA_DeleteOnClose); if (p->init) p->init (); + QObject::connect (cw->root, & QObject::destroyed, [p, cw] () { + if (p->cleanup) + p->cleanup (); + + cw->root = nullptr; + }); + const char * name = header->info.name; if (header->info.domain) name = dgettext (header->info.domain, name); @@ -108,8 +118,9 @@ EXPORT void plugin_prefs (PluginHandle * ph) cw->root->setWindowTitle ((const char *) str_printf(_("%s Settings"), name)); QVBoxLayout * vbox = new QVBoxLayout (cw->root); - + vbox->setContentsMargins (4, 4, 4, 4); vbox->setSpacing (4); + prefs_populate (vbox, p->widgets, header->info.domain); vbox->addStretch (1); @@ -121,23 +132,19 @@ EXPORT void plugin_prefs (PluginHandle * ph) bbox->button (QDialogButtonBox::Ok)->setText (translate_str (N_("_Set"))); bbox->button (QDialogButtonBox::Cancel)->setText (translate_str (N_("_Cancel"))); - QObject::connect (bbox, & QDialogButtonBox::accepted, [=] () { - if (p->apply) - p->apply (); - - cw->root->hide (); + QObject::connect (bbox, & QDialogButtonBox::accepted, [p, cw] () { + p->apply (); + cw->root->deleteLater (); }); - - QObject::connect (bbox, & QDialogButtonBox::rejected, cw->root, & QWidget::hide); } else { bbox->setStandardButtons (QDialogButtonBox::Close); bbox->button (QDialogButtonBox::Close)->setText (translate_str (N_("_Close"))); - - QObject::connect (bbox, & QDialogButtonBox::rejected, cw->root, & QWidget::hide); } + QObject::connect (bbox, & QDialogButtonBox::rejected, cw->root, & QObject::deleteLater); + vbox->addWidget (bbox); window_bring_to_front (cw->root); diff --git a/src/libaudqt/prefs-widget.cc b/src/libaudqt/prefs-widget.cc index fded84a..f4f2dfc 100644 --- a/src/libaudqt/prefs-widget.cc +++ b/src/libaudqt/prefs-widget.cc @@ -21,6 +21,7 @@ #include "libaudqt.h" #include <assert.h> +#include <math.h> #include <QButtonGroup> #include <QComboBox> @@ -34,6 +35,21 @@ namespace audqt { +HookableWidget::HookableWidget (const PreferencesWidget * parent, const char * domain) : + m_parent (parent), m_domain (domain) +{ + if (m_parent->cfg.hook) + hook.capture (new HookReceiver<HookableWidget> + {m_parent->cfg.hook, this, & HookableWidget::update_from_cfg}); +} + +void HookableWidget::update_from_cfg () +{ + m_updating = true; + update (); + m_updating = false; +} + /* button */ ButtonWidget::ButtonWidget (const PreferencesWidget * parent, const char * domain) : QPushButton (translate_str (parent->label, domain)) @@ -49,6 +65,8 @@ BooleanWidget::BooleanWidget (const PreferencesWidget * parent, const char * dom update (); QObject::connect (this, & QCheckBox::stateChanged, [this] (int state) { + if (m_updating) + return; m_parent->cfg.set_bool (state != Qt::Unchecked); if (m_child_layout) enable_layout (m_child_layout, state != Qt::Unchecked); @@ -74,9 +92,11 @@ RadioButtonWidget::RadioButtonWidget (const PreferencesWidget * parent, update (); - QObject::connect (this, & QAbstractButton::clicked, [parent] (bool checked) { + QObject::connect (this, & QAbstractButton::toggled, [this] (bool checked) { + if (m_updating) + return; if (checked) - parent->cfg.set_int (parent->data.radio_btn.value); + m_parent->cfg.set_int (m_parent->data.radio_btn.value); }); } @@ -98,6 +118,8 @@ IntegerWidget::IntegerWidget (const PreferencesWidget * parent, const char * dom if (parent->label) layout->addWidget (new QLabel (translate_str (parent->label, domain))); + m_spinner->setRange ((int) m_parent->data.spin_btn.min, (int) m_parent->data.spin_btn.max); + m_spinner->setSingleStep ((int) m_parent->data.spin_btn.step); layout->addWidget (m_spinner); if (parent->data.spin_btn.right_label) @@ -112,15 +134,14 @@ IntegerWidget::IntegerWidget (const PreferencesWidget * parent, const char * dom * cast to the type of the correct valueChanged signal. --kaniini. */ void (QSpinBox::* signal) (int) = & QSpinBox::valueChanged; - QObject::connect (m_spinner, signal, [parent] (int value) { - parent->cfg.set_int (value); + QObject::connect (m_spinner, signal, [this] (int value) { + if (! m_updating) + m_parent->cfg.set_int (value); }); } void IntegerWidget::update () { - m_spinner->setRange ((int) m_parent->data.spin_btn.min, (int) m_parent->data.spin_btn.max); - m_spinner->setSingleStep ((int) m_parent->data.spin_btn.step); m_spinner->setValue (m_parent->cfg.get_int ()); } @@ -136,6 +157,12 @@ DoubleWidget::DoubleWidget (const PreferencesWidget * parent, const char * domai if (parent->label) layout->addWidget (new QLabel (translate_str (parent->label, domain))); + auto decimals_for = [] (double step) + { return aud::max (0, -(int) floor (log10 (step) + 0.01)); }; + + m_spinner->setDecimals (decimals_for (m_parent->data.spin_btn.step)); + m_spinner->setRange (m_parent->data.spin_btn.min, m_parent->data.spin_btn.max); + m_spinner->setSingleStep (m_parent->data.spin_btn.step); layout->addWidget (m_spinner); if (parent->data.spin_btn.right_label) @@ -146,15 +173,14 @@ DoubleWidget::DoubleWidget (const PreferencesWidget * parent, const char * domai update (); void (QDoubleSpinBox::* signal) (double) = & QDoubleSpinBox::valueChanged; - QObject::connect (m_spinner, signal, [parent] (double value) { - parent->cfg.set_float (value); + QObject::connect (m_spinner, signal, [this] (double value) { + if (! m_updating) + m_parent->cfg.set_float (value); }); } void DoubleWidget::update () { - m_spinner->setRange (m_parent->data.spin_btn.min, m_parent->data.spin_btn.max); - m_spinner->setSingleStep (m_parent->data.spin_btn.step); m_spinner->setValue (m_parent->cfg.get_float ()); } @@ -177,8 +203,9 @@ StringWidget::StringWidget (const PreferencesWidget * parent, const char * domai update (); - QObject::connect (m_lineedit, & QLineEdit::textChanged, [parent] (const QString & value) { - parent->cfg.set_string (value.toUtf8 ()); + QObject::connect (m_lineedit, & QLineEdit::textChanged, [this] (const QString & value) { + if (! m_updating) + m_parent->cfg.set_string (value.toUtf8 ()); }); } @@ -206,6 +233,9 @@ ComboBoxWidget::ComboBoxWidget (const PreferencesWidget * parent, const char * d void (QComboBox::* signal) (int) = & QComboBox::currentIndexChanged; QObject::connect (m_combobox, signal, [this] (int idx) { + if (m_updating) + return; + QVariant data = m_combobox->itemData (idx); switch (m_parent->cfg.type) @@ -319,7 +349,7 @@ NotebookWidget::NotebookWidget (const PreferencesWidget * parent, const char * d { auto widget = new QWidget (this); auto layout = new QVBoxLayout (widget); - layout->setContentsMargins (0, 0, 0, 0); + layout->setContentsMargins (4, 4, 4, 4); layout->setSpacing (4); prefs_populate (layout, tab.widgets, domain); diff --git a/src/libaudqt/prefs-widget.h b/src/libaudqt/prefs-widget.h index 3603956..f4deb4f 100644 --- a/src/libaudqt/prefs-widget.h +++ b/src/libaudqt/prefs-widget.h @@ -50,22 +50,19 @@ namespace audqt { */ /* base class which provides plumbing for hooks. */ -class HookableWidget -{ +class HookableWidget { +public: + void update_from_cfg (); + protected: - HookableWidget (const PreferencesWidget * parent, const char * domain) : - m_parent (parent), m_domain (domain) - { - if (m_parent->cfg.hook) - hook.capture (new HookReceiver<HookableWidget> - {m_parent->cfg.hook, this, & HookableWidget::update}); - } + HookableWidget (const PreferencesWidget * parent, const char * domain); virtual ~HookableWidget () {} virtual void update () {} const PreferencesWidget * const m_parent; const char * const m_domain; + bool m_updating = false; private: SmartPtr<HookReceiver<HookableWidget>> hook; @@ -78,15 +75,15 @@ public: }; /* boolean widget (checkbox) */ -class BooleanWidget : public QCheckBox, HookableWidget { +class BooleanWidget : public QCheckBox, public HookableWidget { public: BooleanWidget (const PreferencesWidget * parent, const char * domain); - void update (); void set_child_layout (QLayout * layout) { m_child_layout = layout; } private: + void update (); QLayout * m_child_layout = nullptr; }; @@ -94,9 +91,8 @@ private: class IntegerWidget : public QWidget, HookableWidget { public: IntegerWidget (const PreferencesWidget * parent, const char * domain); - void update (); - private: + void update (); QSpinBox * m_spinner; }; @@ -105,6 +101,7 @@ class RadioButtonWidget : public QRadioButton, HookableWidget { public: RadioButtonWidget (const PreferencesWidget * parent, const char * domain, QButtonGroup * btn_group); +private: void update (); }; @@ -112,9 +109,8 @@ public: class DoubleWidget : public QWidget, HookableWidget { public: DoubleWidget (const PreferencesWidget * parent, const char * domain); - void update (); - private: + void update (); QDoubleSpinBox * m_spinner; }; @@ -122,9 +118,8 @@ private: class StringWidget : public QWidget, HookableWidget { public: StringWidget (const PreferencesWidget * parent, const char * domain); - void update (); - private: + void update (); QLineEdit * m_lineedit; }; @@ -132,9 +127,8 @@ private: class ComboBoxWidget : public QWidget, HookableWidget { public: ComboBoxWidget (const PreferencesWidget * parent, const char * domain); - void update (); - private: + void update (); QComboBox * m_combobox; }; |