diff --git a/qui/clipboard.py b/qui/clipboard.py index e4126159..50589202 100644 --- a/qui/clipboard.py +++ b/qui/clipboard.py @@ -351,11 +351,13 @@ def show_menu(self, _unused, event): def update_clipboard_contents(self, vm=None, size=0, message=None, icon=None): if not vm or not size: + self.clear_menu_item.set_sensitive(False) self.clipboard_label.set_markup(_("Global clipboard is empty")) self.icon.set_from_icon_name("qui-clipboard") # todo the icon should be empty and full depending on state else: + self.clear_menu_item.set_sensitive(True) self.clipboard_label.set_markup( _("Global clipboard contents: {0} from {1}").format( size, vm @@ -387,7 +389,6 @@ def setup_ui(self, *_args, **_kwargs): clipboard_content_item = Gtk.MenuItem() clipboard_content_item.set_sensitive(False) clipboard_content_item.add(self.clipboard_label) - self.update_clipboard_contents() self.menu.append(clipboard_content_item) self.menu.append(Gtk.SeparatorMenuItem()) @@ -406,6 +407,11 @@ def setup_ui(self, *_args, **_kwargs): self.menu.append(Gtk.SeparatorMenuItem()) + self.clear_menu_item = Gtk.MenuItem(_("Clear global clipboard")) + self.clear_menu_item.connect("activate", self.clear_clipboard) + self.menu.append(self.clear_menu_item) + self.update_clipboard_contents() + dom0_item = Gtk.MenuItem(_("Copy dom0 clipboard")) dom0_item.connect("activate", self.copy_dom0_clipboard) self.menu.append(dom0_item) @@ -447,6 +453,9 @@ def copy_dom0_clipboard(self, *_args, **_kwargs): buffer_size="256000", ) ) + self.update_clipboard_contents( + "dom0", "{} bytes".format(os.path.getsize(DATA)) + ) except Exception: # pylint: disable=broad-except self.send_notify( _("Error while accessing global clipboard!"), @@ -478,6 +487,41 @@ def _convert_to_readable(key: str): return key.upper() return key + def clear_clipboard(self, *_args, **_kwargs): + try: + with appviewer_lock(): + with open(DATA, "w", encoding="utf-8") as contents: + contents.truncate(0) + with open(FROM, "w", encoding="ascii") as source: + source.write("dom0") + with open(XEVENT, "w", encoding="ascii") as timestamp: + timestamp.write(str(Gtk.get_current_event_time())) + with open(METADATA, "w", encoding="ascii") as metadata: + metadata.write( + "{{\n" + '"vmname":"dom0",\n' + '"xevent_timestamp":{xevent_timestamp},\n' + '"successful":1,\n' + '"cleared":1,\n' + '"copy_action":0,\n' + '"paste_action":0,\n' + '"malformed_request":0,\n' + '"qrexec_clipboard":0,\n' + '"sent_size":0,\n' + '"buffer_size":{buffer_size},\n' + '"protocol_version_xside":65544,\n' + '"protocol_version_vmside":65544,\n' + "}}\n".format( + xevent_timestamp=str(Gtk.get_current_event_time()), + buffer_size="256000", + ) + ) + self.update_clipboard_contents( + vm=None, size=0, message=("Global clipboard cleared") + ) + except Exception: # pylint: disable=broad-except + self.send_notify(_("Error while clearing global clipboard!")) + def main(): loop = asyncio.get_event_loop()