summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMateusz Łukasik <mati75@linuxmint.pl>2016-04-03 13:42:15 +0200
committerMateusz Łukasik <mati75@linuxmint.pl>2016-04-03 13:42:15 +0200
commit6f99159ef80694a47b9e7acae189efa7702b3148 (patch)
tree80a1dd972eaf8d828d1cf8b12c3487a794a57097 /src
parent7f08dcfc78675bed63f962f6d01cfb18264e12c7 (diff)
Imported Upstream version 3.7.2
Diffstat (limited to 'src')
-rw-r--r--src/audacious/main.cc26
-rw-r--r--src/libaudcore/playback.cc5
-rw-r--r--src/libaudcore/playlist.cc30
-rw-r--r--src/libaudqt/prefs-builder.cc5
-rw-r--r--src/libaudqt/prefs-plugin.cc35
-rw-r--r--src/libaudqt/prefs-widget.cc56
-rw-r--r--src/libaudqt/prefs-widget.h32
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;
};