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.

183 lines
5.5 KiB

3 years ago
3 years ago
2 years ago
3 years ago
2 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
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 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. signal_key_press_event().connect(
  32. sigc::mem_fun(*this, &SettingsWindow::onKeyPressed));
  33. mButtonClose.signal_clicked().connect(
  34. sigc::mem_fun(*this, &SettingsWindow::onClosePressed));
  35. mButtonSave.signal_clicked().connect(
  36. sigc::mem_fun(*this, &SettingsWindow::onSavePressed));
  37. mBoxSettings.set_border_width(10);
  38. mEntryPluginDir.set_hexpand(true);
  39. mEntryPluginDir.set_text(settings->GetWithDefault(SETTINGS_KEY_PLUGIN_DIR, SETTINGS_DEFAULT_PLUGIN_DIR));
  40. mBoxPluginDir.set_border_width(10);
  41. mBoxPluginDir.add(mLabelPluginDir);
  42. mBoxPluginDir.add(mEntryPluginDir);
  43. mEntryOutputDir.set_hexpand(true);
  44. mEntryOutputDir.set_text(settings->GetWithDefault(SETTINGS_KEY_OUTPUT_DIR, std::filesystem::current_path()));
  45. mBoxOutputDir.set_border_width(10);
  46. mBoxOutputDir.add(mLabelOutputDir);
  47. mBoxOutputDir.add(mEntryOutputDir);
  48. mFrameDesktop.set_label("Desktop");
  49. mFrameDesktop.set_border_width(10);
  50. mCheckButtonDesktop.set_border_width(10);
  51. mCheckButtonDesktop.set_active(settings->GetBoolWithDefault(SETTINGS_KEY_SCREEN_ENABLED, true));
  52. mFrameDesktop.add(mCheckButtonDesktop);
  53. mComboBoxVideoDevice.set_border_width(10);
  54. mFrameWebcam.set_label("Webcam");
  55. mFrameWebcam.set_border_width(10);
  56. mBoxWebcam.set_border_width(10);
  57. mCheckButtonWebcam.set_active(settings->GetBoolWithDefault(SETTINGS_KEY_WEBCAM_ENABLED, true));
  58. mBoxWebcam.add(mCheckButtonWebcam);
  59. mBoxWebcam.add(mComboBoxVideoDevice);
  60. mFrameWebcam.add(mBoxWebcam);
  61. mFrameAudio.set_label("Microphone");
  62. mFrameAudio.set_border_width(10);
  63. mCheckButtonAudio.set_border_width(10);
  64. mCheckButtonAudio.set_active(settings->GetBoolWithDefault(SETTINGS_KEY_AUDIO_ENABLED, true));
  65. mFrameAudio.add(mCheckButtonAudio);
  66. mBoxSettings.add(mBoxPluginDir);
  67. mBoxSettings.add(mBoxOutputDir);
  68. mBoxSettings.add(mFrameDesktop);
  69. mBoxSettings.add(mFrameWebcam);
  70. mBoxSettings.add(mFrameAudio);
  71. mFrameSettings.set_label("Settings");
  72. mFrameSettings.set_border_width(10);
  73. mFrameSettings.add(mBoxSettings);
  74. mActionBar.pack_end(mButtonSave);
  75. mActionBar.pack_end(mButtonClose);
  76. mBox.add(mFrameSettings);
  77. mBox.add(mActionBar);
  78. mBox.show_all();
  79. add(mBox);
  80. }
  81. SettingsWindow::~SettingsWindow()
  82. {
  83. }
  84. void SettingsWindow::on_show()
  85. {
  86. Gtk::Window::on_show();
  87. populateVideoDevices();
  88. }
  89. bool SettingsWindow::onKeyPressed(GdkEventKey *event)
  90. {
  91. if (event->keyval == GDK_KEY_Escape)
  92. {
  93. close();
  94. return true;
  95. }
  96. return false;
  97. }
  98. void SettingsWindow::onClosePressed()
  99. {
  100. close();
  101. }
  102. void SettingsWindow::onSavePressed()
  103. {
  104. settings->Update(SETTINGS_KEY_PLUGIN_DIR, mEntryPluginDir.get_text());
  105. settings->Update(SETTINGS_KEY_OUTPUT_DIR, mEntryOutputDir.get_text());
  106. settings->UpdateBool(SETTINGS_KEY_SCREEN_ENABLED, mCheckButtonDesktop.get_active());
  107. settings->UpdateBool(SETTINGS_KEY_WEBCAM_ENABLED, mCheckButtonWebcam.get_active());
  108. settings->Update(SETTINGS_KEY_VIDEO_DEVICE_ID, mComboBoxVideoDevice.get_active_id());
  109. settings->UpdateBool(SETTINGS_KEY_AUDIO_ENABLED, mCheckButtonAudio.get_active());
  110. settings->SaveAll();
  111. close();
  112. }
  113. void SettingsWindow::populateVideoDevices()
  114. {
  115. v4l2_capability cap;
  116. dirent *dp;
  117. auto dirp = opendir("/sys/class/video4linux");
  118. if (!dirp)
  119. throw runtime_error("Failed to get video devices");
  120. while ((dp = readdir(dirp)) != nullptr)
  121. {
  122. int fd;
  123. if (dp->d_type == DT_DIR)
  124. continue;
  125. auto name = string(dp->d_name);
  126. if (name.find("video") == string::npos)
  127. continue;
  128. auto device = "/dev/" + name;
  129. if ((fd = v4l2_open(device.c_str(), O_RDWR | O_NONBLOCK)) == -1)
  130. {
  131. cout << "Failed to open device: " << device << endl;
  132. continue;
  133. }
  134. if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &cap) == -1)
  135. {
  136. cout << "Failed to query device: " << device << endl;
  137. v4l2_close(fd);
  138. continue;
  139. }
  140. auto n = string(reinterpret_cast<char*>(cap.card));
  141. n += " (" + device + ")";
  142. mComboBoxVideoDevice.append(device, n);
  143. if (settings->Get(SETTINGS_KEY_VIDEO_DEVICE_ID) == device)
  144. mComboBoxVideoDevice.set_active_id(device);
  145. v4l2_close(fd);
  146. }
  147. }