diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 5bc0039f9..c9b002260 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -22,6 +22,7 @@ import sys import logging import functools import subprocess +import configparser from signal import signal, SIGINT from argparse import ArgumentParser @@ -316,8 +317,15 @@ class QuteBrowser(QApplication): return self.shutting_down = True logging.debug("Shutting down... (do_quit={})".format(do_quit)) - if config.config is not None: + try: config.config.save() + except AttributeError: + logging.exception("Could not save config.") + try: + self._save_geometry() + config.state.save() + except AttributeError: + logging.exception("Could not save window geometry.") try: if do_quit: self.mainwindow.tabs.shutdown_complete.connect(self.quit) @@ -330,6 +338,18 @@ class QuteBrowser(QApplication): if do_quit: self.quit() + def _save_geometry(self): + """Save the window geometry to the state config.""" + rect = self.mainwindow.geometry() + try: + config.state.add_section('mainwindow') + except configparser.DuplicateSectionError: + pass + config.state['mainwindow']['x'] = str(rect.x()) + config.state['mainwindow']['y'] = str(rect.y()) + config.state['mainwindow']['w'] = str(rect.width()) + config.state['mainwindow']['h'] = str(rect.height()) + @pyqtSlot(tuple) def cmd_handler(self, tpl): """Handle commands and delegate the specific actions. diff --git a/qutebrowser/utils/config.py b/qutebrowser/utils/config.py index 120ceae65..7f46eca71 100644 --- a/qutebrowser/utils/config.py +++ b/qutebrowser/utils/config.py @@ -27,19 +27,23 @@ import os import io import os.path import logging +import configparser from configparser import ConfigParser, ExtendedInterpolation from qutebrowser.utils.misc import read_file config = None +state = None colordict = {} fontdict = {} def init(confdir): """Initialize the global objects based on the config in configdir.""" - global config, colordict, fontdict - config = Config(confdir) + global config, state, colordict, fontdict + logging.debug("Config init, confdir {}".format(confdir)) + config = Config(confdir, 'qutebrowser.conf', read_file('qutebrowser.conf')) + state = Config(confdir, 'state', always_save=True) try: colordict = ColorDict(config['colors']) except KeyError: @@ -126,31 +130,37 @@ class FontDict(dict): except KeyError: return None - class Config(ConfigParser): """Our own ConfigParser subclass.""" configdir = None - FNAME = 'config' default_cp = None config_loaded = False - def __init__(self, configdir): + def __init__(self, configdir, fname, default_config=None, + always_save=False): """Config constructor. configdir -- directory to store the config in. + fname -- Filename of the config file. + default_config -- Default config as string. + always_save -- Whether to always save the config, even when it wasn't + loaded. """ super().__init__(interpolation=ExtendedInterpolation()) + self.always_save = always_save + self.configdir = configdir self.default_cp = ConfigParser(interpolation=ExtendedInterpolation()) self.default_cp.optionxform = lambda opt: opt # be case-insensitive - self.default_cp.read_string(read_file('qutebrowser.conf')) + if default_config is not None: + self.default_cp.read_string(default_config) if not self.configdir: return self.optionxform = lambda opt: opt # be case-insensitive self.configdir = configdir - self.configfile = os.path.join(self.configdir, self.FNAME) + self.configfile = os.path.join(self.configdir, fname) if not os.path.isfile(self.configfile): return logging.debug("Reading config from {}".format(self.configfile)) diff --git a/qutebrowser/widgets/mainwindow.py b/qutebrowser/widgets/mainwindow.py index 5674775ab..3f5c7ccb6 100644 --- a/qutebrowser/widgets/mainwindow.py +++ b/qutebrowser/widgets/mainwindow.py @@ -17,12 +17,13 @@ """The main window of QuteBrowser.""" +from PyQt5.QtCore import QRect from PyQt5.QtWidgets import QWidget, QVBoxLayout from qutebrowser.widgets.statusbar import StatusBar from qutebrowser.widgets.browser import TabbedBrowser from qutebrowser.widgets.completion import CompletionView - +import qutebrowser.utils.config as config class MainWindow(QWidget): @@ -41,8 +42,20 @@ class MainWindow(QWidget): super().__init__() self.setWindowTitle('qutebrowser') - # FIXME maybe store window position/size on exit - self.resize(800, 600) + try: + x = int(config.state['mainwindow']['x']) + y = int(config.state['mainwindow']['y']) + w = int(config.state['mainwindow']['w']) + h = int(config.state['mainwindow']['h']) + except KeyError: + rect = QRect() + else: + rect = QRect(x, y, w, h) + if not rect.isValid(): + rect = QRect(50, 50, 800, 600) + # FIXME there is no setFrameGeometry, but this seems to do the wrong + # thing. + self.setGeometry(rect) self.vbox = QVBoxLayout(self) self.vbox.setContentsMargins(0, 0, 0, 0)