Trying to find XNVCtrl's display by iterating through 16 displays.

pull/133/head
jackun 4 years ago
parent 6caa4a5173
commit 86f8ebed30
No known key found for this signature in database
GPG Key ID: 119DB3F1D05A9ED3

@ -2,35 +2,70 @@
#include <cstring>
#include <sstream>
#include <unordered_map>
#include <memory>
#include <functional>
#include "nvctrl.h"
#include "loaders/loader_nvctrl.h"
#include "loaders/loader_x11.h"
#include "string_utils.h"
#include "shared_x11.h"
typedef std::unordered_map<std::string, std::string> string_map;
static std::unique_ptr<Display, std::function<void(Display*)>> display;
libnvctrl_loader nvctrl("libXNVCtrl.so.0");
struct nvctrlInfo nvctrl_info;
bool nvctrlSuccess = false;
bool checkXNVCtrl()
static bool find_nv_x11(Display*& dpy)
{
if (init_x11()) {
if (nvctrl.IsLoaded()) {
nvctrlSuccess = nvctrl.XNVCTRLIsNvScreen(get_xdisplay(), 0);
if (!nvctrlSuccess)
std::cerr << "MANGOHUD: XNVCtrl didn't find the correct display" << std::endl;
return nvctrlSuccess;
} else {
std::cerr << "MANGOHUD: XNVCtrl failed to load\n";
char buf[8] {};
for (int i = 0; i < 16; i++) {
snprintf(buf, sizeof(buf), ":%d", i);
Display *d = g_x11->XOpenDisplay(buf);
if (d) {
if (nvctrl.XNVCTRLIsNvScreen(d, 0)) {
dpy = d;
std::cerr << "MANGOHUD: XNVCtrl is using display " << buf << std::endl;
return true;
}
g_x11->XCloseDisplay(d);
}
}
return false;
}
void parse_token(std::string token, string_map& options) {
bool checkXNVCtrl()
{
if (!g_x11->IsLoaded()) {
std::cerr << "MANGOHUD: XNVCtrl: X11 loader failed to load\n";
return false;
}
if (!nvctrl.IsLoaded()) {
std::cerr << "MANGOHUD: XNVCtrl loader failed to load\n";
return false;
}
Display *dpy;
nvctrlSuccess = find_nv_x11(dpy);
if (!nvctrlSuccess) {
std::cerr << "MANGOHUD: XNVCtrl didn't find the correct display" << std::endl;
return false;
}
auto local_x11 = g_x11;
display = { dpy,
[local_x11](Display *dpy) {
local_x11->XCloseDisplay(dpy);
}
};
return true;
}
static void parse_token(std::string token, string_map& options) {
std::string param, value;
size_t equal = token.find("=");
@ -49,7 +84,7 @@ void parse_token(std::string token, string_map& options) {
char* get_attr_target_string(int attr, int target_type, int target_id) {
char* c = nullptr;
if (!nvctrl.XNVCTRLQueryTargetStringAttribute(get_xdisplay(), target_type, target_id, 0, attr, &c)) {
if (!nvctrl.XNVCTRLQueryTargetStringAttribute(display.get(), target_type, target_id, 0, attr, &c)) {
std::cerr << "Failed to query attribute '" << attr << "'.\n";
}
return c;
@ -59,7 +94,7 @@ void getNvctrlInfo(){
string_map params;
std::string token;
if (!init_x11())
if (!display)
return;
int enums[] = {
@ -88,7 +123,7 @@ void getNvctrlInfo(){
nvctrl_info.MemClock = 0;
int64_t temp = 0;
nvctrl.XNVCTRLQueryTargetAttribute64(get_xdisplay(),
nvctrl.XNVCTRLQueryTargetAttribute64(display.get(),
NV_CTRL_TARGET_TYPE_GPU,
0,
0,
@ -97,7 +132,7 @@ void getNvctrlInfo(){
nvctrl_info.temp = temp;
int64_t memtotal = 0;
nvctrl.XNVCTRLQueryTargetAttribute64(get_xdisplay(),
nvctrl.XNVCTRLQueryTargetAttribute64(display.get(),
NV_CTRL_TARGET_TYPE_GPU,
0,
0,
@ -106,7 +141,7 @@ void getNvctrlInfo(){
nvctrl_info.memoryTotal = memtotal;
int64_t memused = 0;
nvctrl.XNVCTRLQueryTargetAttribute64(get_xdisplay(),
nvctrl.XNVCTRLQueryTargetAttribute64(display.get(),
NV_CTRL_TARGET_TYPE_GPU,
0,
0,

Loading…
Cancel
Save