From 5f1191148eb4a968db235d4647b0da070c980f30 Mon Sep 17 00:00:00 2001 From: Qubasa Date: Fri, 1 Mar 2024 01:58:03 +0700 Subject: [PATCH] clan_vm_manager: Fix GLib.idle_add rexecuting the VM push multiple times because of missing GLib.SOURCE_REMOVE --- .../clan_vm_manager/models/gkvstore.py | 17 ++++++++++------- .../clan_vm_manager/models/use_join.py | 2 +- .../clan_vm_manager/windows/main_window.py | 10 ++++++++-- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/pkgs/clan-vm-manager/clan_vm_manager/models/gkvstore.py b/pkgs/clan-vm-manager/clan_vm_manager/models/gkvstore.py index da4566a3..143690d3 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/models/gkvstore.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/models/gkvstore.py @@ -136,15 +136,18 @@ class GKVStore(GObject.GObject, Gio.ListModel, Generic[K, V]): # O(1) operation if the key does not exist, O(n) if it does def __setitem__(self, key: K, value: V) -> None: # If the key already exists, remove it O(n) + # TODO: We have to check if updating an existing key is working correctly if key in self._items: log.warning("Updating an existing key in GKVStore is O(n)") - del self[key] - - # Add the new key-value pair - self._items[key] = value - self._items.move_to_end(key) - position = len(self._items) - 1 - self.items_changed(position, 0, 1) + position = self.keys().index(key) + self._items[key] = value + self.items_changed(position, 0, 1) + else: + # Add the new key-value pair + position = max(len(self._items) - 1, 0) + self._items[key] = value + self._items.move_to_end(key) + self.items_changed(position, 0, 1) # O(n) operation def __delitem__(self, key: K) -> None: diff --git a/pkgs/clan-vm-manager/clan_vm_manager/models/use_join.py b/pkgs/clan-vm-manager/clan_vm_manager/models/use_join.py index 3a3cf2e1..ad9ca8be 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/models/use_join.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/models/use_join.py @@ -35,7 +35,7 @@ class JoinValue(GObject.Object): def __join(self) -> None: add_history(self.url, all_machines=False) - GLib.idle_add(lambda: self.emit("join_finished", self)) + GLib.idle_add(self.emit, "join_finished", self) def join(self) -> None: threading.Thread(target=self.__join).start() diff --git a/pkgs/clan-vm-manager/clan_vm_manager/windows/main_window.py b/pkgs/clan-vm-manager/clan_vm_manager/windows/main_window.py index 35061b16..80b63e1a 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/windows/main_window.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/windows/main_window.py @@ -1,5 +1,5 @@ +import logging import threading -import time from pathlib import Path from typing import Any @@ -19,6 +19,8 @@ from gi.repository import Adw, Gio, GLib, Gtk from ..trayicon import TrayIcon +log = logging.getLogger(__name__) + class MainWindow(Adw.ApplicationWindow): def __init__(self, config: ClanConfig) -> None: @@ -59,6 +61,10 @@ class MainWindow(Adw.ApplicationWindow): self.connect("destroy", self.on_destroy) + def push_vm(self, vm: VM) -> bool: + VMs.use().push(vm) + return GLib.SOURCE_REMOVE + def _populate_vms(self) -> None: # Execute `clan flakes add ` to democlan for this to work # TODO: Make list_history a generator function @@ -72,7 +78,7 @@ class MainWindow(Adw.ApplicationWindow): icon=Path(icon), data=entry, ) - GLib.idle_add(lambda: VMs.use().push(vm)) + GLib.idle_add(self.push_vm, vm) def on_destroy(self, *_args: Any) -> None: self.tray_icon.destroy()