You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

179 lines
5.4 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. #include "settings-window.hpp"
  2. #include "settings-manager.hpp"
  3. #include <linux/videodev2.h>
  4. #include <iostream>
  5. #include <filesystem>
  6. #include <stdexcept>
  7. #include <fcntl.h>
  8. #include <libv4l2.h>
  9. #include <sys/dir.h>
  10. using namespace std;
  11. SettingsWindow::SettingsWindow(OBSManager* obs)
  12. : mBox(Gtk::Orientation::ORIENTATION_VERTICAL, 2),
  13. mBoxSettings(Gtk::Orientation::ORIENTATION_VERTICAL, 2),
  14. mBoxPluginDir(Gtk::Orientation::ORIENTATION_HORIZONTAL, 2),
  15. mLabelPluginDir("Plugin Dir: "),
  16. mBoxOutputDir(Gtk::Orientation::ORIENTATION_HORIZONTAL, 2),
  17. mLabelOutputDir("Saved Files Dir: "),
  18. mCheckButtonDesktop("Enable desktop recording"),
  19. mBoxWebcam(Gtk::Orientation::ORIENTATION_VERTICAL, 2),
  20. mCheckButtonWebcam("Enable webcam recording"),
  21. mCheckButtonAudio("Enable audio recording"),
  22. mButtonClose("Close"),
  23. mButtonSave("Save")
  24. {
  25. set_title("Settings");
  26. set_default_size(640, 480);
  27. set_border_width(10);
  28. set_modal(true);
  29. set_type_hint(Gdk::WindowTypeHint::WINDOW_TYPE_HINT_DIALOG);
  30. settings = new SettingsManager();
  31. populateVideoDevices();
  32. signal_key_press_event().connect(
  33. sigc::mem_fun(*this, &SettingsWindow::onKeyPressed));
  34. mButtonClose.signal_clicked().connect(
  35. sigc::mem_fun(*this, &SettingsWindow::onClosePressed));
  36. mButtonSave.signal_clicked().connect(
  37. sigc::mem_fun(*this, &SettingsWindow::onSavePressed));
  38. mBoxSettings.set_border_width(10);
  39. mEntryPluginDir.set_hexpand(true);
  40. mEntryPluginDir.set_text(settings->GetWithDefault(SETTINGS_KEY_PLUGIN_DIR, SETTINGS_DEFAULT_PLUGIN_DIR));
  41. mBoxPluginDir.set_border_width(10);
  42. mBoxPluginDir.add(mLabelPluginDir);
  43. mBoxPluginDir.add(mEntryPluginDir);
  44. mEntryOutputDir.set_hexpand(true);
  45. mEntryOutputDir.set_text(settings->GetWithDefault(SETTINGS_KEY_OUTPUT_DIR, std::filesystem::current_path()));
  46. mBoxOutputDir.set_border_width(10);
  47. mBoxOutputDir.add(mLabelOutputDir);
  48. mBoxOutputDir.add(mEntryOutputDir);
  49. mFrameDesktop.set_label("Desktop");
  50. mFrameDesktop.set_border_width(10);
  51. mCheckButtonDesktop.set_border_width(10);
  52. mCheckButtonDesktop.set_active(settings->GetBoolWithDefault(SETTINGS_KEY_SCREEN_ENABLED, true));
  53. mFrameDesktop.add(mCheckButtonDesktop);
  54. mComboBoxVideoDevice.set_border_width(10);
  55. mFrameWebcam.set_label("Webcam");
  56. mFrameWebcam.set_border_width(10);
  57. mBoxWebcam.set_border_width(10);
  58. mCheckButtonWebcam.set_active(settings->GetBoolWithDefault(SETTINGS_KEY_WEBCAM_ENABLED, true));
  59. mBoxWebcam.add(mCheckButtonWebcam);
  60. mBoxWebcam.add(mComboBoxVideoDevice);
  61. mFrameWebcam.add(mBoxWebcam);
  62. mFrameAudio.set_label("Microphone");
  63. mFrameAudio.set_border_width(10);
  64. mCheckButtonAudio.set_border_width(10);
  65. mCheckButtonAudio.set_active(settings->GetBoolWithDefault(SETTINGS_KEY_AUDIO_ENABLED, true));
  66. mFrameAudio.add(mCheckButtonAudio);
  67. mBoxSettings.add(mBoxPluginDir);
  68. mBoxSettings.add(mBoxOutputDir);
  69. mBoxSettings.add(mFrameDesktop);
  70. mBoxSettings.add(mFrameWebcam);
  71. mBoxSettings.add(mFrameAudio);
  72. mFrameSettings.set_label("Settings");
  73. mFrameSettings.set_border_width(10);
  74. mFrameSettings.add(mBoxSettings);
  75. mActionBar.pack_end(mButtonSave);
  76. mActionBar.pack_end(mButtonClose);
  77. mBox.add(mFrameSettings);
  78. mBox.add(mActionBar);
  79. mBox.show_all();
  80. add(mBox);
  81. }
  82. SettingsWindow::~SettingsWindow()
  83. {
  84. }
  85. bool SettingsWindow::onKeyPressed(GdkEventKey *event)
  86. {
  87. if (event->keyval == GDK_KEY_Escape)
  88. {
  89. close();
  90. return true;
  91. }
  92. return false;
  93. }
  94. void SettingsWindow::onClosePressed()
  95. {
  96. close();
  97. }
  98. void SettingsWindow::onSavePressed()
  99. {
  100. settings->Update(SETTINGS_KEY_PLUGIN_DIR, mEntryPluginDir.get_text());
  101. settings->Update(SETTINGS_KEY_OUTPUT_DIR, mEntryOutputDir.get_text());
  102. settings->UpdateBool(SETTINGS_KEY_SCREEN_ENABLED, mCheckButtonDesktop.get_active());
  103. settings->UpdateBool(SETTINGS_KEY_WEBCAM_ENABLED, mCheckButtonWebcam.get_active());
  104. settings->Update(SETTINGS_KEY_VIDEO_DEVICE_ID, mComboBoxVideoDevice.get_active_id());
  105. settings->UpdateBool(SETTINGS_KEY_AUDIO_ENABLED, mCheckButtonAudio.get_active());
  106. settings->SaveAll();
  107. close();
  108. }
  109. void SettingsWindow::populateVideoDevices()
  110. {
  111. v4l2_capability cap;
  112. dirent *dp;
  113. auto dirp = opendir("/sys/class/video4linux");
  114. if (!dirp)
  115. throw runtime_error("Failed to get video devices");
  116. while ((dp = readdir(dirp)) != nullptr)
  117. {
  118. int fd;
  119. if (dp->d_type == DT_DIR)
  120. continue;
  121. auto name = string(dp->d_name);
  122. if (name.find("video") == -1)
  123. continue;
  124. auto device = "/dev/" + name;
  125. if ((fd = v4l2_open(device.c_str(), O_RDWR | O_NONBLOCK)) == -1)
  126. {
  127. cout << "Failed to open device: " << device << endl;
  128. continue;
  129. }
  130. if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) == -1)
  131. {
  132. cout << "Failed to query device: " << device << endl;
  133. v4l2_close(fd);
  134. continue;
  135. }
  136. auto n = string(reinterpret_cast<char*>(cap.card));
  137. n += " (" + device + ")";
  138. mComboBoxVideoDevice.append(device, n);
  139. if (settings->Get(SETTINGS_KEY_VIDEO_DEVICE_ID) == device)
  140. mComboBoxVideoDevice.set_active_id(device);
  141. v4l2_close(fd);
  142. }
  143. }