borgend/ui.py

Sun, 05 Dec 2021 21:08:01 +0200

author
Tuomo Valkonen <tuomov@iki.fi>
date
Sun, 05 Dec 2021 21:08:01 +0200
changeset 141
a1c97bc1789e
parent 133
ec8014a2ee7a
child 144
31227feaa05a
permissions
-rw-r--r--

Sleep wake callback hadn't been updated to menu refresh code changes. Fixed.

1
4cdc9c1f6b28 basic scheduler structure draft, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 #
89
51cc2e25af38 Added author information headers and content information to source files
Tuomo Valkonen <tuomov@iki.fi>
parents: 87
diff changeset
2 # Borgend by Tuomo Valkonen, 2018
51cc2e25af38 Added author information headers and content information to source files
Tuomo Valkonen <tuomov@iki.fi>
parents: 87
diff changeset
3 #
51cc2e25af38 Added author information headers and content information to source files
Tuomo Valkonen <tuomov@iki.fi>
parents: 87
diff changeset
4 # Borgend MacOS tray icon UI
1
4cdc9c1f6b28 basic scheduler structure draft, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 #
4cdc9c1f6b28 basic scheduler structure draft, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6
4cdc9c1f6b28 basic scheduler structure draft, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 import rumps
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
8 import time
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
9 import datetime
86
2fe66644c50d Can use logging.getLogger directly now after proper packageisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 85
diff changeset
10 import logging
79
b075b3db3044 Cleaned up module organisation to simplify borgend.py and not have to import it in other modules.
Tuomo Valkonen <tuomov@iki.fi>
parents: 78
diff changeset
11 import objc
110
a79409c72565 Oops, removed stray reset of menu entry info
Tuomo Valkonen <tuomov@iki.fi>
parents: 106
diff changeset
12 import math
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
13 from threading import Lock
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
14 from Foundation import (NSDate, NSTimer, NSRunLoop, NSDefaultRunLoopMode)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
15 from AppKit import (NSEventTrackingRunLoopMode)
79
b075b3db3044 Cleaned up module organisation to simplify borgend.py and not have to import it in other modules.
Tuomo Valkonen <tuomov@iki.fi>
parents: 78
diff changeset
16
80
a409242121d5 Better package-like organisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 79
diff changeset
17 from . import backup
a409242121d5 Better package-like organisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 79
diff changeset
18 from . import dreamtime
a409242121d5 Better package-like organisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 79
diff changeset
19 from . import branding
99
281bab8361c8 Oops, log display wasn't working due to missing import
Tuomo Valkonen <tuomov@iki.fi>
parents: 98
diff changeset
20 from . import loggers
106
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
21 from .exprotect import protect_noreturn
80
a409242121d5 Better package-like organisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 79
diff changeset
22 from .config import settings
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
23
86
2fe66644c50d Can use logging.getLogger directly now after proper packageisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 85
diff changeset
24 logger=logging.getLogger(__name__)
31
b4b4bb7a2ec5 More logging detail
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
25
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
26 traynames_ok={
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
27 backup.State.INACTIVE: 'B.',
98
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
28 backup.State.PAUSED: 'B‖',
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
29 backup.State.SCHEDULED: 'B.',
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
30 backup.State.QUEUED: 'B:',
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
31 backup.State.ACTIVE: 'B!',
45
aa2a95dc6093 Further improvements to state reporting; indicate busyness if repository lock cannot be acquired
Tuomo Valkonen <tuomov@iki.fi>
parents: 42
diff changeset
32 }
14
5a988a2c2624 UI: progress percentange support (Borg doesn't seem to be reporting) + error indicator in tray: B?
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
33
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
34 traynames_errors={
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
35 # The first one should never be used
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
36 backup.Errors.OK: traynames_ok[backup.State.INACTIVE],
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
37 backup.Errors.BUSY: 'B⦙',
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
38 backup.Errors.OFFLINE: 'B⦙',
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
39 backup.Errors.ERRORS: 'B?'
16
d0ffae5550ef Added offline symbol B⦙ (no offline detection yet)
Tuomo Valkonen <tuomov@iki.fi>
parents: 15
diff changeset
40 }
14
5a988a2c2624 UI: progress percentange support (Borg doesn't seem to be reporting) + error indicator in tray: B?
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
41
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
42 def trayname(ste):
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
43 state=ste[0]
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
44 errors=ste[1]
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
45 if not errors.ok():
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
46 return traynames_errors[errors]
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
47 else:
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
48 return traynames_ok[state]
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
49
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
50 def combine_state(a, b):
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
51 return (max(a[0], b[0]), max(a[1], b[1]))
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
52
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
53 # Refresh the menu at most twice a second
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
54 refresh_interval=0.5
27
a347387868be UI refresh delay to reduce flicker
Tuomo Valkonen <tuomov@iki.fi>
parents: 21
diff changeset
55
32
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
56 # Workaround to rumps brokenness;
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
57 # see https://github.com/jaredks/rumps/issues/59
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
58 def notification_workaround(title, subtitle, message):
34
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
59 try:
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
60 NSDictionary = objc.lookUpClass("NSDictionary")
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
61 d=NSDictionary()
32
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
62
34
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
63 rumps.notification(title, subtitle, message, data=d)
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
64 except Exception as err:
50
2d8947351727 Logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 49
diff changeset
65 logger.exception("Failed to display notification")
32
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
66
19
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
67 # Based on code snatched from
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
68 # https://stackoverflow.com/questions/12523586/python-format-size-application-converting-b-to-kb-mb-gb-tb/37423778
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
69 def humanbytes(B):
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
70 'Return the given bytes as a human friendly KB, MB, GB, or TB string'
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
71 B = float(B)
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
72 KB = float(1024)
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
73 MB = float(KB ** 2) # 1,048,576
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
74 GB = float(KB ** 3) # 1,073,741,824
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
75 TB = float(KB ** 4) # 1,099,511,627,776
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
76
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
77 if B < KB:
20
fdfbe5d7b677 Keychain support and random fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 19
diff changeset
78 return '{0}B'.format(B)
19
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
79 elif KB <= B < MB:
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
80 return '{0:.2f}KB'.format(B/KB)
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
81 elif MB <= B < GB:
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
82 return '{0:.2f}MB'.format(B/MB)
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
83 elif GB <= B < TB:
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
84 return '{0:.2f}GB'.format(B/GB)
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
85 elif TB <= B:
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
86 return '{0:.2f}TB'.format(B/TB)
f9ce2442f14f Display original/deduplicatd size if no progress percentage available
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
87
97
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
88
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
89 def progress_percentage(done, total, d):
106
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
90 percentage = 100*float(done)/float(total)
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
91 progress=': %d%%' % int(round(percentage))
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
92 if 'operation_no' in d:
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
93 progress=':#%d%s' % (d['operation_no'], progress)
97
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
94 return progress
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
95
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
96 def progress_parts(done, total, d):
106
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
97 progress=': %d/%d' % (int(done), int(total))
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
98 if 'operation_no' in d:
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
99 progress=':#%d%s' % (d['operation_no'], progress)
97
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
100 return progress
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
101
106
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
102 _error_state=(backup.State.INACTIVE, backup.Errors.ERRORS)
97
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
103
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
104 def make_title(status):
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
105 def add_info(info, new):
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
106 if info:
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
107 return "%s; %s" % (info, new)
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
108 else:
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
109 return new
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
110
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
111 info=None
105
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
112 this_refresh_time=None
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
113
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
114 if not status.errors.ok():
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
115 info=add_info(info, str(status.errors))
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
116
98
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
117 if status.state==backup.State.PAUSED:
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
118 info=add_info(info, "paused")
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
119 elif status.state==backup.State.SCHEDULED:
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
120 # Operation scheduled
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
121 when=status.when()
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
122 now=time.time()
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
123
110
a79409c72565 Oops, removed stray reset of menu entry info
Tuomo Valkonen <tuomov@iki.fi>
parents: 106
diff changeset
124 if when==math.inf:
a79409c72565 Oops, removed stray reset of menu entry info
Tuomo Valkonen <tuomov@iki.fi>
parents: 106
diff changeset
125 whenstr='--'
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
126 else:
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
127 tnow=datetime.datetime.fromtimestamp(now)
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
128 twhen=datetime.datetime.fromtimestamp(when)
112
173d9d7048b6 UI time display fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 111
diff changeset
129 tendtoday=tnow.replace(hour=23,minute=59,second=59)
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
130 tendtomorrow=tendtoday+datetime.timedelta(days=1)
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
131
110
a79409c72565 Oops, removed stray reset of menu entry info
Tuomo Valkonen <tuomov@iki.fi>
parents: 106
diff changeset
132 if twhen<tnow:
111
c3bc27cf5ece Changed dreamtime calculation.
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
133 whenstr='overdue' + (' on %s' % twhen.isoformat())
110
a79409c72565 Oops, removed stray reset of menu entry info
Tuomo Valkonen <tuomov@iki.fi>
parents: 106
diff changeset
134 elif twhen>tendtomorrow:
105
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
135 # Display date if scheduled event is after tomorrow
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
136 whenday=datetime.date.fromtimestamp(when)
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
137 whenstr='on %s' % twhen.date().isoformat()
105
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
138 this_refresh_time=tendtoday+datetime.timedelta(seconds=1)
112
173d9d7048b6 UI time display fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 111
diff changeset
139 elif twhen>tendtoday and when-now>=12*60*60: # 12 hours
105
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
140 # Display 'tomorrow' if the scheduled event is tomorrow and
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
141 # not earlier than after 12 hours
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
142 whenstr='tomorrow'
105
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
143 this_refresh_time=twhen-datetime.timedelta(hours=12)
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
144 else:
105
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
145 # Otherwise, display time
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
146 twhen=time.localtime(when)
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
147 if twhen.tm_sec>30:
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
148 # Round up minute display to avoid user confusion
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
149 twhen=time.localtime(when+30)
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
150 whenstr='at %02d:%02d' % (twhen.tm_hour, twhen.tm_min)
38
085a635f23f5 Improved error indicators
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
151
110
a79409c72565 Oops, removed stray reset of menu entry info
Tuomo Valkonen <tuomov@iki.fi>
parents: 106
diff changeset
152 this_info=''
a79409c72565 Oops, removed stray reset of menu entry info
Tuomo Valkonen <tuomov@iki.fi>
parents: 106
diff changeset
153 if 'reason' in status.detail:
a79409c72565 Oops, removed stray reset of menu entry info
Tuomo Valkonen <tuomov@iki.fi>
parents: 106
diff changeset
154 this_info=status.detail['reason'] + ' '
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
155
110
a79409c72565 Oops, removed stray reset of menu entry info
Tuomo Valkonen <tuomov@iki.fi>
parents: 106
diff changeset
156 when_how_sched= "%s%s %s" % (this_info, status.type, whenstr)
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
157
110
a79409c72565 Oops, removed stray reset of menu entry info
Tuomo Valkonen <tuomov@iki.fi>
parents: 106
diff changeset
158 info=add_info(info, when_how_sched)
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
159
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
160 elif status.state==backup.State.QUEUED:
97
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
161 info=add_info(info, "queued %s" % status.type)
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
162 elif status.state==backup.State.ACTIVE:
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
163 # Operation running
14
5a988a2c2624 UI: progress percentange support (Borg doesn't seem to be reporting) + error indicator in tray: B?
Tuomo Valkonen <tuomov@iki.fi>
parents: 11
diff changeset
164 progress=''
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
165 d=status.detail
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
166 if 'progress_current' in d and 'progress_total' in d:
97
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
167 progress=progress_percentage(d['progress_current'],
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
168 d['progress_total'], d)
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
169 elif ('progress_current_secondary' in d and
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
170 'progress_total_secondary' in d):
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
171 progress=progress_parts(d['progress_current_secondary'],
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
172 d['progress_total_secondary'], d)
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
173 elif 'original_size' in d and 'deduplicated_size' in d:
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
174 progress=' %s→%s' % (humanbytes(d['original_size']),
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
175 humanbytes(d['deduplicated_size']))
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
176
97
96d5adbe0205 Pruning support
Tuomo Valkonen <tuomov@iki.fi>
parents: 89
diff changeset
177 howrunning = "running %s%s" % (status.type, progress)
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
178
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
179 info=add_info(info, howrunning)
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
180 else:
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
181 pass
15
aaf1a281a3fe More error reporting
Tuomo Valkonen <tuomov@iki.fi>
parents: 14
diff changeset
182
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
183 if info:
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
184 title=status.name + ' (' + info + ')'
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
185 else:
62
b7d13b2ad67e Turned Status and Operation into classes instead of dictionaries
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
186 title=status.name
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
187
105
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
188 return title, (status.state, status.errors), this_refresh_time
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
189
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
190 class EventTrackingTimer(rumps.Timer):
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
191 """
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
192 Variant of rumps.Timer changed to
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
193 a) use *both* NSEventTrackingRunLoopMode (for when menu open) and
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
194 NSDefaultRunLoopMode (for when menu closed),
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
195 b) in the mainRunLoop, to allow creating timers there from other threads.
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
196 """
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
197 def start(self):
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
198 """Start the timer thread loop."""
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
199 if not self._status:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
200 self._nsdate = NSDate.date()
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
201 self._nstimer = NSTimer.alloc().initWithFireDate_interval_target_selector_userInfo_repeats_(
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
202 self._nsdate, self._interval, self, 'callback:', None, True)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
203 NSRunLoop.mainRunLoop().addTimer_forMode_(self._nstimer, NSEventTrackingRunLoopMode)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
204 NSRunLoop.mainRunLoop().addTimer_forMode_(self._nstimer, NSDefaultRunLoopMode)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
205 #rumps._TIMERS[self] = None
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
206 self._status = True
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
207
1
4cdc9c1f6b28 basic scheduler structure draft, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
208 class BorgendTray(rumps.App):
33
91421eeb4426 Use rumps.application_support instead of xdg paths. Also separated branding into config.py
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
209 def __init__(self, backups):
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
210 self.lock=Lock()
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
211 self.backups=backups
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
212 self.refresh_timer=EventTrackingTimer(self.__refresh_callback, refresh_interval)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
213 self.updated_recently=False
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
214 self.statuses=[None]*len(backups)
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
215
76
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
216 for index in range(len(backups)):
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
217 self.statuses[index]=backups[index].status()
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
218
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
219 itemlist, title=self.build_menu_and_timer()
76
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
220
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
221 super().__init__(title, menu=itemlist, quit_button=None)
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
222
76
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
223 for index in range(len(backups)):
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
224 # Python closures suck dog's balls; hence the _index=index hack
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
225 # See also http://math.andrej.com/2009/04/09/pythons-lambda-is-broken/
87
a214d475aa28 Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents: 86
diff changeset
226 cb=(lambda status, errorlog=None, _index=index:
a214d475aa28 Better recovery from errors; fixes to potential race conditions in scheduler and repository queue
Tuomo Valkonen <tuomov@iki.fi>
parents: 86
diff changeset
227 self.__status_callback(_index, status, errorlog=errorlog))
76
4b08fca3ce34 Dreamtime scheduling: discount system sleep periods
Tuomo Valkonen <tuomov@iki.fi>
parents: 75
diff changeset
228 backups[index].set_status_update_callback(cb)
9
aa121291eb0e Rumps/Mac UI stuff is fucked and disables ^C etc.; threading doesn't help
Tuomo Valkonen <tuomov@iki.fi>
parents: 1
diff changeset
229
101
3068b0de12ee Part 2 of handling macOS sleep/wake signal brokenness.
Tuomo Valkonen <tuomov@iki.fi>
parents: 99
diff changeset
230 dreamtime.add_callback(self, self.__sleepwake_callback)
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
231
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
232 def __rebuild_menu(self, update):
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
233 if not update:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
234 self.itemlist=[]
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
235
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
236 itemlist=self.itemlist
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
237
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
238 state=(backup.State.INACTIVE, backup.Errors.OK)
105
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
239 refresh_time=None
98
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
240 all_paused=True
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
241
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
242 for index in range(len(self.backups)):
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
243 b=self.backups[index]
105
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
244 title, this_state, this_refresh_time=make_title(self.statuses[index])
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
245 # Python closures suck dog's balls...
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
246 # first and the last program I write in Python until somebody
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
247 # fixes this brain damage
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
248 cbm=lambda sender, _b=b: self.__menu_select_backup(sender, _b)
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
249 itemstate=0
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
250 if not this_state[1].ok():
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
251 itemstate=-1
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
252 elif this_state[0]==backup.State.SCHEDULED or this_state[0]==backup.State.QUEUED:
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
253 itemstate=1
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
254
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
255 if update:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
256 item=itemlist[index]
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
257 if item.title!=title:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
258 item.title=title
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
259 if item.state!=itemstate:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
260 item.state=itemstate
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
261 else:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
262 item=rumps.MenuItem(title, callback=cbm)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
263 item.state=itemstate
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
264 itemlist.append(item)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
265
61
bc6c3d74e6ea Made combination error-state into an error-state matrix, as well as Enum
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
266 state=combine_state(state, this_state)
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
267
98
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
268 all_paused=(all_paused and this_state[0]==backup.State.PAUSED)
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
269
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
270 # Do we have to automatically update menu display?
105
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
271 if not refresh_time:
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
272 refresh_time=this_refresh_time
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
273 elif this_refresh_time:
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
274 refresh_time=min(refresh_time, this_refresh_time)
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
275
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
276 index = len(self.backups)
98
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
277 if all_paused:
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
278 pausename='Resume all'
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
279 else:
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
280 pausename="Pause all"
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
281 if update:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
282 item=itemlist[index]
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
283 if item.title!=pausename:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
284 item.title=pausename
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
285 else:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
286 menu_pause=rumps.MenuItem(pausename, callback=lambda _: self.pause_resume_all())
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
287 itemlist.append(menu_pause)
98
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
288
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
289 if not update:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
290 menu_log=rumps.MenuItem("Show log", callback=lambda _: showlog())
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
291 itemlist.append(menu_log)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
292 if not settings['no_quit_menu_entry']:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
293 menu_quit=rumps.MenuItem("Quit...", callback=lambda _: self.quit())
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
294 itemlist.append(menu_quit)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
295
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
296 return itemlist, state, refresh_time
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
297
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
298 def build_menu_and_timer(self, update=False):
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
299 logger.debug('Rebuilding menu')
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
300 itemlist, state, refresh_time=self.__rebuild_menu(update)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
301 title=trayname(state)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
302
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
303 if update and self.title!=title:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
304 logger.debug("set title %s" % title)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
305 self.title=title
105
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
306
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
307 if not self.updated_recently and not refresh_time:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
308 self.refresh_timer.stop()
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
309 elif self.updated_recently:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
310 self.updated_recently=False
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
311 if self.refresh_timer.interval>refresh_interval:
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
312 self.refresh_timer.stop()
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
313 self.refresh_timer.interval=refresh_interval
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
314 self.refresh_timer.start()
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
315 else:
105
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
316 # Need to time a refresh due to content display changing,
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
317 # e.g., 'tomorrow' changing to a more specific hour.
55043f86c0b5 Various tray menu fixes
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
318 when=time.mktime(refresh_time.timetuple())
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
319 delay=max(when-time.time(), refresh_interval)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
320 logger.debug('Timing menu refresh in %s seconds' % delay)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
321 self.refresh_timer.stop()
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
322 self.refresh_timer.interval=delay
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
323 self.refresh_timer.start()
72
e0e6043779e2 Improved time display in menu
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
324
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
325 return itemlist, title
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
326
141
a1c97bc1789e Sleep wake callback hadn't been updated to menu refresh code changes. Fixed.
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
327 def __schedule_refresh(self):
a1c97bc1789e Sleep wake callback hadn't been updated to menu refresh code changes. Fixed.
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
328 self.updated_recently=True
a1c97bc1789e Sleep wake callback hadn't been updated to menu refresh code changes. Fixed.
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
329 # Time the refresh if it has not been timed, or if the timer
a1c97bc1789e Sleep wake callback hadn't been updated to menu refresh code changes. Fixed.
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
330 # is timing for the "long-term" (refresh_timer_time set)
a1c97bc1789e Sleep wake callback hadn't been updated to menu refresh code changes. Fixed.
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
331 if self.refresh_timer.interval>refresh_interval:
a1c97bc1789e Sleep wake callback hadn't been updated to menu refresh code changes. Fixed.
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
332 self.refresh_timer.stop()
a1c97bc1789e Sleep wake callback hadn't been updated to menu refresh code changes. Fixed.
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
333 self.refresh_timer.interval=refresh_interval
a1c97bc1789e Sleep wake callback hadn't been updated to menu refresh code changes. Fixed.
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
334 self.refresh_timer.start()
a1c97bc1789e Sleep wake callback hadn't been updated to menu refresh code changes. Fixed.
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
335
106
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
336 # Callbacks -- exception-protected to get any indications of errors
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
337 @protect_noreturn
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
338 def __refresh_callback(self, timer):
27
a347387868be UI refresh delay to reduce flicker
Tuomo Valkonen <tuomov@iki.fi>
parents: 21
diff changeset
339 with self.lock:
133
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
340 self.build_menu_and_timer(True)
ec8014a2ee7a Need to time menu updates using Apple's frameworks to avoid segfaults.
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
341
106
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
342 @protect_noreturn
55
407af23d16bb Improved backup main thread loop, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 51
diff changeset
343 def __status_callback(self, index, status, errorlog=None):
75
2a44b9649212 UI refresh fix; added debug messages
Tuomo Valkonen <tuomov@iki.fi>
parents: 72
diff changeset
344 logger.debug("Tray status callback")
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
345 with self.lock:
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
346 self.statuses[index]=status
141
a1c97bc1789e Sleep wake callback hadn't been updated to menu refresh code changes. Fixed.
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
347 self.__schedule_refresh()
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
348
114
ad9fb3dd9fec Disable Notification Centre notifications.
Tuomo Valkonen <tuomov@iki.fi>
parents: 112
diff changeset
349 # if errorlog:
ad9fb3dd9fec Disable Notification Centre notifications.
Tuomo Valkonen <tuomov@iki.fi>
parents: 112
diff changeset
350 # if 'msgid' not in errorlog or not isinstance(errorlog['msgid'], str):
ad9fb3dd9fec Disable Notification Centre notifications.
Tuomo Valkonen <tuomov@iki.fi>
parents: 112
diff changeset
351 # msgid='UnknownError'
ad9fb3dd9fec Disable Notification Centre notifications.
Tuomo Valkonen <tuomov@iki.fi>
parents: 112
diff changeset
352 # else:
ad9fb3dd9fec Disable Notification Centre notifications.
Tuomo Valkonen <tuomov@iki.fi>
parents: 112
diff changeset
353 # msgid=errorlog['msgid']
21
c36e549a7f12 Errors as rumps notifications
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
354
114
ad9fb3dd9fec Disable Notification Centre notifications.
Tuomo Valkonen <tuomov@iki.fi>
parents: 112
diff changeset
355 # logger.debug("Opening notification for error %s '%s'",
ad9fb3dd9fec Disable Notification Centre notifications.
Tuomo Valkonen <tuomov@iki.fi>
parents: 112
diff changeset
356 # msgid, errorlog['message'])
21
c36e549a7f12 Errors as rumps notifications
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
357
114
ad9fb3dd9fec Disable Notification Centre notifications.
Tuomo Valkonen <tuomov@iki.fi>
parents: 112
diff changeset
358 # notification_workaround(branding.appname_stylised,
ad9fb3dd9fec Disable Notification Centre notifications.
Tuomo Valkonen <tuomov@iki.fi>
parents: 112
diff changeset
359 # msgid, errorlog['message'])
21
c36e549a7f12 Errors as rumps notifications
Tuomo Valkonen <tuomov@iki.fi>
parents: 20
diff changeset
360
106
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
361 @protect_noreturn
98
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
362 def pause_resume_all(self):
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
363 with self.lock:
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
364 try:
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
365 all_paused=True
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
366 for b in self.backups:
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
367 all_paused=all_paused and b.is_paused()
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
368 if all_paused:
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
369 logger.debug('Pausing all')
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
370 for b in self.backups:
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
371 b.resume()
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
372 else:
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
373 logger.debug('Resuming all')
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
374 for b in self.backups:
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
375 b.pause()
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
376 except:
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
377 logger.exception("Pause/resume error")
9052e427ea39 Added pause feature
Tuomo Valkonen <tuomov@iki.fi>
parents: 97
diff changeset
378
106
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
379 @protect_noreturn
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
380 def __sleepwake_callback(self, woke):
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
381 if woke:
141
a1c97bc1789e Sleep wake callback hadn't been updated to menu refresh code changes. Fixed.
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
382 with self.lock:
a1c97bc1789e Sleep wake callback hadn't been updated to menu refresh code changes. Fixed.
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
383 self.__schedule_refresh()
106
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
384
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
385 @protect_noreturn
46
ecb41072a1b7 Unsuccesfull attempts at clean quit on exceptions that fall through
Tuomo Valkonen <tuomov@iki.fi>
parents: 45
diff changeset
386 def quit(self):
28
a7c56424e867 Reorder
Tuomo Valkonen <tuomov@iki.fi>
parents: 27
diff changeset
387 rumps.quit_application()
a7c56424e867 Reorder
Tuomo Valkonen <tuomov@iki.fi>
parents: 27
diff changeset
388
106
a7bdc239ef62 Added exeption protection decorators to callbacks.
Tuomo Valkonen <tuomov@iki.fi>
parents: 105
diff changeset
389 @protect_noreturn
28
a7c56424e867 Reorder
Tuomo Valkonen <tuomov@iki.fi>
parents: 27
diff changeset
390 def __menu_select_backup(self, sender, b):
a7c56424e867 Reorder
Tuomo Valkonen <tuomov@iki.fi>
parents: 27
diff changeset
391 #sender.state=not sender.state
31
b4b4bb7a2ec5 More logging detail
Tuomo Valkonen <tuomov@iki.fi>
parents: 30
diff changeset
392 logger.debug("Manually backup '%s'", b.name)
32
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
393 try:
49
db33dfa64ad6 Improved scheduler
Tuomo Valkonen <tuomov@iki.fi>
parents: 46
diff changeset
394 b.create()
32
06fc14211ba9 Error handling improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 31
diff changeset
395 except Exception as err:
50
2d8947351727 Logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 49
diff changeset
396 logger.exception("Failure to initialise backup")
79
b075b3db3044 Cleaned up module organisation to simplify borgend.py and not have to import it in other modules.
Tuomo Valkonen <tuomov@iki.fi>
parents: 78
diff changeset
397 notification_workaround(branding.appname_stylised,
33
91421eeb4426 Use rumps.application_support instead of xdg paths. Also separated branding into config.py
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
398 err.__class__.__name__, str(err))
28
a7c56424e867 Reorder
Tuomo Valkonen <tuomov@iki.fi>
parents: 27
diff changeset
399
42
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
400 #
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
401 # Log window
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
402 #
10
76dbfb06eba0 Semi-working menu items.
Tuomo Valkonen <tuomov@iki.fi>
parents: 9
diff changeset
403
42
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
404 logwindow=[None]
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
405 logwindow_lock=Lock()
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
406
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
407 def showlog():
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
408 try:
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
409 w=None
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
410 with logwindow_lock:
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
411 if not logwindow[0]:
84
b613265bd679 A few things had not been updated to module reorganisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 80
diff changeset
412 lines=loggers.fifo.formatAll()
34
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
413 msg="\n".join(lines[0:])
84
b613265bd679 A few things had not been updated to module reorganisation
Tuomo Valkonen <tuomov@iki.fi>
parents: 80
diff changeset
414 w=rumps.Window(title=branding.appname_stylised+' log',
42
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
415 default_text=msg,
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
416 ok='Close',
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
417 dimensions=(640,320))
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
418 logwindow[0]=w
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
419 if w:
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
420 try:
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
421 w.run()
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
422 finally:
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
423 with logwindow_lock:
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
424 logwindow[0]=None
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
425 except Exception as err:
50
2d8947351727 Logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 49
diff changeset
426 logger.exception("Failed to display log")
34
9fce700d42de Log window and other logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
427
42
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
428 #
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
429 # Notification click response => show log window
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
430 #
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
431
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
432 @rumps.notifications
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
433 def notification_center(_):
00accd11978b Moved logwindow dispay out of BorgendTray, and made notification_center
Tuomo Valkonen <tuomov@iki.fi>
parents: 40
diff changeset
434 showlog()
50
2d8947351727 Logging improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 49
diff changeset
435

mercurial