From dea0aa9f7c68ae9ff5732325573369cd0a86688d Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Sun, 31 Dec 2017 14:38:20 +0100 Subject: [PATCH 01/16] Add tabs page --- qutebrowser/browser/qutescheme.py | 25 ++++++++++++++ qutebrowser/html/tabs.html | 56 +++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 qutebrowser/html/tabs.html diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 8bcb7ff37..57c32999b 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -201,6 +201,31 @@ def qute_bookmarks(_url): return 'text/html', html +def _tab_fields_to_tabs_page_info(fields): + return (fields['title'], fields['current_url']) + + +@add_handler('tabs') +def qute_tabs(_url): + """Handler for qute://tabs. Display information about all open tabs.""" + tabs = {} + for win_id in objreg.window_registry: + win_id_str = str(win_id) + tabs[win_id_str] = [] + tabbed_browser = objreg.get('tabbed-browser', + scope='window', + window=win_id) + for tab_idx in range(tabbed_browser.count()): + tabs[win_id_str].append( + _tab_fields_to_tabs_page_info( + tabbed_browser.get_tab_fields(tab_idx))) + + html = jinja.render('tabs.html', + title='Tabs', + tab_list_by_window=tabs) + return 'text/html', html + + def history_data(start_time, offset=None): """Return history data. diff --git a/qutebrowser/html/tabs.html b/qutebrowser/html/tabs.html new file mode 100644 index 000000000..80244ef51 --- /dev/null +++ b/qutebrowser/html/tabs.html @@ -0,0 +1,56 @@ +{% extends "styled.html" %} + +{% block style %} +{{super()}} +h1 { + margin-bottom: 10px; +} + +.url a { + color: #444; +} + +th { + text-align: left; +} + +.qmarks .name { + padding-left: 5px; +} + +.empty-msg { + background-color: #f8f8f8; + color: #444; + display: inline-block; + text-align: center; + width: 100%; +} +{% endblock %} + +{% block content %} + +

Tab list

+{% for win_id, tabs in tab_list_by_window.items() %} +

Window {{ win_id }}

+ + + {% for name, url in tabs %} + + + + + {% endfor %} + +
{{name}}{{url}}
+{% endfor %} + +

Raw list

+ +{% for win_id, tabs in tab_list_by_window.items() %} + {% for name, url in tabs %} + {{url}}
+ {% endfor %} +{% endfor %} +
+ +{% endblock %} From ab9f17b05365f90be456d87a9c1d1a437c1f1cb1 Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Mon, 22 Jan 2018 16:05:34 +0100 Subject: [PATCH 02/16] Use default value for dictionary item in tabs handler --- qutebrowser/browser/qutescheme.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 57c32999b..c96578d18 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -30,6 +30,7 @@ import time import textwrap import mimetypes import urllib +import collections import pkg_resources from PyQt5.QtCore import QUrlQuery, QUrl @@ -208,10 +209,9 @@ def _tab_fields_to_tabs_page_info(fields): @add_handler('tabs') def qute_tabs(_url): """Handler for qute://tabs. Display information about all open tabs.""" - tabs = {} + tabs = collections.defaultdict(list) for win_id in objreg.window_registry: win_id_str = str(win_id) - tabs[win_id_str] = [] tabbed_browser = objreg.get('tabbed-browser', scope='window', window=win_id) From f11d7ab489f7e91d520c2efd43ab4e16416e7196 Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Mon, 22 Jan 2018 16:11:59 +0100 Subject: [PATCH 03/16] Check if the window still exists --- qutebrowser/browser/qutescheme.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index c96578d18..af2f34f70 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -40,6 +40,7 @@ from qutebrowser.config import config, configdata, configexc, configdiff from qutebrowser.utils import (version, utils, jinja, log, message, docutils, objreg, urlutils) from qutebrowser.misc import objects +import sip pyeval_output = ":pyeval was never called" @@ -210,7 +211,9 @@ def _tab_fields_to_tabs_page_info(fields): def qute_tabs(_url): """Handler for qute://tabs. Display information about all open tabs.""" tabs = collections.defaultdict(list) - for win_id in objreg.window_registry: + for win_id, window in objreg.window_registry.items(): + if sip.isdeleted(window): + continue win_id_str = str(win_id) tabbed_browser = objreg.get('tabbed-browser', scope='window', From 02396cb455d7d1ffc7f01cc38498b658df50a066 Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Mon, 22 Jan 2018 16:12:45 +0100 Subject: [PATCH 04/16] Remove useless function --- qutebrowser/browser/qutescheme.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index af2f34f70..397e9f35e 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -203,10 +203,6 @@ def qute_bookmarks(_url): return 'text/html', html -def _tab_fields_to_tabs_page_info(fields): - return (fields['title'], fields['current_url']) - - @add_handler('tabs') def qute_tabs(_url): """Handler for qute://tabs. Display information about all open tabs.""" @@ -219,9 +215,9 @@ def qute_tabs(_url): scope='window', window=win_id) for tab_idx in range(tabbed_browser.count()): + tab_fields = tabbed_browser.get_tab_fields(tab_idx) tabs[win_id_str].append( - _tab_fields_to_tabs_page_info( - tabbed_browser.get_tab_fields(tab_idx))) + (tab_fields['title'], tab_fields['current_url'])) html = jinja.render('tabs.html', title='Tabs', From ddc41d2fa41f30bd6e8bb4c72206e89f098eff29 Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Sun, 11 Feb 2018 22:15:14 +0100 Subject: [PATCH 05/16] Remove raw list of open tabs --- qutebrowser/html/tabs.html | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/qutebrowser/html/tabs.html b/qutebrowser/html/tabs.html index 80244ef51..d929272c5 100644 --- a/qutebrowser/html/tabs.html +++ b/qutebrowser/html/tabs.html @@ -43,14 +43,4 @@ th { {% endfor %} - -

Raw list

- -{% for win_id, tabs in tab_list_by_window.items() %} - {% for name, url in tabs %} - {{url}}
- {% endfor %} -{% endfor %} -
- {% endblock %} From ad50a7bfd284eb58d9edf2d4a8666157181c51b7 Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Mon, 12 Feb 2018 15:20:06 +0100 Subject: [PATCH 06/16] Move import to external ressources --- qutebrowser/browser/qutescheme.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 397e9f35e..e66cf637f 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -34,13 +34,13 @@ import collections import pkg_resources from PyQt5.QtCore import QUrlQuery, QUrl +import sip import qutebrowser from qutebrowser.config import config, configdata, configexc, configdiff from qutebrowser.utils import (version, utils, jinja, log, message, docutils, objreg, urlutils) from qutebrowser.misc import objects -import sip pyeval_output = ":pyeval was never called" From 71d33a47b383b2b0bb24bcd172d58e11a86e491c Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Mon, 12 Feb 2018 15:20:41 +0100 Subject: [PATCH 07/16] Remove useless intermediary variables --- qutebrowser/browser/qutescheme.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index e66cf637f..10790e8b5 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -210,13 +210,12 @@ def qute_tabs(_url): for win_id, window in objreg.window_registry.items(): if sip.isdeleted(window): continue - win_id_str = str(win_id) tabbed_browser = objreg.get('tabbed-browser', scope='window', window=win_id) for tab_idx in range(tabbed_browser.count()): tab_fields = tabbed_browser.get_tab_fields(tab_idx) - tabs[win_id_str].append( + tabs[str(win_id)].append( (tab_fields['title'], tab_fields['current_url'])) html = jinja.render('tabs.html', From 0caa5d04d35efd3dba6b2f27679a0c73d7b6c78e Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Mon, 12 Feb 2018 15:50:56 +0100 Subject: [PATCH 08/16] Use tabs directly also ignore tabs page url in list --- qutebrowser/browser/qutescheme.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 10790e8b5..6eb034836 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -213,10 +213,9 @@ def qute_tabs(_url): tabbed_browser = objreg.get('tabbed-browser', scope='window', window=win_id) - for tab_idx in range(tabbed_browser.count()): - tab_fields = tabbed_browser.get_tab_fields(tab_idx) - tabs[str(win_id)].append( - (tab_fields['title'], tab_fields['current_url'])) + for tab in tabbed_browser.widgets(): + if not tab.url().url().startswith("qute://tabs"): + tabs[str(win_id)].append((tab.title(), tab.url().url())) html = jinja.render('tabs.html', title='Tabs', From ee57c30c53cc809b92ed89cd62cde612ca9e44c3 Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Mon, 12 Feb 2018 16:02:06 +0100 Subject: [PATCH 09/16] Re-add the raw list (with fixed alignment) --- qutebrowser/html/tabs.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/qutebrowser/html/tabs.html b/qutebrowser/html/tabs.html index d929272c5..af6659414 100644 --- a/qutebrowser/html/tabs.html +++ b/qutebrowser/html/tabs.html @@ -43,4 +43,12 @@ th { {% endfor %} +
+ Raw list + +{% for win_id, tabs in tab_list_by_window.items() %}{% for name, url in tabs %} +{{url}}
{% endfor %} +{% endfor %} +
+
{% endblock %} From d6912be2237962c69d155e7cafab2b98ec095053 Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Mon, 12 Feb 2018 16:04:48 +0100 Subject: [PATCH 10/16] Update import order --- qutebrowser/browser/qutescheme.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 6eb034836..e8b682d99 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -33,8 +33,8 @@ import urllib import collections import pkg_resources -from PyQt5.QtCore import QUrlQuery, QUrl import sip +from PyQt5.QtCore import QUrlQuery, QUrl import qutebrowser from qutebrowser.config import config, configdata, configexc, configdiff From 417200fa709513bce8aba1c2d03fba2ed30640b4 Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Mon, 12 Feb 2018 16:06:17 +0100 Subject: [PATCH 11/16] Use QUrl instead of str to compare --- qutebrowser/browser/qutescheme.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index e8b682d99..15823dc87 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -214,7 +214,7 @@ def qute_tabs(_url): scope='window', window=win_id) for tab in tabbed_browser.widgets(): - if not tab.url().url().startswith("qute://tabs"): + if tab.url() != QUrl("qute://tabs/"): tabs[str(win_id)].append((tab.title(), tab.url().url())) html = jinja.render('tabs.html', From 572257921d0dcaf875334b1d8f4ae86660c3a464 Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Mon, 12 Feb 2018 16:12:15 +0100 Subject: [PATCH 12/16] Use QUrl().toDisplayString() instead of url() --- qutebrowser/browser/qutescheme.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 15823dc87..aa887f349 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -215,7 +215,7 @@ def qute_tabs(_url): window=win_id) for tab in tabbed_browser.widgets(): if tab.url() != QUrl("qute://tabs/"): - tabs[str(win_id)].append((tab.title(), tab.url().url())) + tabs[str(win_id)].append((tab.title(), tab.url().toDisplayString())) html = jinja.render('tabs.html', title='Tabs', From 9a0c113f8a448767a5d73bf0205bb2281e28d842 Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Mon, 12 Feb 2018 21:35:33 +0100 Subject: [PATCH 13/16] Fix pylint line-too-long error --- qutebrowser/browser/qutescheme.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index aa887f349..5335a97c8 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -215,7 +215,8 @@ def qute_tabs(_url): window=win_id) for tab in tabbed_browser.widgets(): if tab.url() != QUrl("qute://tabs/"): - tabs[str(win_id)].append((tab.title(), tab.url().toDisplayString())) + tabs[str(win_id)].append( + (tab.title(), tab.url().toDisplayString())) html = jinja.render('tabs.html', title='Tabs', From 0b047e3e1057b0f19cf885605a09dfc17bee9aaa Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Mon, 12 Feb 2018 22:48:41 +0100 Subject: [PATCH 14/16] Handle url with trailing slash and without --- qutebrowser/browser/qutescheme.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 5335a97c8..a93cd88a8 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -214,7 +214,7 @@ def qute_tabs(_url): scope='window', window=win_id) for tab in tabbed_browser.widgets(): - if tab.url() != QUrl("qute://tabs/"): + if tab.url() not in [QUrl("qute://tabs/"), QUrl("qute://tabs")]: tabs[str(win_id)].append( (tab.title(), tab.url().toDisplayString())) From 7ae0d584e67956960014af0e1606042ae02fb158 Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Mon, 12 Feb 2018 22:49:02 +0100 Subject: [PATCH 15/16] Add 20px margin above the raw list --- qutebrowser/html/tabs.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/qutebrowser/html/tabs.html b/qutebrowser/html/tabs.html index af6659414..fff8bdca3 100644 --- a/qutebrowser/html/tabs.html +++ b/qutebrowser/html/tabs.html @@ -25,6 +25,10 @@ th { text-align: center; width: 100%; } + +details { + margin-top: 20px; +} {% endblock %} {% block content %} From ca199b0d3dc1fd6c7aab41e0832a90203ced396f Mon Sep 17 00:00:00 2001 From: Simon Doppler Date: Mon, 12 Feb 2018 22:51:36 +0100 Subject: [PATCH 16/16] Use separate variable to make pylint happy --- qutebrowser/browser/qutescheme.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index a93cd88a8..37b57f933 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -215,8 +215,8 @@ def qute_tabs(_url): window=win_id) for tab in tabbed_browser.widgets(): if tab.url() not in [QUrl("qute://tabs/"), QUrl("qute://tabs")]: - tabs[str(win_id)].append( - (tab.title(), tab.url().toDisplayString())) + urlstr = tab.url().toDisplayString() + tabs[str(win_id)].append((tab.title(), urlstr)) html = jinja.render('tabs.html', title='Tabs',