From 8f82aac3616133df4c550270ffa3f23e1697e53c Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Sun, 19 Apr 2020 15:30:42 +1000
Subject: Fix build for Haiku


diff --git a/CMakeLists.txt b/CMakeLists.txt
index 600dc6e..e414a18 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -49,7 +49,7 @@ find_package(PkgConfig REQUIRED)
 find_package(Protobuf REQUIRED)
 find_package(FFTW3)
 find_package(ALSA)
-if (NOT APPLE)
+if (NOT APPLE AND NOT HAIKU)
   find_package(X11)
 endif()
 if(X11_FOUND)
@@ -398,6 +398,7 @@ if(NOT QTIOCOMPRESSOR_INCLUDE_DIRS OR NOT QTIOCOMPRESSOR_LIBRARIES)
   set(QTIOCOMPRESSOR_LIBRARIES qtiocompressor)
 endif(NOT QTIOCOMPRESSOR_INCLUDE_DIRS OR NOT QTIOCOMPRESSOR_LIBRARIES)
 
+if (NOT HAIKU)
 # When/if upstream accepts our or reimplement our patches then these options can be
 # used to link to system installed qxt instead.
 option(USE_SYSTEM_QXT "Don't set this option unless your system Qxt library has been compiled with the Clementine patches in 3rdparty" OFF)
@@ -415,6 +416,7 @@ else (USE_SYSTEM_QXT)
     add_subdirectory(3rdparty/qxt)
   endif (NOT APPLE)
 endif (USE_SYSTEM_QXT)
+endif (NOT HAIKU)
 
 # Use system gmock if it's available
 # We need to look for both gmock and gtest
diff --git a/data/data.qrc b/data/data.qrc
index 757a575..a6b0a8b 100644
--- a/data/data.qrc
+++ b/data/data.qrc
@@ -102,6 +102,9 @@
         <file>icons/22x22/x-clementine-artist.png</file>
         <file>icons/22x22/x-clementine-shuffle.png</file>
         <file>icons/22x22/zoom-in.png</file>
+        <file>icons/22x22/folder-network.png</file>
+        <file>icons/22x22/folder-open.png</file>
+        <file>icons/22x22/folder-text.png</file>
         <file>icons/32x32/application-exit.png</file>
         <file>icons/32x32/applications-internet.png</file>
         <file>icons/32x32/audio-volume-medium.png</file>
@@ -188,6 +191,9 @@
         <file>icons/32x32/x-clementine-artist.png</file>
         <file>icons/32x32/x-clementine-shuffle.png</file>
         <file>icons/32x32/zoom-in.png</file>
+        <file>icons/32x32/folder-network.png</file>
+        <file>icons/32x32/folder-open.png</file>
+        <file>icons/32x32/folder-text.png</file>
         <file>icons/48x48/application-exit.png</file>
         <file>icons/48x48/applications-internet.png</file>
         <file>icons/48x48/audio-volume-medium.png</file>
@@ -269,6 +275,9 @@
         <file>icons/48x48/x-clementine-artist.png</file>
         <file>icons/48x48/x-clementine-shuffle.png</file>
         <file>icons/48x48/zoom-in.png</file>
+        <file>icons/48x48/folder-network.png</file>
+        <file>icons/48x48/folder-open.png</file>
+        <file>icons/48x48/folder-text.png</file>
         <file>last.fm/as_disabled.png</file>
         <file>last.fm/as_light.png</file>
         <file>last.fm/as.png</file>
diff --git a/data/icons/22x22/folder-network.png b/data/icons/22x22/folder-network.png
new file mode 120000
index 0000000..b2eb970
--- /dev/null
+++ b/data/icons/22x22/folder-network.png
@@ -0,0 +1 @@
+applications-internet.png
\ No newline at end of file
diff --git a/data/icons/22x22/folder-open.png b/data/icons/22x22/folder-open.png
new file mode 120000
index 0000000..f58170c
--- /dev/null
+++ b/data/icons/22x22/folder-open.png
@@ -0,0 +1 @@
+document-open.png
\ No newline at end of file
diff --git a/data/icons/22x22/folder-text.png b/data/icons/22x22/folder-text.png
new file mode 120000
index 0000000..fcdd6f2
--- /dev/null
+++ b/data/icons/22x22/folder-text.png
@@ -0,0 +1 @@
+view-media-playlist.png
\ No newline at end of file
diff --git a/data/icons/32x32/folder-network.png b/data/icons/32x32/folder-network.png
new file mode 120000
index 0000000..b2eb970
--- /dev/null
+++ b/data/icons/32x32/folder-network.png
@@ -0,0 +1 @@
+applications-internet.png
\ No newline at end of file
diff --git a/data/icons/32x32/folder-open.png b/data/icons/32x32/folder-open.png
new file mode 120000
index 0000000..f58170c
--- /dev/null
+++ b/data/icons/32x32/folder-open.png
@@ -0,0 +1 @@
+document-open.png
\ No newline at end of file
diff --git a/data/icons/32x32/folder-text.png b/data/icons/32x32/folder-text.png
new file mode 120000
index 0000000..fcdd6f2
--- /dev/null
+++ b/data/icons/32x32/folder-text.png
@@ -0,0 +1 @@
+view-media-playlist.png
\ No newline at end of file
diff --git a/data/icons/48x48/folder-network.png b/data/icons/48x48/folder-network.png
new file mode 120000
index 0000000..b2eb970
--- /dev/null
+++ b/data/icons/48x48/folder-network.png
@@ -0,0 +1 @@
+applications-internet.png
\ No newline at end of file
diff --git a/data/icons/48x48/folder-open.png b/data/icons/48x48/folder-open.png
new file mode 120000
index 0000000..f58170c
--- /dev/null
+++ b/data/icons/48x48/folder-open.png
@@ -0,0 +1 @@
+document-open.png
\ No newline at end of file
diff --git a/data/icons/48x48/folder-text.png b/data/icons/48x48/folder-text.png
new file mode 120000
index 0000000..fcdd6f2
--- /dev/null
+++ b/data/icons/48x48/folder-text.png
@@ -0,0 +1 @@
+view-media-playlist.png
\ No newline at end of file
diff --git a/ext/libclementine-common/core/logging.cpp b/ext/libclementine-common/core/logging.cpp
index 8012c0c..89b6ab2 100644
--- a/ext/libclementine-common/core/logging.cpp
+++ b/ext/libclementine-common/core/logging.cpp
@@ -315,7 +315,7 @@ QString DemangleSymbol(const QString& symbol) {
 }
 
 void DumpStackTrace() {
-#ifdef Q_OS_UNIX
+#if defined(Q_OS_UNIX) && !defined(Q_OS_HAIKU)
   void* callstack[128];
   int callstack_size =
       backtrace(reinterpret_cast<void**>(&callstack), sizeof(callstack));
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 627b2e7..eb4e239 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -912,6 +912,14 @@ optional_source(WIN32
     ${CMAKE_SOURCE_DIR}/3rdparty/tinysvcmdns
 )
 
+# Platform specific - Haiku
+optional_source(HAIKU
+  SOURCES
+    widgets/osd_win.cpp
+  INCLUDE_DIRECTORIES
+    ${CMAKE_SOURCE_DIR}/3rdparty/tinysvcmdns
+)
+
 # Platform specific - X11
 optional_source(HAVE_X11 SOURCES widgets/osd_x11.cpp)
 
@@ -1379,7 +1387,7 @@ if (WIN32)
   )
 endif (WIN32)
 
-if (UNIX AND NOT APPLE)
+if (UNIX AND NOT APPLE AND NOT HAIKU)
   # Hack: the Gold linker pays attention to the order that libraries are
   # specified on the link line.  -lX11 and -ldl are provided earlier in the link
   # command but they're actually used by libraries that appear after them, so
diff --git a/src/core/backgroundstreams.cpp b/src/core/backgroundstreams.cpp
index 2e6ac60..9ac5b59 100644
--- a/src/core/backgroundstreams.cpp
+++ b/src/core/backgroundstreams.cpp
@@ -44,7 +44,7 @@ void BackgroundStreams::LoadStreams() {
   int version = s.value("version", 0).toInt();
   if (version < 1) {
     AddStream(QT_TR_NOOP("Hypnotoad"), QUrl(kHypnotoadUrl));
-    AddStream(QT_TR_NOOP("Rain"), QUrl(kRainUrl));
+//    AddStream(QT_TR_NOOP("Rain"), QUrl(kRainUrl));
   }
 
   if (version < kVersion) {
diff --git a/src/core/qxtglobalshortcutbackend.cpp b/src/core/qxtglobalshortcutbackend.cpp
index 1acd08a..44ef7b3 100644
--- a/src/core/qxtglobalshortcutbackend.cpp
+++ b/src/core/qxtglobalshortcutbackend.cpp
@@ -25,12 +25,15 @@
 
 #include "core/logging.h"
 #include "globalshortcuts.h"
+#ifndef Q_OS_HAIKU
 #include "qxtglobalshortcut.h"
+#endif
 
 QxtGlobalShortcutBackend::QxtGlobalShortcutBackend(GlobalShortcuts* parent)
     : GlobalShortcutBackend(parent) {}
 
 bool QxtGlobalShortcutBackend::DoRegister() {
+#ifndef Q_OS_HAIKU
   if (QGuiApplication::platformName() == "wayland") {
     qLog(Warning) << "No support for Wayland in qxt.";
     return false;
@@ -40,19 +43,23 @@ bool QxtGlobalShortcutBackend::DoRegister() {
        manager_->shortcuts().values()) {
     AddShortcut(shortcut.action);
   }
-
+#endif
   return true;
 }
 
 void QxtGlobalShortcutBackend::AddShortcut(QAction* action) {
+#ifndef Q_OS_HAIKU
   if (action->shortcut().isEmpty()) return;
   QxtGlobalShortcut* shortcut = new QxtGlobalShortcut(action->shortcut(), this);
   connect(shortcut, SIGNAL(activated()), action, SLOT(trigger()));
   shortcuts_ << shortcut;
+#endif
 }
 
 void QxtGlobalShortcutBackend::DoUnregister() {
+#ifndef Q_OS_HAIKU
   qLog(Debug) << "unregistering";
   qDeleteAll(shortcuts_);
   shortcuts_.clear();
+#endif
 }
diff --git a/src/core/utilities.cpp b/src/core/utilities.cpp
index ddbdb53..d0b97a9 100644
--- a/src/core/utilities.cpp
+++ b/src/core/utilities.cpp
@@ -350,6 +350,9 @@ QString GetConfigPath(ConfigPath config) {
 #ifdef Q_OS_DARWIN
       return mac::GetApplicationSupportPath() + "/" +
              QCoreApplication::organizationName();
+#elif defined(Q_OS_HAIKU)
+      return QString("%1/config/settings/%2")
+          .arg(QDir::homePath(), QCoreApplication::organizationName());
 #else
       return QString("%1/%2").arg(
           QStandardPaths::writableLocation(QStandardPaths::ConfigLocation),
@@ -361,7 +364,7 @@ QString GetConfigPath(ConfigPath config) {
       if (Application::kIsPortable) {
         return GetConfigPath(Path_Root) + "/cache";
       }
-#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN)
+#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) && !defined(Q_OS_HAIKU)
       return QString("%1/%2").arg(QStandardPaths::writableLocation(
                                       QStandardPaths::GenericCacheLocation),
                                   QCoreApplication::organizationName());
diff --git a/src/library/librarysettingspage.cpp b/src/library/librarysettingspage.cpp
index 91a8614..3ca9eee 100644
--- a/src/library/librarysettingspage.cpp
+++ b/src/library/librarysettingspage.cpp
@@ -132,7 +132,7 @@ void LibrarySettingsPage::Load() {
 
   s.beginGroup(LibraryWatcher::kSettingsGroup);
   ui_->startup_scan->setChecked(s.value("startup_scan", true).toBool());
-  ui_->monitor->setChecked(s.value("monitor", true).toBool());
+  ui_->monitor->setChecked(s.value("monitor", false).toBool());
 
   QStringList filters = s.value("cover_art_patterns", QStringList() << "front"
                                                                     << "cover")
diff --git a/src/main.cpp b/src/main.cpp
index ec1e1f0..05fc675 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -462,5 +462,9 @@ int main(int argc, char* argv[]) {
 
   int ret = a.exec();
 
+#ifdef Q_OS_HAIKU
+  kill(::getpid(), SIGKILL);
+#endif
+
   return ret;
 }
diff --git a/src/ui/appearancesettingspage.cpp b/src/ui/appearancesettingspage.cpp
index 9f99f20..72af21d 100644
--- a/src/ui/appearancesettingspage.cpp
+++ b/src/ui/appearancesettingspage.cpp
@@ -108,7 +108,11 @@ void AppearanceSettingsPage::Load() {
   current_background_color_ = original_background_color_;
 
   InitColorSelectorsColors();
+#ifdef Q_OS_HAIKU
+  ui_->b_use_sys_icons->setChecked(s.value("b_use_sys_icons", true).toBool());
+#else
   ui_->b_use_sys_icons->setChecked(s.value("b_use_sys_icons", false).toBool());
+#endif
   ui_->b_hide_filter_toolbar->setChecked(
       s.value("b_hide_filter_toolbar", false).toBool());
   s.endGroup();
diff --git a/src/ui/iconloader.cpp b/src/ui/iconloader.cpp
index 8508e02..5c51a65 100644
--- a/src/ui/iconloader.cpp
+++ b/src/ui/iconloader.cpp
@@ -42,7 +42,11 @@ void IconLoader::Init() {
                  << "";
   QSettings settings;
   settings.beginGroup(Appearance::kSettingsGroup);
+#ifdef Q_OS_HAIKU
+  use_sys_icons_ = settings.value("b_use_sys_icons", true).toBool();
+#else
   use_sys_icons_ = settings.value("b_use_sys_icons", false).toBool();
+#endif
 }
 
 QIcon IconLoader::Load(const QString& name, const IconType& icontype) {
diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp
index 7f72f32..08c5a80 100644
--- a/src/ui/mainwindow.cpp
+++ b/src/ui/mainwindow.cpp
@@ -268,13 +268,13 @@ MainWindow::MainWindow(Application* app, SystemTrayIcon* tray_icon, OSD* osd,
                     IconLoader::Load("folder-sound", IconLoader::Base),
                     tr("Library"));
   ui_->tabs->addTab(file_view_,
-                    IconLoader::Load("document-open", IconLoader::Base),
+                    IconLoader::Load("folder-open", IconLoader::Base),
                     tr("Files"));
   ui_->tabs->addTab(playlist_list_,
-                    IconLoader::Load("view-media-playlist", IconLoader::Base),
+                    IconLoader::Load("folder-text", IconLoader::Base),
                     tr("Playlists"));
   ui_->tabs->addTab(internet_view_,
-                    IconLoader::Load("applications-internet", IconLoader::Base),
+                    IconLoader::Load("folder-network", IconLoader::Base),
                     tr("Internet"));
   ui_->tabs->addTab(
       device_view_container_,
@@ -389,8 +389,8 @@ MainWindow::MainWindow(Application* app, SystemTrayIcon* tray_icon, OSD* osd,
       IconLoader::Load("document-save", IconLoader::Base));
   ui_->action_full_library_scan->setIcon(
       IconLoader::Load("view-refresh", IconLoader::Base));
-  ui_->action_rain->setIcon(
-      IconLoader::Load("weather-showers-scattered", IconLoader::Base));
+//  ui_->action_rain->setIcon(
+//      IconLoader::Load("weather-showers-scattered", IconLoader::Base));
   ui_->action_hypnotoad->setIcon(
       IconLoader::Load("hypnotoad", IconLoader::Base));
   ui_->action_kittens->setIcon(IconLoader::Load("kittens", IconLoader::Base));
@@ -486,7 +486,7 @@ MainWindow::MainWindow(Application* app, SystemTrayIcon* tray_icon, OSD* osd,
   connect(ui_->action_view_stream_details, SIGNAL(triggered()),
           SLOT(DiscoverStreamDetails()));
 
-  background_streams_->AddAction("Rain", ui_->action_rain);
+//  background_streams_->AddAction("Rain", ui_->action_rain);
   background_streams_->AddAction("Hypnotoad", ui_->action_hypnotoad);
   background_streams_->AddAction("Make it so!", ui_->action_enterprise);
 
diff --git a/src/ui/mainwindow.ui b/src/ui/mainwindow.ui
index bef7b14..0faf4dc 100644
--- a/src/ui/mainwindow.ui
+++ b/src/ui/mainwindow.ui
@@ -532,7 +532,6 @@
     <property name="title">
      <string>&amp;Extras</string>
     </property>
-    <addaction name="action_rain"/>
     <addaction name="action_hypnotoad"/>
     <addaction name="action_enterprise"/>
     <addaction name="action_kittens"/>
@@ -726,14 +725,6 @@
     <string>Cover Manager</string>
    </property>
   </action>
-  <action name="action_rain">
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="text">
-    <string comment="Label for button to enable/disable rain background sound.">Rain</string>
-   </property>
-  </action>
   <action name="action_hypnotoad">
    <property name="checkable">
     <bool>true</bool>
diff --git a/src/ui/notificationssettingspage.cpp b/src/ui/notificationssettingspage.cpp
index 75733d3..5fca7e0 100644
--- a/src/ui/notificationssettingspage.cpp
+++ b/src/ui/notificationssettingspage.cpp
@@ -99,7 +99,9 @@ NotificationsSettingsPage::NotificationsSettingsPage(SettingsDialog* dialog)
   if (!OSD::SupportsNativeNotifications())
     ui_->notifications_native->setEnabled(false);
   if (!OSD::SupportsTrayPopups()) ui_->notifications_tray->setEnabled(false);
-
+#ifdef Q_OS_HAIKU
+  ui_->notifications_pretty->setEnabled(false);
+#endif
   connect(ui_->notifications_pretty, SIGNAL(toggled(bool)),
           SLOT(UpdatePopupVisible()));
 
@@ -135,7 +137,11 @@ void NotificationsSettingsPage::Load() {
 
   s.beginGroup(OSD::kSettingsGroup);
   OSD::Behaviour osd_behaviour =
+#ifdef Q_OS_HAIKU
+      OSD::Behaviour(s.value("Behaviour", OSD::TrayPopup).toInt());
+#else
       OSD::Behaviour(s.value("Behaviour", OSD::Native).toInt());
+#endif
   switch (osd_behaviour) {
     case OSD::Native:
       if (OSD::SupportsNativeNotifications()) {
@@ -180,6 +186,11 @@ void NotificationsSettingsPage::Load() {
       ui_->notifications_pretty->isChecked());
 #endif
 
+#ifdef Q_OS_HAIKU
+  ui_->notifications_options->setEnabled(
+      ui_->notifications_tray->isChecked());
+#endif
+
   // Pretty OSD
   pretty_popup_->ReloadSettings();
   ui_->notifications_opacity->setValue(pretty_popup_->background_opacity() *
diff --git a/src/widgets/osd.cpp b/src/widgets/osd.cpp
index 5cdea66..064bce7 100644
--- a/src/widgets/osd.cpp
+++ b/src/widgets/osd.cpp
@@ -65,7 +65,11 @@ OSD::~OSD() { delete pretty_popup_; }
 void OSD::ReloadSettings() {
   QSettings s;
   s.beginGroup(kSettingsGroup);
+#ifdef Q_OS_HAIKU
+  behaviour_ = OSD::Behaviour(s.value("Behaviour", TrayPopup).toInt());
+#else
   behaviour_ = OSD::Behaviour(s.value("Behaviour", Native).toInt());
+#endif
   timeout_msec_ = s.value("Timeout", 5000).toInt();
   show_on_volume_change_ = s.value("ShowOnVolumeChange", false).toBool();
   show_art_ = s.value("ShowArt", true).toBool();
-- 
2.28.0

