mirror of
https://repo.dec05eba.com/gpu-screen-recorder-ui
synced 2026-05-07 15:19:56 +09:00
Prefer window title for game name rather than class, fix game names with slash not saving to correct dir
This commit is contained in:
@@ -48,15 +48,17 @@ static Window get_focused_window(Display *dpy, capture_type cap_type) {
|
|||||||
Window focused_window = None;
|
Window focused_window = None;
|
||||||
|
|
||||||
if(cap_type == CAPTURE_TYPE_FOCUSED) {
|
if(cap_type == CAPTURE_TYPE_FOCUSED) {
|
||||||
Atom type = None;
|
// Atom type = None;
|
||||||
int format = 0;
|
// int format = 0;
|
||||||
unsigned long num_items = 0;
|
// unsigned long num_items = 0;
|
||||||
unsigned long bytes_left = 0;
|
// unsigned long bytes_left = 0;
|
||||||
unsigned char *data = NULL;
|
// unsigned char *data = NULL;
|
||||||
XGetWindowProperty(dpy, DefaultRootWindow(dpy), net_active_window_atom, 0, 1, False, XA_WINDOW, &type, &format, &num_items, &bytes_left, &data);
|
// XGetWindowProperty(dpy, DefaultRootWindow(dpy), net_active_window_atom, 0, 1, False, XA_WINDOW, &type, &format, &num_items, &bytes_left, &data);
|
||||||
|
|
||||||
if(type == XA_WINDOW && num_items == 1 && data)
|
// fprintf(stderr, "focused window: %p\n", (void*)data);
|
||||||
return *(Window*)data;
|
|
||||||
|
// if(type == XA_WINDOW && num_items == 1 && data)
|
||||||
|
// return *(Window*)data;
|
||||||
|
|
||||||
int revert_to = 0;
|
int revert_to = 0;
|
||||||
XGetInputFocus(dpy, &focused_window, &revert_to);
|
XGetInputFocus(dpy, &focused_window, &revert_to);
|
||||||
@@ -99,10 +101,6 @@ static char* get_window_title(Display *dpy, Window window) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool is_steam_game(Display *dpy, Window window) {
|
|
||||||
return window_has_atom(dpy, window, XInternAtom(dpy, "STEAM_GAME", False));
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char* strip(const char *str, int *len) {
|
static const char* strip(const char *str, int *len) {
|
||||||
int str_len = strlen(str);
|
int str_len = strlen(str);
|
||||||
for(int i = 0; i < str_len; ++i) {
|
for(int i = 0; i < str_len; ++i) {
|
||||||
@@ -171,20 +169,19 @@ int main(int argc, char **argv) {
|
|||||||
if(focused_window == None)
|
if(focused_window == None)
|
||||||
exit(2);
|
exit(2);
|
||||||
|
|
||||||
if(!is_steam_game(dpy, focused_window)) {
|
// Window title is not always ideal (for example for a browser), but for games its pretty much required
|
||||||
XClassHint class_hint = {0};
|
|
||||||
XGetClassHint(dpy, focused_window, &class_hint);
|
|
||||||
if(class_hint.res_class) {
|
|
||||||
print_str_strip(class_hint.res_class);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
char *window_title = get_window_title(dpy, focused_window);
|
char *window_title = get_window_title(dpy, focused_window);
|
||||||
if(window_title) {
|
if(window_title) {
|
||||||
print_str_strip(window_title);
|
print_str_strip(window_title);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
XClassHint class_hint = {0};
|
||||||
|
XGetClassHint(dpy, focused_window, &class_hint);
|
||||||
|
if(class_hint.res_class) {
|
||||||
|
print_str_strip(class_hint.res_class);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ file_name="$(basename "$filepath")"
|
|||||||
file_dir="$(dirname "$filepath")"
|
file_dir="$(dirname "$filepath")"
|
||||||
|
|
||||||
game_name=$(gsr-window-name focused || echo "Game")
|
game_name=$(gsr-window-name focused || echo "Game")
|
||||||
|
game_name="$(echo "$game_name" | tr '/\\' '_')"
|
||||||
target_dir="$file_dir/$game_name"
|
target_dir="$file_dir/$game_name"
|
||||||
new_filepath="$target_dir/$file_name"
|
new_filepath="$target_dir/$file_name"
|
||||||
|
|
||||||
|
|||||||
@@ -1106,17 +1106,8 @@ namespace gsr {
|
|||||||
// Starting recording in 3...
|
// Starting recording in 3...
|
||||||
// 2...
|
// 2...
|
||||||
// 1...
|
// 1...
|
||||||
// TODO: Do not run this is a daemon. Instead get the pid and when launching another notification close the current notification
|
|
||||||
// program and start another one. This can also be used to check when the notification has finished by checking with waitpid NOWAIT
|
|
||||||
// to see when the program has exit.
|
|
||||||
if(config.record_config.show_recording_started_notifications)
|
if(config.record_config.show_recording_started_notifications)
|
||||||
show_notification("Recording has started", 3.0, get_color_theme().tint_color, get_color_theme().tint_color, NotificationType::RECORD);
|
show_notification("Recording has started", 3.0, get_color_theme().tint_color, get_color_theme().tint_color, NotificationType::RECORD);
|
||||||
//exit(0);
|
|
||||||
// window->set_visible(false);
|
|
||||||
// window->close();
|
|
||||||
|
|
||||||
// TODO: Show notification with args:
|
|
||||||
// "Recording has started" 3.0 ./images/record.png 76b900
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string streaming_get_url(const Config &config) {
|
static std::string streaming_get_url(const Config &config) {
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
// TODO: Keep track of gpu screen recorder run by other programs to not allow recording at the same time, or something.
|
// TODO: Keep track of gpu screen recorder run by other programs to not allow recording at the same time, or something.
|
||||||
// TODO: Add systray by using org.kde.StatusNotifierWatcher/etc dbus directly.
|
// TODO: Add systray by using org.kde.StatusNotifierWatcher/etc dbus directly.
|
||||||
// TODO: Make sure the overlay always stays on top. Test with starting the overlay and then opening youtube in fullscreen.
|
// TODO: Make sure the overlay always stays on top. Test with starting the overlay and then opening youtube in fullscreen.
|
||||||
|
// This is done in Overlay::force_window_on_top, but it's not called right now. It cant be used because the overlay will be on top of
|
||||||
|
// notifications.
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include <mgl/mgl.h>
|
#include <mgl/mgl.h>
|
||||||
|
|||||||
Reference in New Issue
Block a user