summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/core.py28
-rw-r--r--src/core/handlers.py3
-rw-r--r--src/tabs/__init__.py3
-rw-r--r--src/tabs/basetabs.py20
-rw-r--r--src/tabs/conversationtab.py50
-rw-r--r--src/tabs/muclisttab.py33
-rw-r--r--src/tabs/muctab.py58
-rw-r--r--src/tabs/privatetab.py27
-rw-r--r--src/tabs/rostertab.py54
-rw-r--r--src/tabs/xmltab.py27
-rw-r--r--src/windows.py15
11 files changed, 233 insertions, 85 deletions
diff --git a/src/core/core.py b/src/core/core.py
index 95adc067..a0bb243c 100644
--- a/src/core/core.py
+++ b/src/core/core.py
@@ -41,6 +41,7 @@ from keyboard import Keyboard
from logger import logger
from plugin_manager import PluginManager
from roster import roster
+from size_manager import SizeManager
from text_buffer import TextBuffer
from theming import get_theme
from windows import g_lock
@@ -105,6 +106,7 @@ class Core(object):
self.plugin_manager = PluginManager(self)
self.events = events.EventHandler()
+ self.size = SizeManager(self, windows.Win)
# global commands, available from all tabs
# a command is tuple of the form:
@@ -1498,20 +1500,25 @@ class Core(object):
Resize the global_information_win only once at each resize.
"""
with g_lock:
- height = (tabs.Tab.height - 1 - self.information_win_size
- - tabs.Tab.tab_win_height())
- self.information_win.resize(self.information_win_size,
- tabs.Tab.width,
- height,
- 0)
+ height = min(tabs.Tab.height - 1 - self.information_win_size
+ - tabs.Tab.tab_win_height(),
+ tabs.Tab.height - 5)
+ if not self.size.core_degrade_y:
+ self.information_win.resize(self.information_win_size,
+ tabs.Tab.width,
+ height,
+ 0)
def resize_global_info_bar(self):
"""
Resize the GlobalInfoBar only once at each resize
"""
with g_lock:
- self.tab_win.resize(1, tabs.Tab.width, tabs.Tab.height - 2, 0)
- if config.get('enable_vertical_tab_list', False):
+ height, width = self.stdscr.getmaxyx()
+ if not self.size.core_degrade_y:
+ self.tab_win.resize(1, tabs.Tab.width, tabs.Tab.height - 2, 0)
+ if (config.get('enable_vertical_tab_list', False)
+ and not self.size.core_degrade_x):
try:
height, _ = self.stdscr.getmaxyx()
truncated_win = self.stdscr.subwin(height,
@@ -1550,7 +1557,10 @@ class Core(object):
# window to each Tab class, so the draw themself in the portion
# of the screen that the can occupy, and we draw the tab list
# on the left remaining space
- if config.get('enable_vertical_tab_list', False):
+ with g_lock:
+ height, width = self.stdscr.getmaxyx()
+ if (config.get('enable_vertical_tab_list', False) and
+ not self.size.core_degrade_x):
with g_lock:
try:
scr = self.stdscr.subwin(0,
diff --git a/src/core/handlers.py b/src/core/handlers.py
index bc666736..05eab9f7 100644
--- a/src/core/handlers.py
+++ b/src/core/handlers.py
@@ -617,7 +617,8 @@ def on_chatstate_groupchat_conversation(self, message, state):
self.events.trigger('muc_chatstate', message, tab)
tab.get_user_by_name(nick).chatstate = state
if tab == self.current_tab():
- tab.user_win.refresh(tab.users)
+ if not self.size.tab_degrade_x:
+ tab.user_win.refresh(tab.users)
tab.input.refresh()
self.doupdate()
else:
diff --git a/src/tabs/__init__.py b/src/tabs/__init__.py
index bb9409b0..a0ad089b 100644
--- a/src/tabs/__init__.py
+++ b/src/tabs/__init__.py
@@ -1,4 +1,5 @@
-from . basetabs import Tab, ChatTab, GapTab, STATE_PRIORITY
+from . basetabs import Tab, ChatTab, GapTab
+from . basetabs import STATE_PRIORITY
from . rostertab import RosterInfoTab
from . muctab import MucTab, NS_MUC_USER
from . privatetab import PrivateTab
diff --git a/src/tabs/basetabs.py b/src/tabs/basetabs.py
index 2811ba66..77086ec6 100644
--- a/src/tabs/basetabs.py
+++ b/src/tabs/basetabs.py
@@ -38,9 +38,6 @@ from theming import get_theme
from windows import g_lock
-MIN_WIDTH = 42
-MIN_HEIGHT = 6
-
# getters for tab colors (lambdas, so that they are dynamic)
STATE_COLORS = {
'disconnected': lambda: get_theme().COLOR_TAB_DISCONNECTED,
@@ -88,6 +85,7 @@ STATE_PRIORITY = {
class Tab(object):
tab_core = None
+ size_manager = None
plugin_commands = {}
plugin_keys = {}
@@ -103,6 +101,12 @@ class Tab(object):
@property
+ def size(self):
+ if not Tab.size_manager:
+ Tab.size_manager = self.core.size
+ return Tab.size_manager
+
+ @property
def core(self):
if not Tab.tab_core:
Tab.tab_core = singleton.Singleton(core.Core)
@@ -182,11 +186,7 @@ class Tab(object):
@staticmethod
def resize(scr):
with g_lock:
- Tab.size = (Tab.height, Tab.width) = scr.getmaxyx()
- if Tab.height < MIN_HEIGHT or Tab.width < MIN_WIDTH:
- Tab.visible = False
- else:
- Tab.visible = True
+ Tab.height, Tab.width = scr.getmaxyx()
windows.Win._tab_win = scr
def register_command(self, name, func, *, desc='', shortdesc='', completion=None, usage=''):
@@ -283,9 +283,9 @@ class Tab(object):
return False
def refresh_tab_win(self):
- if self.left_tab_win:
+ if self.left_tab_win and not self.size.core_degrade_x:
self.left_tab_win.refresh()
- else:
+ elif not self.size.core_degrade_y:
self.tab_win.refresh()
def refresh(self):
diff --git a/src/tabs/conversationtab.py b/src/tabs/conversationtab.py
index 51262db0..d37ba4b7 100644
--- a/src/tabs/conversationtab.py
+++ b/src/tabs/conversationtab.py
@@ -260,23 +260,44 @@ class ConversationTab(ChatTab):
callback=callback)
def resize(self):
- if self.core.information_win_size >= self.height-3 or not self.visible:
- return
self.need_resize = False
- self.text_win.resize(self.height-3-self.core.information_win_size - Tab.tab_win_height(), self.width, 1, 0)
+ if self.size.tab_degrade_y:
+ display_bar = False
+ info_win_height = 0
+ tab_win_height = 0
+ bar_height = 0
+ else:
+ display_bar = True
+ info_win_height = self.core.information_win_size
+ tab_win_height = Tab.tab_win_height()
+ bar_height = 1
+
+ self.text_win.resize(self.height - 2 - bar_height - info_win_height
+ - tab_win_height,
+ self.width, bar_height, 0)
self.text_win.rebuild_everything(self._text_buffer)
- self.upper_bar.resize(1, self.width, 0, 0)
- self.info_header.resize(1, self.width, self.height-2-self.core.information_win_size - Tab.tab_win_height(), 0)
- self.input.resize(1, self.width, self.height-1, 0)
+ if display_bar:
+ self.upper_bar.resize(1, self.width, 0, 0)
+ self.info_header.resize(1, self.width,
+ self.height - 2 - bar_height - info_win_height
+ - tab_win_height,
+ 0)
+ self.input.resize(1, self.width, self.height - 1, 0)
def refresh(self):
if self.need_resize:
self.resize()
log.debug(' TAB Refresh: %s', self.__class__.__name__)
+ display_bar = display_info_win = not self.size.tab_degrade_y
+
self.text_win.refresh()
- self.upper_bar.refresh(self.get_dest_jid(), roster[self.get_dest_jid()])
+
+ if display_bar:
+ self.upper_bar.refresh(self.get_dest_jid(), roster[self.get_dest_jid()])
self.info_header.refresh(self.get_dest_jid(), roster[self.get_dest_jid()], self.text_win, self.chatstate, ConversationTab.additional_informations)
- self.info_win.refresh()
+
+ if display_info_win:
+ self.info_win.refresh()
self.refresh_tab_win()
self.input.refresh()
@@ -439,14 +460,21 @@ class DynamicConversationTab(ConversationTab):
if self.need_resize:
self.resize()
log.debug(' TAB Refresh: %s', self.__class__.__name__)
+ display_bar = display_info_win = not self.size.tab_degrade_y
+
self.text_win.refresh()
- self.upper_bar.refresh(self.get_name(), roster[self.get_name()])
+ if display_bar:
+ self.upper_bar.refresh(self.get_name(), roster[self.get_name()])
if self.locked_resource:
displayed_jid = "%s/%s" % (self.get_name(), self.locked_resource)
else:
displayed_jid = self.get_name()
- self.info_header.refresh(displayed_jid, roster[self.get_name()], self.text_win, self.chatstate, ConversationTab.additional_informations)
- self.info_win.refresh()
+ self.info_header.refresh(displayed_jid, roster[self.get_name()],
+ self.text_win, self.chatstate,
+ ConversationTab.additional_informations)
+ if display_info_win:
+ self.info_win.refresh()
+
self.refresh_tab_win()
self.input.refresh()
diff --git a/src/tabs/muclisttab.py b/src/tabs/muclisttab.py
index 6506d4cf..b8c49e8c 100644
--- a/src/tabs/muclisttab.py
+++ b/src/tabs/muclisttab.py
@@ -63,26 +63,41 @@ class MucListTab(Tab):
if self.need_resize:
self.resize()
log.debug(' TAB Refresh: %s', self.__class__.__name__)
+ if self.size.tab_degrade_y:
+ display_info_win = False
+ else:
+ display_info_win = True
+
self.info_header.refresh(window=self.listview)
- self.info_win.refresh()
+ if display_info_win:
+ self.info_win.refresh()
self.refresh_tab_win()
self.list_header.refresh()
self.listview.refresh()
self.input.refresh()
- self.update_commands()
def resize(self):
- if self.core.information_win_size >= self.height-3 or not self.visible:
- return
self.need_resize = False
- self.info_header.resize(1, self.width, self.height-2-self.core.information_win_size - Tab.tab_win_height(), 0)
- column_size = {'node-part': int(self.width*2/8),
- 'name': int(self.width*5/8),
- 'users': self.width-int(self.width*2/8)-int(self.width*5/8)}
+ if self.size.tab_degrade_y:
+ info_win_height = 0
+ tab_win_height = 0
+ else:
+ info_win_height = self.core.information_win_size
+ tab_win_height = Tab.tab_win_height()
+
+ self.info_header.resize(1, self.width,
+ self.height - 2 - info_win_height
+ - tab_win_height,
+ 0)
+ column_size = {'node-part': int(self.width* 2 / 8),
+ 'name': int(self.width * 5 / 8),
+ 'users': self.width - int(self.width * 2 / 8)
+ - int(self.width * 5 / 8)}
self.list_header.resize_columns(column_size)
self.list_header.resize(1, self.width, 0, 0)
self.listview.resize_columns(column_size)
- self.listview.resize(self.height-3-self.core.information_win_size - Tab.tab_win_height(), self.width, 1, 0)
+ self.listview.resize(self.height - 3 - info_win_height - tab_win_height,
+ self.width, 1, 0)
self.input.resize(1, self.width, self.height-1, 0)
def on_slash(self):
diff --git a/src/tabs/muctab.py b/src/tabs/muctab.py
index ceda58a5..2170e754 100644
--- a/src/tabs/muctab.py
+++ b/src/tabs/muctab.py
@@ -796,29 +796,42 @@ class MucTab(ChatTab):
"""
Resize the whole window. i.e. all its sub-windows
"""
- if not self.visible:
- return
self.need_resize = False
- if config.get("hide_user_list", False):
+ if config.get("hide_user_list", False) or self.size.tab_degrade_x:
+ display_user_list = False
text_width = self.width
else:
- text_width = (self.width//10)*9
- self.user_win.resize(self.height - 3 - self.core.information_win_size
- - Tab.tab_win_height(),
- self.width - (self.width // 10) * 9 - 1,
- 1,
- (self.width // 10) * 9 + 1)
+ display_user_list = True
+ text_width = (self.width // 10) * 9
+
+ if self.size.tab_degrade_y:
+ display_info_win = False
+ tab_win_height = 0
+ info_win_height = 0
+ else:
+ display_info_win = True
+ tab_win_height = Tab.tab_win_height()
+ info_win_height = self.core.information_win_size
+
+
+ if display_user_list:
+ self.user_win.resize(self.height - 3 - info_win_height
+ - tab_win_height,
+ self.width - (self.width // 10) * 9 - 1,
+ 1,
+ (self.width // 10) * 9 + 1)
+ self.v_separator.resize(self.height - 2 - tab_win_height,
+ 1, 1, 9 * (self.width // 10))
+
self.topic_win.resize(1, self.width, 0, 0)
- self.v_separator.resize(self.height - 2 - Tab.tab_win_height(),
- 1, 1, 9 * (self.width // 10))
- self.text_win.resize(self.height - 3 - self.core.information_win_size
- - Tab.tab_win_height(),
- text_width, 1, 0)
+
+ self.text_win.resize(self.height - 3 - info_win_height
+ - tab_win_height,
+ text_width, 1, 0)
self.text_win.rebuild_everything(self._text_buffer)
self.info_header.resize(1, self.width,
- self.height - 2
- - self.core.information_win_size
- - Tab.tab_win_height(),
+ self.height - 2 - info_win_height
+ - tab_win_height,
0)
self.input.resize(1, self.width, self.height-1, 0)
@@ -826,14 +839,21 @@ class MucTab(ChatTab):
if self.need_resize:
self.resize()
log.debug(' TAB Refresh: %s', self.__class__.__name__)
+ if config.get("hide_user_list", False) or self.size.tab_degrade_x:
+ display_user_list = False
+ else:
+ display_user_list = True
+ display_info_win = not self.size.tab.degrade_y
+
self.topic_win.refresh(self.get_single_line_topic())
self.text_win.refresh()
- if not config.get("hide_user_list", False):
+ if display_user_list:
self.v_separator.refresh()
self.user_win.refresh(self.users)
self.info_header.refresh(self, self.text_win)
self.refresh_tab_win()
- self.info_win.refresh()
+ if display_info_win:
+ self.info_win.refresh()
self.input.refresh()
def on_input(self, key, raw):
diff --git a/src/tabs/privatetab.py b/src/tabs/privatetab.py
index 7b050769..a88e9060 100644
--- a/src/tabs/privatetab.py
+++ b/src/tabs/privatetab.py
@@ -237,21 +237,36 @@ class PrivateTab(ChatTab):
self.parent_muc.command_info(user)
def resize(self):
- if self.core.information_win_size >= self.height-3 or not self.visible:
- return
self.need_resize = False
- self.text_win.resize(self.height-2-self.core.information_win_size - Tab.tab_win_height(), self.width, 0, 0)
+
+ if self.size.tab_degrade_y:
+ info_win_height = 0
+ tab_win_height = 0
+ else:
+ info_win_height = self.core.information_win_size
+ tab_win_height = Tab.tab_win_height()
+
+ self.text_win.resize(self.height - 2 - info_win_height - tab_win_height,
+ self.width, 0, 0)
self.text_win.rebuild_everything(self._text_buffer)
- self.info_header.resize(1, self.width, self.height-2-self.core.information_win_size - Tab.tab_win_height(), 0)
+ self.info_header.resize(1, self.width,
+ self.height - 2 - info_win_height
+ - tab_win_height,
+ 0)
self.input.resize(1, self.width, self.height-1, 0)
def refresh(self):
if self.need_resize:
self.resize()
log.debug(' TAB Refresh: %s', self.__class__.__name__)
+ display_info_win = not self.size.tab_degrade_y
+
self.text_win.refresh()
- self.info_header.refresh(self.name, self.text_win, self.chatstate, PrivateTab.additional_informations)
- self.info_win.refresh()
+ self.info_header.refresh(self.name, self.text_win, self.chatstate,
+ PrivateTab.additional_informations)
+ if display_info_win:
+ self.info_win.refresh()
+
self.refresh_tab_win()
self.input.refresh()
diff --git a/src/tabs/rostertab.py b/src/tabs/rostertab.py
index 42a63545..adc83445 100644
--- a/src/tabs/rostertab.py
+++ b/src/tabs/rostertab.py
@@ -266,15 +266,40 @@ class RosterInfoTab(Tab):
self.core.command_last_activity(jid)
def resize(self):
- if not self.visible:
- return
self.need_resize = False
- roster_width = self.width//2
- info_width = self.width-roster_width-1
- self.v_separator.resize(self.height-1 - Tab.tab_win_height(), 1, 0, roster_width)
- self.information_win.resize(self.height-2-4, info_width, 0, roster_width+1, self.core.information_buffer)
- self.roster_win.resize(self.height-1 - Tab.tab_win_height(), roster_width, 0, 0)
- self.contact_info_win.resize(5 - Tab.tab_win_height(), info_width, self.height-2-4, roster_width+1)
+ if self.size.tab_degrade_x:
+ display_info = False
+ roster_width = self.width
+ else:
+ display_info = True
+ roster_width = self.width // 2
+ if self.size.tab_degrade_y:
+ display_contact_win = False
+ contact_win_h = 0
+ else:
+ display_contact_win = True
+ contact_win_h = 5
+ if self.size.tab_degrade_y:
+ tab_win_height = 0
+ else:
+ tab_win_height = Tab.tab_win_height()
+
+ info_width = self.width - roster_width - 1
+ if display_info:
+ self.v_separator.resize(self.height - 1 - tab_win_height,
+ 1, 0, roster_width)
+ self.information_win.resize(self.height - 1 - tab_win_height
+ - contact_win_h,
+ info_width, 0, roster_width + 1,
+ self.core.information_buffer)
+ if display_contact_win:
+ self.contact_info_win.resize(contact_win_h - tab_win_height,
+ info_width,
+ self.height - tab_win_height
+ - contact_win_h - 1,
+ roster_width + 1)
+ self.roster_win.resize(self.height - 1 - Tab.tab_win_height(),
+ roster_width, 0, 0)
self.input.resize(1, self.width, self.height-1, 0)
self.default_help_message.resize(1, self.width, self.height-1, 0)
@@ -699,10 +724,17 @@ class RosterInfoTab(Tab):
if self.need_resize:
self.resize()
log.debug(' TAB Refresh: %s', self.__class__.__name__)
- self.v_separator.refresh()
+
+ display_info = not self.size.tab_degrade_x
+ display_contact_win = not self.size.tab_degrade_y
+
self.roster_win.refresh(roster)
- self.contact_info_win.refresh(self.roster_win.get_selected_row())
- self.information_win.refresh()
+ if display_info:
+ self.v_separator.refresh()
+ self.information_win.refresh()
+ if display_contact_win:
+ self.contact_info_win.refresh(
+ self.roster_win.get_selected_row())
self.refresh_tab_win()
self.input.refresh()
diff --git a/src/tabs/xmltab.py b/src/tabs/xmltab.py
index a2728586..7c79da67 100644
--- a/src/tabs/xmltab.py
+++ b/src/tabs/xmltab.py
@@ -163,23 +163,38 @@ class XMLTab(Tab):
self.core.close_tab()
def resize(self):
- if self.core.information_win_size >= self.height-3 or not self.visible:
- return
self.need_resize = False
- min = 1 if self.left_tab_win else 2
- self.text_win.resize(self.height-self.core.information_win_size - Tab.tab_win_height() - 2, self.width, 0, 0)
+ if self.size.tab_degrade_y:
+ info_win_size = 0
+ tab_win_height = 0
+ else:
+ info_win_size = self.core.information_win_size
+ tab_win_height = Tab.tab_win_height()
+
+ self.text_win.resize(self.height - info_win_size - tab_win_height - 2,
+ self.width, 0, 0)
self.text_win.rebuild_everything(self.core.xml_buffer)
- self.info_header.resize(1, self.width, self.height-2-self.core.information_win_size - Tab.tab_win_height(), 0)
+ self.info_header.resize(1, self.width,
+ self.height - 2 - info_win_size
+ - tab_win_height,
+ 0)
self.input.resize(1, self.width, self.height-1, 0)
def refresh(self):
if self.need_resize:
self.resize()
log.debug(' TAB Refresh: %s', self.__class__.__name__)
+
+ if self.size.tab_degrade_y:
+ display_info_win = False
+ else:
+ display_info_win = True
+
self.text_win.refresh()
self.info_header.refresh(self.filter_type, self.filter, self.text_win)
self.refresh_tab_win()
- self.info_win.refresh()
+ if display_info_win:
+ self.info_win.refresh()
self.input.refresh()
def on_lose_focus(self):
diff --git a/src/windows.py b/src/windows.py
index fb901f19..72e7a40d 100644
--- a/src/windows.py
+++ b/src/windows.py
@@ -52,6 +52,16 @@ g_lock = RLock()
LINES_NB_LIMIT = 4096
+class DummyWin(object):
+ def __getattribute__(self, name):
+ if name != '__bool__':
+ return lambda *args, **kwargs: (0, 0)
+ else:
+ return object.__getattribute__(self, name)
+
+ def __bool__(self):
+ return False
+
def find_first_format_char(text):
pos = -1
for char in format_chars:
@@ -103,6 +113,7 @@ class Win(object):
_tab_win = None
def __init__(self):
self._win = None
+ self.height, self.width = 0, 0
def _resize(self, height, width, y, x):
if height == 0 or width == 0:
@@ -113,8 +124,8 @@ class Win(object):
self._win = Win._tab_win.derwin(height, width, y, x)
except:
log.debug('DEBUG: mvwin returned ERR. Please investigate')
-
- # If this ever fail, uncomment that ^
+ if self._win is None:
+ self._win = DummyWin()
def resize(self, height, width, y, x):
"""