# 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.
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
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)
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)
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)
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
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)
--- /dev/null
+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)
+