Browse Source

linux-capture: Sort windows by name

Rafael Franco 4 years ago
parent
commit
c7de398309
1 changed files with 30 additions and 1 deletions
  1. 30 1
      plugins/linux-capture/xcompcap-main.cpp

+ 30 - 1
plugins/linux-capture/xcompcap-main.cpp

@@ -4,6 +4,7 @@
 #include <X11/extensions/Xcomposite.h>
 #include <pthread.h>
 
+#include <algorithm>
 #include <vector>
 
 #include <obs-module.h>
@@ -57,6 +58,13 @@ obs_properties_t *XCompcapMain::properties()
 		props, "capture_window", obs_module_text("Window"),
 		OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
 
+	struct WindowInfo {
+		std::string lex_comparable;
+		std::string name;
+		std::string desc;
+	};
+
+	std::vector<WindowInfo> window_strings;
 	for (Window win : XCompcap::getTopLevelWindows()) {
 		std::string wname = XCompcap::getWindowName(win);
 		std::string cls = XCompcap::getWindowClass(win);
@@ -64,7 +72,28 @@ obs_properties_t *XCompcapMain::properties()
 		std::string desc =
 			(winid + WIN_STRING_DIV + wname + WIN_STRING_DIV + cls);
 
-		obs_property_list_add_string(wins, wname.c_str(), desc.c_str());
+		std::string wname_lowercase = wname;
+		std::transform(wname_lowercase.begin(), wname_lowercase.end(),
+			       wname_lowercase.begin(),
+			       [](unsigned char c) { return std::tolower(c); });
+
+		window_strings.push_back({.lex_comparable = wname_lowercase,
+					  .name = wname,
+					  .desc = desc});
+	}
+
+	std::sort(window_strings.begin(), window_strings.end(),
+		  [](const WindowInfo &a, const WindowInfo &b) -> bool {
+			  return std::lexicographical_compare(
+				  a.lex_comparable.begin(),
+				  a.lex_comparable.end(),
+				  b.lex_comparable.begin(),
+				  b.lex_comparable.end());
+		  });
+
+	for (auto s : window_strings) {
+		obs_property_list_add_string(wins, s.name.c_str(),
+					     s.desc.c_str());
 	}
 
 	obs_properties_add_int(props, "cut_top", obs_module_text("CropTop"), 0,