Skip to content

Commit

Permalink
#816: add grace timeout support
Browse files Browse the repository at this point in the history
git-svn-id: https://xpra.org/svn/Xpra/trunk@8703 3bb7dfac-3a0b-4e04-842a-767bc560f471
  • Loading branch information
totaam committed Feb 25, 2015
1 parent db14d42 commit 3335f49
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 3 deletions.
7 changes: 6 additions & 1 deletion src/xpra/server/server_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -620,6 +620,11 @@ def idle_timeout_cb(self, source):
if p:
self.disconnect_client(p, IDLE_TIMEOUT)

def idle_grace_timeout_cb(self, source):
log("idle_grace_timeout_cb(%s)", source)
timeout_nid = 2**16 + 2**8 + 1
source.notify(0, timeout_nid, "xpra", 0, "", "This Xpra session will timeout soon", "Activate one of the windows to avoid this timeout", 10)


def _process_disconnect(self, proto, packet):
info = packet[1]
Expand Down Expand Up @@ -727,7 +732,7 @@ def get_window_id(wid):
from xpra.server.source import ServerSource
ss = ServerSource(proto, drop_client,
self.idle_add, self.timeout_add, self.source_remove,
self.idle_timeout, self.idle_timeout_cb, self._socket_dir,
self.idle_timeout, self.idle_timeout_cb, self.idle_grace_timeout_cb, self._socket_dir,
self.get_transient_for, self.get_focus, self.get_cursor_data,
get_window_id,
self.supports_mmap,
Expand Down
27 changes: 25 additions & 2 deletions src/xpra/server/source.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@

MAX_CLIPBOARD_PER_SECOND = int(os.environ.get("XPRA_CLIPBOARD_LIMIT", "10"))
ADD_LOCAL_PRINTERS = os.environ.get("XPRA_ADD_LOCAL_PRINTERS", "0")=="1"
try:
GRACE_PERCENT = int(os.environ.get("XPRA_GRACE_PERCENT", "90"))
except:
GRACE_PERCENT = 90


def make_window_metadata(window, propname, get_transient_for=None, get_window_id=None):
Expand Down Expand Up @@ -147,7 +151,7 @@ class ServerSource(object):
"""

def __init__(self, protocol, disconnect_cb, idle_add, timeout_add, source_remove,
idle_timeout, idle_timeout_cb, socket_dir,
idle_timeout, idle_timeout_cb, idle_grace_timeout_cb, socket_dir,
get_transient_for, get_focus, get_cursor_data_cb,
get_window_id,
supports_mmap,
Expand All @@ -158,7 +162,7 @@ def __init__(self, protocol, disconnect_cb, idle_add, timeout_add, source_remove
default_quality, default_min_quality,
default_speed, default_min_speed):
log("ServerSource%s", (protocol, disconnect_cb, idle_add, timeout_add, source_remove,
idle_timeout, idle_timeout_cb, socket_dir,
idle_timeout, idle_timeout_cb, idle_grace_timeout_cb, socket_dir,
get_transient_for, get_focus,
get_window_id,
supports_mmap,
Expand All @@ -177,7 +181,10 @@ def __init__(self, protocol, disconnect_cb, idle_add, timeout_add, source_remove
self.source_remove = source_remove
self.idle_timeout = idle_timeout
self.idle_timeout_cb = idle_timeout_cb
self.idle_grace_timeout_cb = idle_grace_timeout_cb
self.idle_timer = None
self.idle_grace_timer = None
self.schedule_idle_grace_timeout()
self.schedule_idle_timeout()
self.socket_dir = socket_dir
#pass it to window source:
Expand Down Expand Up @@ -445,6 +452,7 @@ def resume(self, ui, wd):
def user_event(self):
timeoutlog("user_event()")
self.last_user_event = time.time()
self.schedule_idle_grace_timeout()
self.schedule_idle_timeout()

def schedule_idle_timeout(self):
Expand All @@ -455,6 +463,21 @@ def schedule_idle_timeout(self):
if self.idle_timeout>0:
self.idle_timer = self.timeout_add(self.idle_timeout*1000, self.idle_timedout)

def schedule_idle_grace_timeout(self):
timeoutlog("schedule_idle_grace_timeout() grace timer=%s, idle_timeout=%s", self.idle_grace_timer, self.idle_timeout)
if self.idle_grace_timer:
self.source_remove(self.idle_grace_timer)
self.idle_grace_timer = None
if self.idle_timeout>0 and not self.is_closed():
#grace timer is 90% of real timer:
grace = int(self.idle_timeout*1000*GRACE_PERCENT/100)
self.idle_grace_timer = self.timeout_add(grace, self.idle_grace_timedout)

def idle_grace_timedout(self):
self.idle_grace_timer = None
timeoutlog("idle_grace_timedout() callback=%s", self.idle_grace_timeout_cb)
self.idle_grace_timeout_cb(self)

def idle_timedout(self):
self.idle_timer = None
timeoutlog("idle_timedout() callback=%s", self.idle_timeout_cb)
Expand Down

0 comments on commit 3335f49

Please sign in to comment.