Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

xrandr.js 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. var spawn = require("child_process").spawn;
  2. exports.list = list;
  3. function parseScreen(line) {
  4. var rxId = /Screen (\d+)/;
  5. var rxMin = /minimum (\d+) x (\d+)/;
  6. var rxCurr = /current (\d+) x (\d+)/;
  7. var rxMax = /maximum (\d+) x (\d+)/;
  8. var id = line.match(rxId);
  9. var min = line.match(rxMin);
  10. var curr = line.match(rxCurr);
  11. var max = line.match(rxMax);
  12. return {
  13. id: parseInt(id[1]),
  14. minimum: {
  15. w: parseInt(min[1]),
  16. h: parseInt(min[2]),
  17. },
  18. current: {
  19. w: parseInt(curr[1]),
  20. h: parseInt(curr[2]),
  21. },
  22. maximum: {
  23. w: parseInt(max[1]),
  24. h: parseInt(max[2]),
  25. },
  26. };
  27. }
  28. function parseDisplayMode(line) {
  29. var rxResStr = /(\d+x\d+[^\s]+)/;
  30. var rxRes = /(\d+)x(\d+)/;
  31. var rxRate = /(\d+\.\d+)/;
  32. var obj = {};
  33. var resStr = line.match(rxResStr);
  34. obj.resStr = resStr[1];
  35. var res = line.match(rxRes);
  36. obj.res = { w: parseInt(res[1]), h: parseInt(res[2]) };
  37. line = line.substr(res.index + res[0].length);
  38. obj.rates = [];
  39. while (true) {
  40. var rate = line.match(rxRate);
  41. if (rate === null)
  42. break;
  43. obj.rates.push(rate[1]);
  44. line = line.substr(rate.index + rate[0].length);
  45. }
  46. return obj;
  47. }
  48. function parseDisplayModes(lines) {
  49. var modes = [];
  50. for (var i = 1; i < lines.length; ++i) {
  51. modes.push(parseDisplayMode(lines[i]));
  52. }
  53. return modes;
  54. }
  55. function parseDisplayStart(line) {
  56. var rxId = /^([^ ]+)/;
  57. var rxPrimary = /primary/;
  58. var rxConnected = /(connected|disconnected)/;
  59. var rxRes = /(\d+)x(\d+)\+(\d+)\+(\d+)/;
  60. var rxDims = /(\d+)mm x (\d+)mm/;
  61. var id = line.match(rxId);
  62. var primary = line.match(rxPrimary);
  63. var connected = line.match(rxConnected)[1] === "connected";
  64. var res = line.match(rxRes);
  65. var dims = line.match(rxDims);
  66. return {
  67. id: id[1],
  68. primary: primary ? true : false,
  69. connected: connected,
  70. res: (res == null ? null : {
  71. w: parseInt(res[1]),
  72. h: parseInt(res[2]),
  73. x: parseInt(res[3]),
  74. y: parseInt(res[4]),
  75. }),
  76. dims: (res == null ? null : {
  77. w: parseInt(dims[1]),
  78. h: parseInt(dims[2]),
  79. }),
  80. }
  81. }
  82. function parseDisplay(lines) {
  83. var obj = parseDisplayStart(lines[0]);
  84. if (obj.connected)
  85. obj.modes = parseDisplayModes(lines);
  86. return obj;
  87. }
  88. function parse(str) {
  89. var strings = [];
  90. var lines = str.split("\n");
  91. var screens = [];
  92. var displays = [];
  93. var currArr;
  94. for (var i in lines) {
  95. var line = lines[i];
  96. if (line === "")
  97. continue;
  98. if (line.indexOf("Screen") === 0) {
  99. screens.push(parseScreen(line));
  100. } else if (line[0] !== " " && line[0] !== "\t") {
  101. if (currArr) {
  102. displays.push(parseDisplay(currArr));
  103. }
  104. currArr = [line];
  105. } else {
  106. currArr.push(line);
  107. }
  108. }
  109. if (currArr) {
  110. displays.push(parseDisplay(currArr));
  111. }
  112. return {
  113. screens: screens,
  114. displays: displays.filter(d => d != null),
  115. }
  116. }
  117. function list(cb) {
  118. var child = spawn("xrandr", [ "--query" ]);
  119. var output = "";
  120. child.stdout.on("data", d => output += d);
  121. child.on("close", () => {
  122. var devs = parse(output);
  123. cb(devs);
  124. });
  125. }