first commit
This commit is contained in:
commit
61df35ee17
|
@ -0,0 +1,2 @@
|
||||||
|
*.o
|
||||||
|
mswitch
|
|
@ -0,0 +1,40 @@
|
||||||
|
# Monitor switch (based on XrandR)
|
||||||
|
|
||||||
|
Switching occurs only if 2 monitors are connected to the computer!
|
||||||
|
|
||||||
|
## dub
|
||||||
|
|
||||||
|
- [Introduction](https://dub.pm/package-format-json)
|
||||||
|
- [General usage](https://dub.pm/commandline.html)
|
||||||
|
- [Configuring default settings](https://dub.pm/settings)
|
||||||
|
|
||||||
|
## How to build
|
||||||
|
|
||||||
|
Install `gcc` and `X11` development libraries. Also install `dmd` or `ldc` compiler. Run:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone https://git.zhirov.website/alexander/mswitch.git
|
||||||
|
cd mswitch
|
||||||
|
dub
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dub -- ~/mswitch.log
|
||||||
|
```
|
||||||
|
|
||||||
|
Something similar will be output to the log file `mswitch.log`, and the monitors will be changed:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
[Monitor("eDP-1", true, 1366, 768), Monitor("HDMI-1", false, 1920, 1080)]
|
||||||
|
-- Switch monitors --
|
||||||
|
[Monitor("HDMI-1", true, 1920, 1080), Monitor("eDP-1", false, 1366, 768)]
|
||||||
|
```
|
||||||
|
|
||||||
|
where first (or second) line:
|
||||||
|
|
||||||
|
- `eDP-1` - output
|
||||||
|
- `true` - is primary
|
||||||
|
- `1366` - width
|
||||||
|
- `768` - height
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"name": "mswitch",
|
||||||
|
"authors": [
|
||||||
|
"Alexander Zhirov"
|
||||||
|
],
|
||||||
|
"homepage": "https://git.zhirov.website/alexander/mswitcher",
|
||||||
|
"license": "GPL-2.0",
|
||||||
|
"copyright": "Copyright © 2022, Alexander Zhirov",
|
||||||
|
"description": "Monitor switcher, based on XrandR",
|
||||||
|
"dflags": [
|
||||||
|
"-i"
|
||||||
|
],
|
||||||
|
"libs": [
|
||||||
|
"X11",
|
||||||
|
"Xrandr",
|
||||||
|
"m"
|
||||||
|
],
|
||||||
|
"preBuildCommands": [
|
||||||
|
"gcc -Os -c source/clang/monitors.c -o obj/monitors.o"
|
||||||
|
],
|
||||||
|
"sourceFiles": [
|
||||||
|
"obj/*.o"
|
||||||
|
],
|
||||||
|
"targetType": "executable",
|
||||||
|
"targetPath": "bin",
|
||||||
|
"targetName": "mswitch"
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"fileVersion": 1,
|
||||||
|
"versions": {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"defaultArchitecture": "x86_64",
|
||||||
|
"defaultCompiler": "ldc2"
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
import std.stdio;
|
||||||
|
import modules.monitors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Switching occurs only if 2 monitors are connected to the computer!
|
||||||
|
*/
|
||||||
|
|
||||||
|
int main(string[] args)
|
||||||
|
{
|
||||||
|
string path = "mswitch.log";
|
||||||
|
if (args.length > 1)
|
||||||
|
{
|
||||||
|
path = args[1];
|
||||||
|
}
|
||||||
|
auto file = File(path, "w");
|
||||||
|
|
||||||
|
auto monitors = getMonitorsInfo();
|
||||||
|
file.writeln(monitors);
|
||||||
|
setPrimaryMonitor(monitors[1].name);
|
||||||
|
file.writeln("-- Switch monitors --");
|
||||||
|
swapMonitors(monitors[0].name, monitors[1].name, Relation.right_of);
|
||||||
|
monitors = getMonitorsInfo();
|
||||||
|
file.writeln(monitors);
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,96 @@
|
||||||
|
module modules.monitors;
|
||||||
|
|
||||||
|
import std.conv;
|
||||||
|
import std.string;
|
||||||
|
|
||||||
|
extern (C)
|
||||||
|
{
|
||||||
|
enum Relation
|
||||||
|
{
|
||||||
|
left_of,
|
||||||
|
right_of,
|
||||||
|
above,
|
||||||
|
below,
|
||||||
|
same_as,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct x_change
|
||||||
|
{
|
||||||
|
immutable(char)* first_monitor;
|
||||||
|
immutable(char)* second_monitor;
|
||||||
|
int is_position;
|
||||||
|
Relation position;
|
||||||
|
int primary;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct x_monitor
|
||||||
|
{
|
||||||
|
char[10] name = "\0";
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
int primary;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct x_info
|
||||||
|
{
|
||||||
|
int count;
|
||||||
|
x_monitor[5] monitor;
|
||||||
|
}
|
||||||
|
|
||||||
|
int XInfo(x_info* info);
|
||||||
|
int XChange(x_change* settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Monitor
|
||||||
|
{
|
||||||
|
string name;
|
||||||
|
bool primary;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
}
|
||||||
|
|
||||||
|
Monitor[] getMonitorsInfo()
|
||||||
|
{
|
||||||
|
Monitor[] m;
|
||||||
|
|
||||||
|
x_info monitors;
|
||||||
|
if (!XInfo(&monitors))
|
||||||
|
{
|
||||||
|
foreach (i; 0 .. monitors.count)
|
||||||
|
{
|
||||||
|
Monitor current;
|
||||||
|
current.name = fromStringz(monitors.monitor[i].name.idup);
|
||||||
|
current.primary = to!bool(monitors.monitor[i].primary);
|
||||||
|
current.width = monitors.monitor[i].width;
|
||||||
|
current.height = monitors.monitor[i].height;
|
||||||
|
|
||||||
|
m ~= current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool setPrimaryMonitor(string monitor)
|
||||||
|
{
|
||||||
|
x_change settings;
|
||||||
|
|
||||||
|
settings.first_monitor = toStringz(monitor);
|
||||||
|
settings.primary = 1;
|
||||||
|
settings.is_position = 0;
|
||||||
|
|
||||||
|
return to!bool(XChange(&settings));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool swapMonitors(string first, string second, Relation position)
|
||||||
|
{
|
||||||
|
x_change settings;
|
||||||
|
|
||||||
|
settings.first_monitor = toStringz(first);
|
||||||
|
settings.second_monitor = toStringz(second);
|
||||||
|
settings.is_position = 1;
|
||||||
|
settings.position = position;
|
||||||
|
settings.primary = 0;
|
||||||
|
|
||||||
|
return to!bool(XChange(&settings));
|
||||||
|
}
|
Loading…
Reference in New Issue