From 436dc315ae39dfac14edd1c208c26c7419e9f58e Mon Sep 17 00:00:00 2001 From: Constantin Berhard Date: Tue, 17 Nov 2015 15:31:06 +0100 Subject: [PATCH] fix preferred Resolution and new config file location --- lilass | 16 +++++++++++----- screen.py | 8 ++++++++ util.py | 23 +++++++++++++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 util.py diff --git a/lilass b/lilass index 7b94e18..f532b01 100755 --- a/lilass +++ b/lilass @@ -16,9 +16,9 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import argparse, sys, os, re, subprocess +import argparse, sys, os, os.path, shutil, re, subprocess from enum import Enum -import gui, screen +import gui, screen, util frontend = gui.getFrontend("cli") # the fallback, until we got a proper frontend. This is guaranteed to be available. @@ -30,7 +30,6 @@ def commonInternalConnectorNames(): for suffix in commonInternalConnectorSuffices: yield prefix+suffix - # Load a section-less config file: maps parameter names to space-separated lists of strings (with shell quotation) def loadConfigFile(filename): import shlex @@ -106,7 +105,14 @@ if __name__ == "__main__": frontend = gui.getFrontend(cmdArgs.frontend) # load configuration - config = loadConfigFile(os.getenv('HOME') + '/.lilass.conf') + legacyConfigFilePath = os.getenv('HOME') + '/.lilass.conf' + configDirectory = util.getConfigDirectory() + configFilePath = os.path.join(configDirectory, "lilass.conf") + if os.path.isfile(legacyConfigFilePath) and not os.path.isfile(configFilePath): + # looks like we just upgraded to a new version of lilass + util.mkdirP(configDirectory) + shutil.move(legacyConfigFilePath, configFilePath) + config = loadConfigFile(configFilePath) # see what situation we are in situation = situationByConfig(config) @@ -135,7 +141,7 @@ if __name__ == "__main__": if setup is None: sys.exit(1) # the user canceled else: # use first resolution of internal connector - setup = screen.ScreenSetup(intResolution = situation.internalResolutions()[0], extResolution = None) + setup = screen.ScreenSetup(intResolution = situation.internalConnector.getPreferredResolution(), extResolution = None) # call xrandr xrandrCall = situation.forXrandr(setup) diff --git a/screen.py b/screen.py index 9942e98..b096fb1 100644 --- a/screen.py +++ b/screen.py @@ -129,6 +129,7 @@ class Connector: self.name = name # connector name, e.g. "HDMI1" self.edid = None # EDID string for the connector, or None if disconnected self.resolutions = set() # list of Resolution objects, empty if disconnected + self.preferredResolution = None def __str__(self): return str(self.name) @@ -149,6 +150,11 @@ class Connector: self.edid = s else: self.edid += s + + def getPreferredResolution(self): + if self.preferredResolution: + return self.preferredResolution + return max(self.resolutions, key=lambda r: r.pixelCount()) class ScreenSituation: connectors = [] # contains all the Connector objects @@ -209,6 +215,8 @@ class ScreenSituation: resolution = Resolution(int(m.group(1)), int(m.group(2))) assert connector is not None connector.addResolution(resolution) + if '+preferred' in line: + connector.preferredResolution = resolution continue # EDID? m = re.search(r'^\s*EDID:\s*$', line) diff --git a/util.py b/util.py new file mode 100644 index 0000000..00c80a1 --- /dev/null +++ b/util.py @@ -0,0 +1,23 @@ +import os, os.path + +def getConfigDirectory(): + d = os.environ.get("XDG_CONFIG_HOME") + if d: + return os.path.join(d, "lilass") + d = os.path.expanduser("~") + if d: + return os.path.join(d, ".config", "lilass") + raise Exception("Couldn't find config directory") + +def getDataDirectory(): + d = os.environ.get("XDG_DATA_HOME") + if d: + return os.path.join(d, "lilass") + d = os.path.expanduser("~") + if d: + return os.path.join(d, ".local", "share", "lilass") + raise Exception("Couldn't find data directory.") + +def mkdirP(path, mode=0o700): + os.makedirs(path, mode=mode, exist_ok=True) + -- 2.30.2