On Thursday, 28 April 2022 at 11:22:15 UTC, Alexander Zhirov
wrote:
Are there any methods to get the screen resolution?
Call DisplayWidth/DisplayHeight on the X connection... my
simpledisplay.d provides bindings (though not a high level helper
function since both X and Windows calls are trivial)
On C/C++ from under X11, it is not possible to do this on the
command line via SSH, since the display is not defined.
Just defined the display, that's easy.
import std.process;
enviornment["DISPLAY"] = ":0";
that can work with any lib, then connect.
OR, with my lib, it is all included:
---
import arsd.simpledisplay;
XDisplayConnection.setDisplayName(":0"); // set the local name
regardless of what is set on ssh
auto connection = XDisplayConnection.get(); // connection
import std.stdio;
writeln(DisplayWidth(connection, 0), " x ",
DisplayHeight(connection, 0)); // the 0 is the screen number
---
Though note with a multiple monitor system, this will give the
*full* size of the virtual screen, not individual screens.
simpledisplay has methods for this..... but I marked it `private`
and it only loads the data when a window is created... you COULD
hack past this anyway but prolly not worth the hassle. Maybe I
will make it public officially in the next release.
But if you are desperate for the info now, here's how you can
bypass private and get at it anyway:
---
// use reflection to bypass `private`
alias MonitorInfo = __traits(getMember,
arsd.simpledisplay.SimpleWindow, "MonitorInfo");
// make a temporary window just to get the info
auto window = new SimpleWindow(1, 1, null, OpenGlOptions.no,
Resizability.fixedSize, WindowTypes.eventOnly);
// this is the function that actually loads the monitor info
window.actualDpi();
// make sure none waiting in a buffer
flushGui();
// and now get the data out
foreach(monitor; MonitorInfo.info) {
writeln(monitor.position.size);
}
window.close();
---
But since you're bypassing private and poking internals, if/when
I do decide to make this public instead of private, I'll probably
break this approach (when it is public though you can just simply
loop over the info).