diff --git a/xpra/client/gl/window.py b/xpra/client/gl/window.py index 02a4c47e42..85bb5956c0 100755 --- a/xpra/client/gl/window.py +++ b/xpra/client/gl/window.py @@ -13,7 +13,7 @@ from xpra.scripts.config import FALSE_OPTIONS from xpra.util.types import AtomicInteger, typedict from xpra.util.env import envint -from xpra.os_util import WIN32, OSX, load_binary_file +from xpra.os_util import WIN32, OSX, load_binary_file, gi_import from xpra.log import Logger from xpra.platform.paths import get_icon_filename from xpra.client.gui.fake_client import FakeClient @@ -164,9 +164,8 @@ def draw(): if show: widget.show() window.show() - import gi - gi.require_version("Gtk", "3.0") # @UndefinedVariable - from gi.repository import Gtk, GLib # @UnresolvedImport + Gtk = gi_import("Gtk") # @UndefinedVariable + GLib = gi_import("GLib") def window_close_event(*_args): Gtk.main_quit() diff --git a/xpra/client/gtk3/client.py b/xpra/client/gtk3/client.py index 916a2b18a7..6c3681d8d4 100644 --- a/xpra/client/gtk3/client.py +++ b/xpra/client/gtk3/client.py @@ -5,16 +5,16 @@ import os -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -from gi.repository import GObject, Gdk - -from xpra.os_util import OSX, POSIX, is_Wayland +from xpra.os_util import OSX, POSIX, is_Wayland, gi_import from xpra.client.gtk3.client_base import GTKXpraClient from xpra.client.gtk3.window import ClientWindow from xpra.platform.gui import get_xdpi, get_ydpi +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GObject = gi_import("GObject") + + class XpraClient(GTKXpraClient): ClientWindowClass = ClientWindow diff --git a/xpra/client/gtk3/client_base.py b/xpra/client/gtk3/client_base.py index 99c2893624..791686ddb9 100644 --- a/xpra/client/gtk3/client_base.py +++ b/xpra/client/gtk3/client_base.py @@ -11,10 +11,6 @@ from subprocess import Popen, PIPE from threading import Event from typing import Any -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, Gdk, GdkPixbuf # @UnresolvedImport from xpra.util.types import typedict from xpra.util.str_fn import csv, ellipsizer, repr_ellipsized, pver @@ -22,6 +18,7 @@ from xpra.os_util import ( bytestostr, strtobytes, memoryview_to_bytes, hexstr, load_binary_file, osexpand, + gi_import, WIN32, OSX, POSIX, is_Wayland, first_time, ) from xpra.net.common import PacketType @@ -64,6 +61,10 @@ grablog = Logger("client", "grab") focuslog = Logger("client", "focus") +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GdkPixbuf = gi_import("GdkPixbuf") + missing_cursor_names = set() METADATA_SUPPORTED = os.environ.get("XPRA_METADATA_SUPPORTED") diff --git a/xpra/client/gtk3/keyboard_helper.py b/xpra/client/gtk3/keyboard_helper.py index 5730f363b8..60753fd06d 100644 --- a/xpra/client/gtk3/keyboard_helper.py +++ b/xpra/client/gtk3/keyboard_helper.py @@ -5,13 +5,12 @@ # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. -import gi -gi.require_version('Gdk', '3.0') # @UndefinedVariable -from gi.repository import GLib, Gdk # @UnresolvedImport - from xpra.client.gui.keyboard_helper import KeyboardHelper, log from xpra.gtk.keymap import get_gtk_keymap -from xpra.os_util import is_X11 +from xpra.os_util import is_X11, gi_import + +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") class GTKKeyboardHelper(KeyboardHelper): diff --git a/xpra/client/gtk3/launcher.py b/xpra/client/gtk3/launcher.py index 7d82dc575e..43d7fc22c4 100755 --- a/xpra/client/gtk3/launcher.py +++ b/xpra/client/gtk3/launcher.py @@ -17,14 +17,6 @@ import sys import traceback -import gi - - -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("GdkPixbuf", "2.0") # @UndefinedVariable -# @UnresolvedImport pylint: disable=wrong-import-position -from gi.repository import GLib, Gtk, GdkPixbuf # @UnresolvedImport - from xpra.scripts.config import read_config, make_defaults_struct, validate_config, save_config from xpra.gtk.signals import register_os_signals from xpra.gtk.util import IgnoreWarningsContext @@ -32,7 +24,7 @@ from xpra.gtk.widget import scaled_image, imagebutton, label, choose_file, modify_fg, color_parse from xpra.gtk.pixbuf import get_icon_pixbuf from xpra.util.str_fn import csv, repr_ellipsized -from xpra.os_util import WIN32, OSX +from xpra.os_util import WIN32, OSX, gi_import from xpra.net.common import DEFAULT_PORT from xpra.util.thread import start_thread from xpra.gtk.dialogs.about import about @@ -47,6 +39,10 @@ log = Logger("launcher") +Gtk = gi_import("Gtk") +GdkPixbuf = gi_import("GdkPixbuf") +GLib = gi_import("GLib") + MODE_NESTED_SSH = "ssh -> ssh" MODE_SSH = "ssh" MODE_TCP = "tcp" diff --git a/xpra/client/gtk3/menu_helper.py b/xpra/client/gtk3/menu_helper.py index 24b75df07a..c5428cf392 100644 --- a/xpra/client/gtk3/menu_helper.py +++ b/xpra/client/gtk3/menu_helper.py @@ -7,14 +7,9 @@ import re from collections.abc import Callable -import gi -gi.require_version('Gtk', '3.0') # @UndefinedVariable -gi.require_version("GdkPixbuf", "2.0") # @UndefinedVariable -from gi.repository import Gtk, GdkPixbuf # @UnresolvedImport - from xpra.util.str_fn import repr_ellipsized from xpra.util.env import envbool -from xpra.os_util import OSX, bytestostr +from xpra.os_util import OSX, bytestostr, gi_import from xpra.codecs.icon_util import INKSCAPE_RE from xpra.gtk.widget import scaled_image, menuitem from xpra.gtk.util import IgnoreWarningsContext @@ -26,6 +21,9 @@ log = Logger("menu") +Gtk = gi_import("Gtk") +GdkPixbuf = gi_import("GdkPixbuf") + MENU_ICONS = envbool("XPRA_MENU_ICONS", True) HIDE_DISABLED_MENU_ENTRIES = envbool("XPRA_HIDE_DISABLED_MENU_ENTRIES", False) diff --git a/xpra/client/gtk3/statusicon_tray.py b/xpra/client/gtk3/statusicon_tray.py index ae73d406d9..01a1138f5d 100644 --- a/xpra/client/gtk3/statusicon_tray.py +++ b/xpra/client/gtk3/statusicon_tray.py @@ -8,18 +8,17 @@ import os from time import time, monotonic -import gi -gi.require_version('Gdk', '3.0') # @UndefinedVariable -gi.require_version('Gtk', '3.0') # @UndefinedVariable -gi.require_version("GdkPixbuf", "2.0") # @UndefinedVariable -from gi.repository import Gtk, Gdk, GdkPixbuf # @UnresolvedImport -from xpra.os_util import WIN32, OSX, POSIX +from xpra.os_util import WIN32, OSX, POSIX, gi_import from xpra.util.env import envbool from xpra.client.gui.tray_base import TrayBase, log from xpra.gtk.util import get_default_root_window from xpra.gtk.pixbuf import get_icon_from_file, get_pixbuf_from_data +Gdk = gi_import("Gdk") +Gtk = gi_import("Gtk") +GdkPixbuf = gi_import("GdkPixbuf") + ORIENTATION = { Gtk.Orientation.HORIZONTAL : "HORIZONTAL", Gtk.Orientation.VERTICAL : "VERTICAL", diff --git a/xpra/client/gtk3/window.py b/xpra/client/gtk3/window.py index 450030019e..6860a6210e 100644 --- a/xpra/client/gtk3/window.py +++ b/xpra/client/gtk3/window.py @@ -5,12 +5,6 @@ # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. -import gi -gi.require_version("Gtk", "3.0") -gi.require_version("Gdk", "3.0") -gi.require_version("GdkPixbuf", "2.0") -from gi.repository import GObject, Gdk, Gtk, Gio, GdkPixbuf # @UnresolvedImport - from xpra.client.gtk3.window_base import GTKClientWindowBase, HAS_X11_BINDINGS from xpra.client.gtk3.window_menu import WindowMenuHelper from xpra.gtk.widget import scaled_image @@ -18,23 +12,28 @@ from xpra.scripts.config import TRUE_OPTIONS, FALSE_OPTIONS from xpra.util.types import typedict from xpra.util.env import envbool -from xpra.os_util import bytestostr, is_gnome +from xpra.os_util import bytestostr, is_gnome, gi_import from xpra.log import Logger paintlog = Logger("paint") metalog = Logger("metadata") geomlog = Logger("geometry") +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GdkPixbuf = gi_import("GdkPixbuf") +GObject = gi_import("GObject") +Gio = gi_import("Gio") WINDOW_ICON = envbool("XPRA_WINDOW_ICON", True) WINDOW_XPRA_MENU = envbool("XPRA_WINDOW_XPRA_MENU", is_gnome()) WINDOW_MENU = envbool("XPRA_WINDOW_MENU", True) -""" -GTK3 version of the ClientWindow class -""" class ClientWindow(GTKClientWindowBase): + """ + GTK3 version of the ClientWindow class + """ def init_window(self, metadata:typedict): super().init_window(metadata) @@ -226,4 +225,5 @@ def draw_widget(self, widget, context) -> bool: self.paint_spinner(context) return True + GObject.type_register(ClientWindow) diff --git a/xpra/client/mixins/tray.py b/xpra/client/mixins/tray.py index bbf4ff0ae3..615cc412b4 100644 --- a/xpra/client/mixins/tray.py +++ b/xpra/client/mixins/tray.py @@ -2,7 +2,7 @@ # Copyright (C) 2010-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. -#pylint: disable-msg=E1101 +# pylint: disable-msg=E1101 from gi.repository import GLib diff --git a/xpra/codecs/gstreamer/encoder.py b/xpra/codecs/gstreamer/encoder.py index 6a9cf88045..df6eed6b6e 100755 --- a/xpra/codecs/gstreamer/encoder.py +++ b/xpra/codecs/gstreamer/encoder.py @@ -28,7 +28,7 @@ from xpra.codecs.image import ImageWrapper from xpra.log import Logger -GObject = gi_import("GObject", "2.0") +GObject = gi_import("GObject") Gst = import_gst() log = Logger("encoder", "gstreamer") diff --git a/xpra/codecs/icon_util.py b/xpra/codecs/icon_util.py index 8d4988d47f..f563dd98bf 100755 --- a/xpra/codecs/icon_util.py +++ b/xpra/codecs/icon_util.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # This file is part of Xpra. -# Copyright (C) 2018-2022 Antoine Martin +# Copyright (C) 2018-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. @@ -14,7 +14,7 @@ from xpra.util.str_fn import ellipsizer from xpra.util.env import envint, envbool -from xpra.os_util import load_binary_file, first_time +from xpra.os_util import load_binary_file, first_time, gi_import from xpra.log import Logger log = Logger("menu") @@ -32,10 +32,8 @@ def load_Rsvg(): global _Rsvg if _Rsvg is None: - import gi #pylint: disable=import-outside-toplevel try: - gi.require_version('Rsvg', '2.0') # @UndefinedVariable - from gi.repository import Rsvg # pylint: disable=import-outside-toplevel @UnresolvedImport + Rsvg = gi_import("Rsvg") log("load_Rsvg() Rsvg=%s", Rsvg) _Rsvg = Rsvg except (ValueError, ImportError) as e: diff --git a/xpra/gstreamer/common.py b/xpra/gstreamer/common.py index 3b1937c6c8..d65942c7e4 100755 --- a/xpra/gstreamer/common.py +++ b/xpra/gstreamer/common.py @@ -42,7 +42,7 @@ def import_gst() -> ModuleType | None: {k:v for k,v in os.environ.items() if (k.startswith("GST") or k.startswith("GI") or k=="PATH")}) log("GStreamer 1.x sys.path=%s", csv(sys.path)) try: - Gst = gi_import("Gst", "1.0") + Gst = gi_import("Gst") log("Gst=%s", Gst) Gst.init(None) except Exception as e: diff --git a/xpra/gstreamer/pipeline.py b/xpra/gstreamer/pipeline.py index 7d4cfec275..9b9deabdc4 100644 --- a/xpra/gstreamer/pipeline.py +++ b/xpra/gstreamer/pipeline.py @@ -24,8 +24,8 @@ Gst : ModuleType = import_gst() if not Gst: raise ImportError("GStreamer bindings not found") -GLib = gi_import("GLib", "2.0") -GObject = gi_import("GObject", "2.0") +GLib = gi_import("GLib") +GObject = gi_import("GObject") class Pipeline(GObject.GObject): diff --git a/xpra/gtk/__init__.py b/xpra/gtk/__init__.py index ad7b33cd69..587ffe0e38 100644 --- a/xpra/gtk/__init__.py +++ b/xpra/gtk/__init__.py @@ -3,8 +3,8 @@ # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. -import gi -gi.require_version("Gdk", "3.0") # @UndefinedVariable -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Pango", "1.0") # @UndefinedVariable -gi.require_version("GdkPixbuf", "2.0") # @UndefinedVariable +from xpra.os_util import gi_import +gi_import("Gdk") +gi_import("Gtk") +gi_import("Pango") +gi_import("GdkPixbuf") diff --git a/xpra/gtk/clipboard.py b/xpra/gtk/clipboard.py index c15e17120f..3e4377f639 100644 --- a/xpra/gtk/clipboard.py +++ b/xpra/gtk/clipboard.py @@ -1,23 +1,23 @@ # This file is part of Xpra. -# Copyright (C) 2019-2021 Antoine Martin +# Copyright (C) 2019-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. from time import monotonic -import gi -gi.require_version('Gdk', '3.0') # @UndefinedVariable -gi.require_version('Gtk', '3.0') # @UndefinedVariable -from gi.repository import GObject, Gtk, Gdk # @UnresolvedImport from xpra.gtk.gobject import n_arg_signal, one_arg_signal from xpra.clipboard.core import ( ClipboardProxyCore, TEXT_TARGETS, ) from xpra.clipboard.timeout import ClipboardTimeoutHelper +from xpra.os_util import gi_import from xpra.util.str_fn import ellipsizer from xpra.util.env import envint from xpra.log import Logger +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GObject = gi_import("GObject") log = Logger("clipboard") diff --git a/xpra/gtk/configure/features.py b/xpra/gtk/configure/features.py index 2a67ebad4b..04f1f1b5d8 100644 --- a/xpra/gtk/configure/features.py +++ b/xpra/gtk/configure/features.py @@ -3,14 +3,12 @@ # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. -import gi - from xpra.gtk.dialogs.base_gui_window import BaseGUIWindow from xpra.gtk.widget import label +from xpra.os_util import gi_import from xpra.log import Logger -gi.require_version('Gtk', '3.0') -from gi.repository import Gtk +Gtk = gi_import("Gtk") log = Logger("util") diff --git a/xpra/gtk/configure/gstreamer.py b/xpra/gtk/configure/gstreamer.py index 46438a2f5b..95e5347ff2 100644 --- a/xpra/gtk/configure/gstreamer.py +++ b/xpra/gtk/configure/gstreamer.py @@ -8,15 +8,14 @@ from subprocess import Popen, PIPE, check_call from xpra.util.types import AtomicInteger -from xpra.os_util import is_X11, is_gnome, OSX, WIN32, POSIX +from xpra.os_util import is_X11, is_gnome, gi_import, OSX, WIN32, POSIX from xpra.gtk.dialogs.base_gui_window import BaseGUIWindow from xpra.gtk.widget import label, slabel, title_box from xpra.platform.paths import get_image from xpra.log import Logger -import gi -gi.require_version('Gtk', '3.0') -from gi.repository import Gtk, GLib +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") log = Logger("gstreamer", "util") diff --git a/xpra/gtk/configure/main.py b/xpra/gtk/configure/main.py index 905948594f..1be597f11b 100644 --- a/xpra/gtk/configure/main.py +++ b/xpra/gtk/configure/main.py @@ -2,19 +2,19 @@ # Copyright (C) 2018-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. + import os.path from importlib import import_module -import gi from xpra.scripts.config import InitExit from xpra.exit_codes import ExitCode +from xpra.os_util import gi_import from xpra.util.parsing import parse_simple_dict from xpra.gtk.dialogs.base_gui_window import BaseGUIWindow from xpra.gtk.widget import label from xpra.log import Logger -gi.require_version('Gtk', '3.0') -from gi.repository import Gtk +Gtk = gi_import("Gtk") log = Logger("util") diff --git a/xpra/gtk/cursors.py b/xpra/gtk/cursors.py index 86e9feef57..55454bd4cb 100644 --- a/xpra/gtk/cursors.py +++ b/xpra/gtk/cursors.py @@ -1,11 +1,11 @@ # This file is part of Xpra. -# Copyright (C) 2012-2021 Antoine Martin +# Copyright (C) 2012-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. -import gi -gi.require_version('Gdk', '3.0') # @UndefinedVariable -from gi.repository import Gdk #pylint: disable=wrong-import-position @UnresolvedImport +from xpra.os_util import gi_import + +Gdk = gi_import("Gdk") cursor_names = {} cursor_types = {} diff --git a/xpra/gtk/dialogs/about.py b/xpra/gtk/dialogs/about.py index 6b3af29e48..ef8b5abd09 100755 --- a/xpra/gtk/dialogs/about.py +++ b/xpra/gtk/dialogs/about.py @@ -5,15 +5,15 @@ # later version. See the file COPYING for details. import os.path -import gi -gi.require_version('Gtk', '3.0') # @UndefinedVariable -from gi.repository import Gtk # @UnresolvedImport +from xpra.os_util import gi_import from xpra.util.version import XPRA_VERSION from xpra.scripts.config import get_build_info from xpra.gtk.window import add_close_accel from xpra.log import Logger +Gtk = gi_import("Gtk") + log = Logger("info") APPLICATION_NAME = "Xpra" @@ -39,6 +39,7 @@ def close_about(*_args): if about_dialog: about_dialog.hide() + def about(on_close=close_about, parent:Gtk.Window|None=None): global about_dialog if about_dialog: diff --git a/xpra/gtk/dialogs/auth_dialog.py b/xpra/gtk/dialogs/auth_dialog.py index 3cf33669be..74e8eab45a 100644 --- a/xpra/gtk/dialogs/auth_dialog.py +++ b/xpra/gtk/dialogs/auth_dialog.py @@ -4,17 +4,17 @@ # later version. See the file COPYING for details. import sys -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -# pylint: disable=wrong-import-position -from gi.repository import GLib, Gtk # @UnresolvedImport from xpra.gtk.window import add_close_accel from xpra.gtk.widget import label from xpra.gtk.pixbuf import get_icon_pixbuf from xpra.gtk.signals import register_os_signals +from xpra.os_util import gi_import from xpra.log import Logger +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") + log = Logger("util") diff --git a/xpra/gtk/dialogs/base_gui_window.py b/xpra/gtk/dialogs/base_gui_window.py index 760d6ec72e..d24a9086da 100644 --- a/xpra/gtk/dialogs/base_gui_window.py +++ b/xpra/gtk/dialogs/base_gui_window.py @@ -6,21 +6,22 @@ import os import signal import subprocess -import gi from collections.abc import Callable from xpra.gtk.window import add_close_accel, add_window_accel from xpra.gtk.widget import imagebutton from xpra.gtk.util import IgnoreWarningsContext from xpra.gtk.pixbuf import get_icon_pixbuf +from xpra.os_util import gi_import from xpra.exit_codes import exit_str from xpra.common import NotificationID, noop from xpra.platform.paths import get_xpra_command from xpra.log import Logger -gi.require_version('Gdk', '3.0') # @UndefinedVariable -gi.require_version('Gtk', '3.0') # @UndefinedVariable -from gi.repository import GLib, Gtk, Gdk, Gio # @UnresolvedImport +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") +Gio = gi_import("Gio") log = Logger("util") diff --git a/xpra/gtk/dialogs/confirm_dialog.py b/xpra/gtk/dialogs/confirm_dialog.py index e021f95280..f225b6d5c1 100755 --- a/xpra/gtk/dialogs/confirm_dialog.py +++ b/xpra/gtk/dialogs/confirm_dialog.py @@ -1,22 +1,20 @@ #!/usr/bin/env python3 # This file is part of Xpra. -# Copyright (C) 2018-2022 Antoine Martin +# Copyright (C) 2018-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. import sys -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("GdkPixbuf", "2.0") # @UndefinedVariable -from gi.repository import Gtk # @UnresolvedImport - from xpra.gtk.signals import register_os_signals from xpra.gtk.window import add_close_accel from xpra.gtk.widget import label, modify_fg, color_parse from xpra.gtk.pixbuf import get_icon_pixbuf from xpra.platform.gui import force_focus -from xpra.os_util import get_util_logger +from xpra.os_util import get_util_logger, gi_import + +Gtk = gi_import("Gtk") +GdkPixbuf = gi_import("GdkPixbuf") log = get_util_logger() diff --git a/xpra/gtk/dialogs/desktop_greeter.py b/xpra/gtk/dialogs/desktop_greeter.py index 4f61f36d54..f18b78a489 100644 --- a/xpra/gtk/dialogs/desktop_greeter.py +++ b/xpra/gtk/dialogs/desktop_greeter.py @@ -7,12 +7,7 @@ import os.path import subprocess -import gi - -gi.require_version('Gtk', '3.0') # @UndefinedVariable -from gi.repository import Gtk, GLib # @UnresolvedImport - -from xpra.os_util import POSIX, OSX, which +from xpra.os_util import POSIX, OSX, which, gi_import from xpra.gtk.signals import register_os_signals from xpra.gtk.window import add_close_accel from xpra.gtk.widget import imagebutton, label, setfont @@ -20,6 +15,9 @@ from xpra.util.thread import start_thread from xpra.log import Logger +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") + log = Logger("client", "util") diff --git a/xpra/gtk/dialogs/gui.py b/xpra/gtk/dialogs/gui.py index be3e2d7b67..a64545d024 100644 --- a/xpra/gtk/dialogs/gui.py +++ b/xpra/gtk/dialogs/gui.py @@ -4,14 +4,12 @@ # later version. See the file COPYING for details. import sys -import gi -from xpra.os_util import OSX, WIN32 +from xpra.os_util import OSX, WIN32, gi_import from xpra.gtk.dialogs.base_gui_window import BaseGUIWindow from xpra.log import Logger -gi.require_version('Gtk', '3.0') -from gi.repository import Gtk +Gtk = gi_import("Gtk") log = Logger("util") diff --git a/xpra/gtk/dialogs/mdns_gui.py b/xpra/gtk/dialogs/mdns_gui.py index 141eca11da..bb9269e518 100644 --- a/xpra/gtk/dialogs/mdns_gui.py +++ b/xpra/gtk/dialogs/mdns_gui.py @@ -1,18 +1,19 @@ # This file is part of Xpra. -# Copyright (C) 2017-2020 Antoine Martin +# Copyright (C) 2017-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. import sys -import gi -gi.require_version('Gtk', '3.0') # @UndefinedVariable -from gi.repository import GLib, Gtk # @UnresolvedImport from xpra.gtk.dialogs.sessions_gui import SessionsGUI from xpra.net.mdns import XPRA_TCP_MDNS_TYPE, XPRA_UDP_MDNS_TYPE, get_listener_class from xpra.util.env import envbool +from xpra.os_util import gi_import from xpra.log import Logger +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") + log = Logger("mdns", "util") HIDE_IPV6 = envbool("XPRA_HIDE_IPV6", False) diff --git a/xpra/gtk/dialogs/open_requests.py b/xpra/gtk/dialogs/open_requests.py index 4cd6b6e53b..3f729231ec 100755 --- a/xpra/gtk/dialogs/open_requests.py +++ b/xpra/gtk/dialogs/open_requests.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # This file is part of Xpra. -# Copyright (C) 2017-2020 Antoine Martin +# Copyright (C) 2017-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. @@ -8,10 +8,9 @@ import os.path import subprocess from time import monotonic -import gi from xpra.util.env import envint -from xpra.os_util import bytestostr, WIN32, OSX +from xpra.os_util import bytestostr, gi_import, WIN32, OSX from xpra.gtk.signals import register_os_signals from xpra.util.child_reaper import getChildReaper from xpra.net.file_transfer import ACCEPT, OPEN, DENY @@ -23,10 +22,10 @@ from xpra.platform.paths import get_download_dir from xpra.log import Logger -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -gi.require_version("Pango", "1.0") # @UndefinedVariable -from gi.repository import GLib, Gtk, Pango # pylint: disable=wrong-import-order @UnresolvedImport +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") +Pango = gi_import("Pango") log = Logger("gtk", "file") diff --git a/xpra/gtk/dialogs/pass_dialog.py b/xpra/gtk/dialogs/pass_dialog.py index 0f92803afb..5d5c6551ff 100755 --- a/xpra/gtk/dialogs/pass_dialog.py +++ b/xpra/gtk/dialogs/pass_dialog.py @@ -1,24 +1,22 @@ #!/usr/bin/env python3 # This file is part of Xpra. -# Copyright (C) 2018-2022 Antoine Martin +# Copyright (C) 2018-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. import sys -#pylint: disable=import-outside-toplevel -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("GdkPixbuf", "2.0") # @UndefinedVariable -from gi.repository import GLib, Gtk # @UnresolvedImport - -from xpra.os_util import get_util_logger +from xpra.os_util import get_util_logger, gi_import from xpra.gtk.signals import register_os_signals from xpra.gtk.window import add_close_accel from xpra.gtk.widget import label from xpra.gtk.pixbuf import get_icon_pixbuf from xpra.platform.gui import force_focus +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") +GdkPixbuf = gi_import("GdkPixbuf") + log = get_util_logger() diff --git a/xpra/gtk/dialogs/qrcode.py b/xpra/gtk/dialogs/qrcode.py index 942351e49b..7ab542ae5d 100644 --- a/xpra/gtk/dialogs/qrcode.py +++ b/xpra/gtk/dialogs/qrcode.py @@ -1,17 +1,18 @@ # This file is part of Xpra. -# Copyright (C) 2020 Antoine Martin +# Copyright (C) 2020-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("GdkPixbuf", "2.0") # @UndefinedVariable -from gi.repository import Gtk, GLib, GdkPixbuf # @UnresolvedImport - +from xpra.os_util import gi_import from xpra.net.qrcode import qrencode from xpra.gtk.window import add_close_accel from xpra.log import Logger +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") +GdkPixbuf = gi_import("GdkPixbuf") + log = Logger("menu") diff --git a/xpra/gtk/dialogs/qrcode_client.py b/xpra/gtk/dialogs/qrcode_client.py index 624835c7d3..c3b689b743 100644 --- a/xpra/gtk/dialogs/qrcode_client.py +++ b/xpra/gtk/dialogs/qrcode_client.py @@ -1,15 +1,14 @@ # This file is part of Xpra. -# Copyright (C) 2020-2022 Antoine Martin +# Copyright (C) 2020-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. import sys -from gi.repository import Gtk, GLib # @UnresolvedImport from xpra.common import noerr from xpra.util.types import typedict from xpra.util.env import envbool -from xpra.os_util import SIGNAMES, bytestostr +from xpra.os_util import SIGNAMES, bytestostr, gi_import from xpra.exit_codes import ExitCode from xpra.gtk.window import add_close_accel from xpra.gtk.widget import label @@ -22,6 +21,9 @@ from xpra.gtk.dialogs.qrcode import qr_pixbuf from xpra.log import Logger +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") + log = Logger("client", "util") IPV6 = envbool("XPRA_IPV6", False) diff --git a/xpra/gtk/dialogs/sessions_gui.py b/xpra/gtk/dialogs/sessions_gui.py index 0fbd2b5a09..19bbfc1d0d 100644 --- a/xpra/gtk/dialogs/sessions_gui.py +++ b/xpra/gtk/dialogs/sessions_gui.py @@ -8,10 +8,6 @@ import socket import subprocess -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import GLib, Gtk, Gio # @UnresolvedImport - from xpra.common import SocketState from xpra.platform.paths import get_xpra_command, get_nodock_command from xpra.platform.dotxpra import DotXpra @@ -27,9 +23,13 @@ from xpra.gtk.signals import register_os_signals from xpra.net.common import DEFAULT_PORTS from xpra.util.types import typedict -from xpra.os_util import bytestostr, WIN32 +from xpra.os_util import bytestostr, gi_import, WIN32 from xpra.log import Logger +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") +Gio = gi_import("Gio") + log = Logger("client", "util") try: diff --git a/xpra/gtk/dialogs/show_shortcuts.py b/xpra/gtk/dialogs/show_shortcuts.py index 08d213a540..4af53576af 100644 --- a/xpra/gtk/dialogs/show_shortcuts.py +++ b/xpra/gtk/dialogs/show_shortcuts.py @@ -1,15 +1,11 @@ # This file is part of Xpra. -# Copyright (C) 2020-2022 Antoine Martin +# Copyright (C) 2020-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. import sys -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, GLib # @UnresolvedImport - -from xpra.os_util import SIGNAMES +from xpra.os_util import SIGNAMES, gi_import from xpra.gtk.window import add_close_accel from xpra.gtk.widget import label from xpra.gtk.pixbuf import get_icon_pixbuf @@ -17,6 +13,9 @@ from xpra.gtk.css_overrides import inject_css_overrides from xpra.log import Logger +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") + log = Logger("client", "util") inject_css_overrides() diff --git a/xpra/gtk/dialogs/start_new_command.py b/xpra/gtk/dialogs/start_new_command.py index cb1230b9bd..7e552bfb51 100755 --- a/xpra/gtk/dialogs/start_new_command.py +++ b/xpra/gtk/dialogs/start_new_command.py @@ -1,22 +1,21 @@ #!/usr/bin/env python3 # This file is part of Xpra. -# Copyright (C) 2014-2022 Antoine Martin +# Copyright (C) 2014-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. import sys -import gi - -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import Gtk # @UnresolvedImport from xpra.gtk.window import add_close_accel from xpra.gtk.widget import scaled_image, label from xpra.gtk.pixbuf import get_icon_pixbuf from xpra.gtk.signals import register_os_signals from xpra.util.types import typedict +from xpra.os_util import gi_import from xpra.log import Logger, enable_debug_for +Gtk = gi_import("Gtk") + log = Logger("exec") diff --git a/xpra/gtk/dialogs/toolbox.py b/xpra/gtk/dialogs/toolbox.py index 10fa4769ce..dcb7c26c76 100644 --- a/xpra/gtk/dialogs/toolbox.py +++ b/xpra/gtk/dialogs/toolbox.py @@ -3,16 +3,12 @@ # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. -#pylint: disable=wrong-import-position +# pylint: disable=wrong-import-position import sys import glob import os.path import subprocess -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, Gio # @UnresolvedImport from xpra.util.child_reaper import getChildReaper from xpra.gtk.signals import register_os_signals @@ -21,9 +17,12 @@ from xpra.gtk.util import IgnoreWarningsContext from xpra.gtk.pixbuf import get_icon_pixbuf from xpra.platform.paths import get_python_execfile_command, get_python_exec_command -from xpra.os_util import WIN32, OSX, is_X11 +from xpra.os_util import WIN32, OSX, is_X11, gi_import from xpra.log import Logger +Gtk = gi_import("Gtk") +Gio = gi_import("Gio") + log = Logger("client", "util") diff --git a/xpra/gtk/dialogs/update_status.py b/xpra/gtk/dialogs/update_status.py index 44705c1221..ba04b40870 100755 --- a/xpra/gtk/dialogs/update_status.py +++ b/xpra/gtk/dialogs/update_status.py @@ -6,18 +6,16 @@ import sys -import gi - -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("GdkPixbuf", "2.0") # @UndefinedVariable -from gi.repository import GLib, Gtk # @UnresolvedImport - +from xpra.os_util import gi_import from xpra.platform.gui import init as gui_init, force_focus from xpra.gtk.window import add_close_accel from xpra.gtk.widget import scaled_image, label from xpra.gtk.pixbuf import get_icon_pixbuf from xpra.log import Logger, enable_debug_for +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") + log = Logger("util") diff --git a/xpra/gtk/dialogs/view_clipboard.py b/xpra/gtk/dialogs/view_clipboard.py index 33a49d881b..b5cf2b5f30 100755 --- a/xpra/gtk/dialogs/view_clipboard.py +++ b/xpra/gtk/dialogs/view_clipboard.py @@ -6,8 +6,8 @@ import sys from collections import deque from collections.abc import Callable -import gi +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.util.str_fn import csv @@ -15,9 +15,9 @@ from xpra.gtk.pixbuf import get_icon_pixbuf from xpra.platform.features import CLIPBOARDS -gi.require_version("Gdk", "3.0") # @UndefinedVariable -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, Gdk, GLib # @UnresolvedImport +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") class ClipboardInstance: diff --git a/xpra/gtk/dialogs/view_keyboard.py b/xpra/gtk/dialogs/view_keyboard.py index f705123b34..49b23c9b1d 100755 --- a/xpra/gtk/dialogs/view_keyboard.py +++ b/xpra/gtk/dialogs/view_keyboard.py @@ -5,19 +5,18 @@ import sys import warnings from collections import deque -import gi from xpra.util.str_fn import csv -from xpra.os_util import bytestostr +from xpra.os_util import bytestostr, gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.widget import label from xpra.gtk.pixbuf import get_icon_pixbuf from xpra.log import enable_color, Logger -gi.require_version("Gdk", "3.0") # @UndefinedVariable -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import GLib, Gtk, Gdk # @UnresolvedImport +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") log = Logger("gtk", "keyboard") diff --git a/xpra/gtk/error.py b/xpra/gtk/error.py index 8105d2e4ba..ac38dc6ee4 100644 --- a/xpra/gtk/error.py +++ b/xpra/gtk/error.py @@ -29,17 +29,15 @@ import traceback -import gi -gi.require_version("Gdk", "3.0") # @UndefinedVariable -from gi.repository import Gdk # @UnresolvedImport - from xpra.util.env import envbool -from xpra.os_util import is_main_thread +from xpra.os_util import is_main_thread, gi_import from xpra.log import Logger +Gdk = gi_import("Gdk") + __all__ = ["XError", "trap", "xsync", "xswallow", "xlog", "verify_sync"] -#run xpra in synchronized mode to debug X11 errors: +# run xpra in synchronized mode to debug X11 errors: XPRA_SYNCHRONIZE = envbool("XPRA_SYNCHRONIZE", False) XPRA_LOG_SYNC = envbool("XPRA_LOG_SYNC", False) VERIFY_MAIN_THREAD = envbool("XPRA_VERIFY_MAIN_THREAD", True) diff --git a/xpra/gtk/examples/bell.py b/xpra/gtk/examples/bell.py index 9e05765cba..c367954ac6 100755 --- a/xpra/gtk/examples/bell.py +++ b/xpra/gtk/examples/bell.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# Copyright (C) 2017-2022 Antoine Martin +# Copyright (C) 2017-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. @@ -7,10 +7,10 @@ from xpra.platform.gui import force_focus from xpra.gtk.window import add_close_accel from xpra.gtk.pixbuf import get_icon_pixbuf +from xpra.os_util import gi_import -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, GLib # @UnresolvedImport +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") class BellWindow(Gtk.Window): diff --git a/xpra/gtk/examples/clicks.py b/xpra/gtk/examples/clicks.py index cf8ed8f862..1191ca9b96 100755 --- a/xpra/gtk/examples/clicks.py +++ b/xpra/gtk/examples/clicks.py @@ -1,19 +1,19 @@ #!/usr/bin/env python3 # This file is part of Xpra. -# Copyright (C) 2013-2020 Antoine Martin +# Copyright (C) 2013-2023 Antoine Martin import sys +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.window import add_close_accel from xpra.gtk.widget import label from xpra.gtk.pixbuf import get_icon_pixbuf -import gi -gi.require_version('Gtk', '3.0') # @UndefinedVariable -gi.require_version('Gdk', '3.0') # @UndefinedVariable -from gi.repository import Gtk, Gdk, GLib #pylint: disable=wrong-import-position @UnresolvedImport +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") class TestForm: diff --git a/xpra/gtk/examples/colors.py b/xpra/gtk/examples/colors.py index 033dde72b0..7d6cac6ab2 100755 --- a/xpra/gtk/examples/colors.py +++ b/xpra/gtk/examples/colors.py @@ -1,18 +1,19 @@ #!/usr/bin/env python3 -# Copyright (C) 2017-2020 Antoine Martin +# Copyright (C) 2017-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.window import add_close_accel from xpra.gtk.pixbuf import get_icon_pixbuf -from cairo import OPERATOR_CLEAR, OPERATOR_SOURCE #pylint: disable=no-name-in-module -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -from gi.repository import GLib, Gtk, Gdk # @UnresolvedImport +from cairo import OPERATOR_CLEAR, OPERATOR_SOURCE # pylint: disable=no-name-in-module + +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") class AnimatedColorWindow(Gtk.Window): diff --git a/xpra/gtk/examples/colors_gradient.py b/xpra/gtk/examples/colors_gradient.py index add9c6570a..6b4860933f 100755 --- a/xpra/gtk/examples/colors_gradient.py +++ b/xpra/gtk/examples/colors_gradient.py @@ -7,13 +7,13 @@ from xpra.platform.gui import force_focus from xpra.gtk.window import add_close_accel from xpra.gtk.pixbuf import get_icon_pixbuf +from xpra.os_util import gi_import from cairo import OPERATOR_CLEAR, OPERATOR_SOURCE #pylint: disable=no-name-in-module -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, Gdk, GLib # @UnresolvedImport +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") class ColorGradientWindow(Gtk.Window): diff --git a/xpra/gtk/examples/colors_plain.py b/xpra/gtk/examples/colors_plain.py index bdd85d6d5b..90b13dde76 100755 --- a/xpra/gtk/examples/colors_plain.py +++ b/xpra/gtk/examples/colors_plain.py @@ -1,18 +1,19 @@ #!/usr/bin/env python3 -# Copyright (C) 2017-2020 Antoine Martin +# Copyright (C) 2017-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.window import add_close_accel from xpra.gtk.pixbuf import get_icon_pixbuf from cairo import OPERATOR_CLEAR, OPERATOR_SOURCE #pylint: disable=no-name-in-module -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, Gdk, GLib # @UnresolvedImport + +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") class ColorPlainWindow(Gtk.Window): diff --git a/xpra/gtk/examples/cursors.py b/xpra/gtk/examples/cursors.py index 914b76b139..ad480f63bd 100755 --- a/xpra/gtk/examples/cursors.py +++ b/xpra/gtk/examples/cursors.py @@ -1,18 +1,18 @@ #!/usr/bin/env python3 -# Copyright (C) 2020 Antoine Martin +# Copyright (C) 2020-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus -from xpra.gtk.cursors import cursor_types #pylint: disable=wrong-import-position +from xpra.gtk.cursors import cursor_types from xpra.gtk.window import add_close_accel from xpra.gtk.pixbuf import get_icon_pixbuf -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, Gdk, GLib #pylint: disable=wrong-import-position @UnresolvedImport +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") width = 400 diff --git a/xpra/gtk/examples/file_chooser.py b/xpra/gtk/examples/file_chooser.py index 2096248c6f..77193bd196 100755 --- a/xpra/gtk/examples/file_chooser.py +++ b/xpra/gtk/examples/file_chooser.py @@ -5,10 +5,9 @@ from xpra.platform import program_context from xpra.gtk.widget import choose_file +from xpra.os_util import gi_import -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import Gtk #pylint: disable=wrong-import-position @UnresolvedImport +Gtk = gi_import("Gtk") def main(): @@ -18,6 +17,7 @@ def main(): file_filter.add_pattern("*.xpra") window = None from xpra.gtk.signals import register_os_signals + def signal_handler(*_args): Gtk.main_quit() register_os_signals(signal_handler) diff --git a/xpra/gtk/examples/fontrendering.py b/xpra/gtk/examples/fontrendering.py index 1806da1cba..f93c7cf41d 100755 --- a/xpra/gtk/examples/fontrendering.py +++ b/xpra/gtk/examples/fontrendering.py @@ -5,6 +5,7 @@ from xpra.platform import program_context from xpra.platform.gui import force_focus +from xpra.os_util import gi_import from xpra.util.env import envbool from xpra.gtk.window import add_close_accel from xpra.gtk.pixbuf import get_icon_pixbuf @@ -15,10 +16,10 @@ ANTIALIAS_NONE, ANTIALIAS_DEFAULT, ANTIALIAS_GRAY, ANTIALIAS_SUBPIXEL, FORMAT_RGB24, ) -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("PangoCairo", "1.0") # @UndefinedVariable -from gi.repository import PangoCairo, Gtk, GLib # @UnresolvedImport + +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") +PangoCairo = gi_import("PangoCairo") FONT = "Serif 27" diff --git a/xpra/gtk/examples/grabs.py b/xpra/gtk/examples/grabs.py index e1a48936a5..34cbad7b94 100755 --- a/xpra/gtk/examples/grabs.py +++ b/xpra/gtk/examples/grabs.py @@ -1,8 +1,9 @@ #!/usr/bin/env python3 -# Copyright (C) 2020-2021 Antoine Martin +# Copyright (C) 2020-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.util import GRAB_STATUS_STRING @@ -10,11 +11,9 @@ from xpra.gtk.widget import label from xpra.gtk.pixbuf import get_icon_pixbuf -#pylint: disable=wrong-import-position -import gi -gi.require_version('Gtk', '3.0') # @UndefinedVariable -gi.require_version('Gdk', '3.0') # @UndefinedVariable -from gi.repository import Gtk, Gdk, GLib #pylint: disable=wrong-import-position @UnresolvedImport +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") def make_grab_window(): diff --git a/xpra/gtk/examples/header_bar.py b/xpra/gtk/examples/header_bar.py index 9f18cd4b3f..9ebd12853d 100755 --- a/xpra/gtk/examples/header_bar.py +++ b/xpra/gtk/examples/header_bar.py @@ -1,15 +1,16 @@ #!/usr/bin/env python3 -# Copyright (C) 2020 Antoine Martin +# Copyright (C) 2020-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.window import add_close_accel -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, Gio, GLib #pylint: disable=wrong-import-position @UnresolvedImport +Gtk = gi_import("Gtk") +Gio = gi_import("Gio") +GLib = gi_import("GLib") class HeaderBarWindow(Gtk.Window): diff --git a/xpra/gtk/examples/initiate_moveresize.py b/xpra/gtk/examples/initiate_moveresize.py index 634fd8f0ec..0c30857e01 100755 --- a/xpra/gtk/examples/initiate_moveresize.py +++ b/xpra/gtk/examples/initiate_moveresize.py @@ -1,20 +1,18 @@ #!/usr/bin/env python3 -# Copyright (C) 2020-2021 Antoine Martin +# Copyright (C) 2020-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. -#pylint: disable=wrong-import-position - -import gi -gi.require_version('Gtk', '3.0') # @UndefinedVariable -from gi.repository import Gtk, GLib # @UnresolvedImport - +from xpra.os_util import gi_import from xpra.common import MoveResize, MOVERESIZE_DIRECTION_STRING from xpra.gtk.window import add_close_accel from xpra.gtk.util import IgnoreWarningsContext from xpra.gtk.pixbuf import get_icon_pixbuf from xpra.platform import program_context +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") + width = 400 height = 400 diff --git a/xpra/gtk/examples/text_entry.py b/xpra/gtk/examples/text_entry.py index 33c41dc757..c9d2ca562b 100755 --- a/xpra/gtk/examples/text_entry.py +++ b/xpra/gtk/examples/text_entry.py @@ -1,18 +1,19 @@ #!/usr/bin/env python3 # This file is part of Xpra. -# Copyright (C) 2013-2021 Antoine Martin +# Copyright (C) 2013-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. +import sys + +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.window import add_close_accel from xpra.gtk.pixbuf import get_icon_pixbuf -import sys -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, GLib #pylint: disable=wrong-import-position @UnresolvedImport +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") def make_window(): diff --git a/xpra/gtk/examples/transparent_colors.py b/xpra/gtk/examples/transparent_colors.py index 21d7904df5..9761905b1f 100755 --- a/xpra/gtk/examples/transparent_colors.py +++ b/xpra/gtk/examples/transparent_colors.py @@ -1,18 +1,19 @@ #!/usr/bin/env python3 -# Copyright (C) 2017-2021 Antoine Martin +# Copyright (C) 2017-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.window import add_close_accel from xpra.gtk.pixbuf import get_icon_pixbuf -from cairo import OPERATOR_CLEAR, OPERATOR_SOURCE #pylint: disable=no-name-in-module -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, Gdk, GLib # @UnresolvedImport +from cairo import OPERATOR_CLEAR, OPERATOR_SOURCE # pylint: disable=no-name-in-module + +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") class TransparentColorWindow(Gtk.Window): diff --git a/xpra/gtk/examples/transparent_window.py b/xpra/gtk/examples/transparent_window.py index 584c756428..5c190e24c0 100755 --- a/xpra/gtk/examples/transparent_window.py +++ b/xpra/gtk/examples/transparent_window.py @@ -1,18 +1,19 @@ #!/usr/bin/env python3 -# Copyright (C) 2017-2021 Antoine Martin +# Copyright (C) 2017-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.window import add_close_accel from xpra.gtk.pixbuf import get_icon_pixbuf from cairo import OPERATOR_SOURCE #pylint: disable=no-name-in-module -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, Gdk, GLib # @UnresolvedImport + +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") class TransparentWindow(Gtk.Window): diff --git a/xpra/gtk/examples/tray.py b/xpra/gtk/examples/tray.py index 1951382126..bb5b5f0572 100755 --- a/xpra/gtk/examples/tray.py +++ b/xpra/gtk/examples/tray.py @@ -5,6 +5,7 @@ from collections.abc import Callable +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import get_native_tray_menu_helper_class, get_native_tray_classes from xpra.platform.paths import get_icon_filename @@ -12,9 +13,9 @@ from xpra.common import noop from xpra.log import Logger -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import GLib, Gtk, GdkPixbuf # @UnresolvedImport +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") +GdkPixbuf = gi_import("GdkPixbuf") log = Logger("client") diff --git a/xpra/gtk/examples/window_focus.py b/xpra/gtk/examples/window_focus.py index 56fd2400cb..aaa385083d 100755 --- a/xpra/gtk/examples/window_focus.py +++ b/xpra/gtk/examples/window_focus.py @@ -1,10 +1,10 @@ #!/usr/bin/env python3 # This file is part of Xpra. -# Copyright (C) 2020-2021 Antoine Martin +# Copyright (C) 2020-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. -from xpra.os_util import POSIX, OSX +from xpra.os_util import POSIX, OSX, gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.window import add_close_accel @@ -15,9 +15,8 @@ from datetime import datetime from collections import deque -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, GLib #pylint: disable=wrong-import-position @UnresolvedImport +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") def make_window(): diff --git a/xpra/gtk/examples/window_geometry_hints.py b/xpra/gtk/examples/window_geometry_hints.py index bc2e58b4f6..db32eb1d7f 100755 --- a/xpra/gtk/examples/window_geometry_hints.py +++ b/xpra/gtk/examples/window_geometry_hints.py @@ -1,19 +1,20 @@ #!/usr/bin/env python3 # This file is part of Xpra. -# Copyright (C) 2020-2022 Antoine Martin +# Copyright (C) 2020-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. import sys -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, Gdk, GLib #pylint: disable=wrong-import-position @UnresolvedImport +from xpra.os_util import gi_import from xpra.gtk.window import add_close_accel from xpra.gtk.widget import label from xpra.gtk.pixbuf import get_icon_pixbuf +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") + class HintedWindows(Gtk.Window): diff --git a/xpra/gtk/examples/window_opacity.py b/xpra/gtk/examples/window_opacity.py index 95b31ece66..ab4a3f293e 100755 --- a/xpra/gtk/examples/window_opacity.py +++ b/xpra/gtk/examples/window_opacity.py @@ -1,16 +1,16 @@ #!/usr/bin/env python3 -# Copyright (C) 2020 Antoine Martin +# Copyright (C) 2020-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.window import add_close_accel from xpra.gtk.pixbuf import get_icon_pixbuf -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, GLib #pylint: disable=wrong-import-position @UnresolvedImport +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") opacity = 50 diff --git a/xpra/gtk/examples/window_overrideredirect.py b/xpra/gtk/examples/window_overrideredirect.py index 29e1aa0016..a96e40bfbb 100755 --- a/xpra/gtk/examples/window_overrideredirect.py +++ b/xpra/gtk/examples/window_overrideredirect.py @@ -3,14 +3,14 @@ # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.window import add_close_accel -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, Gdk, GLib #pylint: disable=wrong-import-position @UnresolvedImport +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") width = 400 diff --git a/xpra/gtk/examples/window_states.py b/xpra/gtk/examples/window_states.py index 5af54c560e..234ed45e4b 100755 --- a/xpra/gtk/examples/window_states.py +++ b/xpra/gtk/examples/window_states.py @@ -3,15 +3,15 @@ # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.window import add_close_accel from xpra.gtk.pixbuf import get_icon_pixbuf -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, Gdk, GLib #pylint: disable=wrong-import-position @UnresolvedImport +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") def make_window(): diff --git a/xpra/gtk/examples/window_title.py b/xpra/gtk/examples/window_title.py index 0746200898..10c0c0a807 100755 --- a/xpra/gtk/examples/window_title.py +++ b/xpra/gtk/examples/window_title.py @@ -1,17 +1,18 @@ #!/usr/bin/env python3 -# Copyright (C) 2020-2021 Antoine Martin +# Copyright (C) 2020-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. +import sys + +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.window import add_close_accel from xpra.gtk.pixbuf import get_icon_pixbuf -import sys -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, GLib # @UnresolvedImport +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") def change_callback(entry, window): diff --git a/xpra/gtk/examples/window_transient.py b/xpra/gtk/examples/window_transient.py index df5eb756cf..9121f775dc 100755 --- a/xpra/gtk/examples/window_transient.py +++ b/xpra/gtk/examples/window_transient.py @@ -3,6 +3,7 @@ # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. +from xpra.os_util import gi_import from xpra.platform import program_context from xpra.platform.gui import force_focus from xpra.gtk.util import get_default_root_window @@ -10,9 +11,8 @@ from xpra.gtk.widget import label from xpra.gtk.pixbuf import get_icon_pixbuf -import gi -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import Gtk, GLib #pylint: disable=wrong-import-position @UnresolvedImport +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") def make_window(): diff --git a/xpra/gtk/info.py b/xpra/gtk/info.py index 93a8e063de..fb06586e38 100755 --- a/xpra/gtk/info.py +++ b/xpra/gtk/info.py @@ -10,13 +10,12 @@ import cairo from xpra.gtk.util import get_root_size, get_default_root_window, IgnoreWarningsContext -from xpra.os_util import WIN32 +from xpra.os_util import WIN32, gi_import from xpra.util.env import envint, envbool from xpra.log import Logger -import gi -gi.require_version("Gdk", "3.0") -from gi.repository import GObject, Gdk +Gdk = gi_import("Gdk") +GObject = gi_import("GObject") log = Logger("gtk", "util") screenlog = Logger("gtk", "screen") diff --git a/xpra/gtk/keymap.py b/xpra/gtk/keymap.py index 6310035508..cbc4259d43 100755 --- a/xpra/gtk/keymap.py +++ b/xpra/gtk/keymap.py @@ -7,6 +7,7 @@ from typing import Any +from xpra.os_util import gi_import from xpra.log import Logger log = Logger("keyboard") @@ -23,18 +24,14 @@ def get_gtk_keymap(ignore_keys=(None, "VoidSymbol", "0xffffff")) -> tuple[tuple[ by adding the keyval_name. We can also ignore some keys """ - import gi - gi.require_version('Gdk', '3.0') # @UndefinedVariable - from gi.repository import Gdk # pylint: disable=import-outside-toplevel @UnresolvedImport + Gdk = gi_import("Gdk") display = Gdk.Display.get_default() return do_get_gtk_keymap(display, ignore_keys) def do_get_gtk_keymap(display, ignore_keys:tuple[Any]) -> tuple[tuple[int,str,int,int,int],...]: if not display: return () - import gi - gi.require_version('Gdk', '3.0') # @UndefinedVariable - from gi.repository import Gdk # pylint: disable=import-outside-toplevel @UnresolvedImport + Gdk = gi_import("Gdk") keymap = Gdk.Keymap.get_for_display(display) log("keymap_get_for_display(%s)=%s, direction=%s, bidirectional layouts: %s", display, keymap, keymap.get_direction(), keymap.have_bidi_layouts()) diff --git a/xpra/gtk/notifier.py b/xpra/gtk/notifier.py index fd76a3c9ba..08cdafe9a3 100644 --- a/xpra/gtk/notifier.py +++ b/xpra/gtk/notifier.py @@ -1,36 +1,35 @@ #!/usr/bin/env python3 # -#gtkPopupNotify.py +# gtkPopupNotify.py # # Copyright 2009 Daniel Woodhouse # Copyright 2013-2021 Antoine Martin # -#This program is free software: you can redistribute it and/or modify -#it under the terms of the GNU Lesser General Public License as published by -#the Free Software Foundation, either version 3 of the License, or -#(at your option) any later version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU Lesser General Public License for more details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. # -#You should have received a copy of the GNU Lesser General Public License -#along with this program. If not, see . +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . -import gi - -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -from gi.repository import GLib, Gtk, Gdk, GdkPixbuf # @UnresolvedImport - -from xpra.os_util import OSX +from xpra.os_util import OSX, gi_import from xpra.common import NotificationID from xpra.gtk.window import add_close_accel from xpra.gtk.widget import label, modify_fg, color_parse from xpra.gtk.pixbuf import get_icon_pixbuf from xpra.notifications.notifier_base import NotifierBase, log +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") +GdkPixbuf = gi_import("GdkPixbuf") + DEFAULT_FG_COLOUR = None DEFAULT_BG_COLOUR = None if OSX: diff --git a/xpra/gtk/pixbuf.py b/xpra/gtk/pixbuf.py index 1b030d3943..ab101b9fe6 100644 --- a/xpra/gtk/pixbuf.py +++ b/xpra/gtk/pixbuf.py @@ -5,13 +5,13 @@ import os.path +from xpra.os_util import gi_import from xpra.log import Logger +GdkPixbuf = gi_import("GdkPixbuf") + log = Logger("gtk", "util") -import gi -gi.require_version("GdkPixbuf", "2.0") -from gi.repository import GdkPixbuf def get_icon_from_file(filename): if not filename: diff --git a/xpra/gtk/util.py b/xpra/gtk/util.py index 9e7f5cee30..ec34bfbdff 100644 --- a/xpra/gtk/util.py +++ b/xpra/gtk/util.py @@ -2,18 +2,15 @@ # Copyright (C) 2011-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. + import warnings from contextlib import AbstractContextManager from typing import Any -import gi - -from xpra.os_util import OSX, POSIX, is_X11, first_time +from xpra.os_util import OSX, POSIX, is_X11, first_time, gi_import from xpra.log import Logger -gi.require_version("Gdk", "3.0") # @UndefinedVariable -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import Gdk +Gdk = gi_import("Gdk") def get_default_root_window() -> Gdk.Window | None: diff --git a/xpra/gtk/versions.py b/xpra/gtk/versions.py index b683e031e7..81cf33be20 100644 --- a/xpra/gtk/versions.py +++ b/xpra/gtk/versions.py @@ -1,22 +1,26 @@ +#!/usr/bin/env python3 +# This file is part of Xpra. +# Copyright (C) 2009-2023 Antoine Martin +# Xpra is released under the terms of the GNU GPL v2, or, at your option, any +# later version. See the file COPYING for details. + from typing import Any -GTK_VERSION_INFO : dict[str,dict[str,tuple]] = {} +GTK_VERSION_INFO : dict[str, dict[str, tuple]] = {} -def get_gtk_version_info() -> dict[str,Any]: - import gi - gi.require_version("Gdk", "3.0") # @UndefinedVariable - gi.require_version("Gtk", "3.0") # @UndefinedVariable - gi.require_version("Pango", "1.0") # @UndefinedVariable - gi.require_version("GdkPixbuf", "2.0") # @UndefinedVariable - from gi.repository import GLib, GdkPixbuf, Pango, GObject, Gtk, Gdk +def get_gtk_version_info() -> dict[str, Any]: from xpra.util.version import parse_version - #update props given: + # update props given: global GTK_VERSION_INFO + if GTK_VERSION_INFO: + return GTK_VERSION_INFO.copy() + def av(k, v): GTK_VERSION_INFO[k] = parse_version(v) + def V(k, module, attr_name): v = getattr(module, attr_name, None) if v is not None: @@ -24,25 +28,33 @@ def V(k, module, attr_name): return True return False - if not GTK_VERSION_INFO: - V("gobject", GObject, "pygobject_version") - #this isn't the actual version, (only shows as "3.0") - #but still better than nothing: - V("gi", gi, "__version__") - V("gtk", Gtk, "_version") - V("gdk", Gdk, "_version") - V("gobject", GObject, "_version") - V("pixbuf", GdkPixbuf, "_version") - V("pixbuf", GdkPixbuf, "PIXBUF_VERSION") - def MAJORMICROMINOR(name, module): - try: - v = tuple(getattr(module, x) for x in ("MAJOR_VERSION", "MICRO_VERSION", "MINOR_VERSION")) - av(name, ".".join(str(x) for x in v)) - except Exception: - pass - MAJORMICROMINOR("gtk", Gtk) - MAJORMICROMINOR("glib", GLib) - import cairo - av("cairo", parse_version(cairo.version_info)) #pylint: disable=no-member - av("pango", parse_version(Pango.version_string())) + from xpra.os_util import gi_import + # this isn't the actual version, (only shows as "3.0") + # but still better than nothing: + import gi + V("gi", gi, "__version__") + + def giv(k: str, gimod: str, attr_name: str): + mod = gi_import(gimod) + if mod: + V(k, mod, attr_name) + giv("gobject", "GObject", "pygobject_version") + giv("gtk", "Gtk", "_version") + giv("gdk", "Gdk", "_version") + giv("gobject", "GObject", "_version") + giv("pixbuf", "GdkPixbuf", "_version") + giv("pixbuf", "GdkPixbuf", "PIXBUF_VERSION") + + def MAJORMICROMINOR(name, module): + try: + v = tuple(getattr(module, x) for x in ("MAJOR_VERSION", "MICRO_VERSION", "MINOR_VERSION")) + av(name, ".".join(str(x) for x in v)) + except Exception: + pass + MAJORMICROMINOR("gtk", gi_import("Gtk")) + MAJORMICROMINOR("glib", gi_import("GLib")) + import cairo + av("cairo", parse_version(cairo.version_info)) # pylint: disable=no-member + pango = gi_import("Pango") + av("pango", parse_version(pango.version_string())) return GTK_VERSION_INFO.copy() diff --git a/xpra/gtk/widget.py b/xpra/gtk/widget.py index c29a9fd77f..454b258b59 100644 --- a/xpra/gtk/widget.py +++ b/xpra/gtk/widget.py @@ -5,15 +5,15 @@ from collections.abc import Callable -import gi - -gi.require_version("Gtk", "3.0") # @UndefinedVariable -gi.require_version("Gdk", "3.0") # @UndefinedVariable -gi.require_version("Pango", "1.0") # @UndefinedVariable -from gi.repository import Gtk, Gdk, Pango - +from xpra.os_util import gi_import from xpra.gtk.util import IgnoreWarningsContext, ignorewarnings from xpra.log import Logger + +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +Pango = gi_import("Pango") +GdkPixbuf = gi_import("GdkPixbuf") + log = Logger("gtk", "util") @@ -21,8 +21,6 @@ def scaled_image(pixbuf, icon_size:int=0) -> Gtk.Image | None: if not pixbuf: return None if icon_size: - gi.require_version("GdkPixbuf", "2.0") # @UndefinedVariable - from gi.repository import GdkPixbuf pixbuf = pixbuf.scale_simple(icon_size, icon_size, GdkPixbuf.InterpType.BILINEAR) return Gtk.Image.new_from_pixbuf(pixbuf) diff --git a/xpra/gtk/window.py b/xpra/gtk/window.py index bc5894d4cc..41f5da3bea 100755 --- a/xpra/gtk/window.py +++ b/xpra/gtk/window.py @@ -6,16 +6,15 @@ from collections.abc import Callable -from xpra.os_util import WIN32, first_time +from xpra.os_util import WIN32, first_time, gi_import -import gi -gi.require_version("Gdk", "3.0") # @UndefinedVariable -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import Gdk, Gtk # @UnresolvedImport +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") -def add_close_accel(window, callback) -> list[Gtk.AccelGroup]: +def add_close_accel(window, callback: Callable) -> list[Gtk.AccelGroup]: accel_groups = [] + def wa(s, cb): accel_groups.append(add_window_accel(window, s, cb)) wa('F4', callback) @@ -24,7 +23,7 @@ def wa(s, cb): return accel_groups -def add_window_accel(window, accel, callback) -> Gtk.AccelGroup: +def add_window_accel(window, accel, callback: Callable) -> Gtk.AccelGroup: def connect(ag, *args): ag.connect(*args) accel_group = Gtk.AccelGroup() @@ -50,8 +49,8 @@ def new_GDKWindow(gdk_window_class, if y is not None: attributes.y = y attributes_mask |= Gdk.WindowAttributesType.Y - #attributes.type_hint = Gdk.WindowTypeHint.NORMAL - #attributes_mask |= Gdk.WindowAttributesType.TYPE_HINT + # attributes.type_hint = Gdk.WindowTypeHint.NORMAL + # attributes_mask |= Gdk.WindowAttributesType.TYPE_HINT attributes.width = width attributes.height = height attributes.window_type = window_type @@ -61,18 +60,18 @@ def new_GDKWindow(gdk_window_class, if visual: attributes.visual = visual attributes_mask |= Gdk.WindowAttributesType.VISUAL - #OR: + # OR: attributes.override_redirect = override_redirect attributes_mask |= Gdk.WindowAttributesType.NOREDIR - #events: + # events: attributes.event_mask = event_mask - #wclass: + # wclass: attributes.wclass = wclass mask = Gdk.WindowAttributesType(attributes_mask) return gdk_window_class(parent, attributes, mask) -def set_visual(window, alpha : bool=True) -> Gdk.Visual | None: +def set_visual(window, alpha=True) -> Gdk.Visual | None: screen = window.get_screen() if alpha: visual = screen.get_rgba_visual() @@ -81,8 +80,8 @@ def set_visual(window, alpha : bool=True) -> Gdk.Visual | None: from xpra.log import Logger alphalog = Logger("gtk", "alpha") alphalog("set_visual(%s, %s) screen=%s, visual=%s", window, alpha, screen, visual) - #we can't do alpha on win32 with plain GTK, - #(though we handle it in the opengl backend) + # we can't do alpha on win32 with plain GTK, + # (though we handle it in the opengl backend) l : Callable = alphalog.warn if WIN32 or not first_time("no-rgba"): l = alphalog.debug diff --git a/xpra/net/ssh/exec_client.py b/xpra/net/ssh/exec_client.py index 5f860ada31..e87a8a2080 100644 --- a/xpra/net/ssh/exec_client.py +++ b/xpra/net/ssh/exec_client.py @@ -16,7 +16,7 @@ from xpra.util.thread import start_thread from xpra.exit_codes import ExitCode from xpra.os_util import ( - bytestostr, + bytestostr, gi_import, restore_script_env, get_saved_env, WIN32, OSX, POSIX, ) @@ -38,9 +38,7 @@ def connect_failed(_message): #by the time ssh fails, we may have entered the gtk main loop #(and more than once thanks to the clipboard code..) if "gi.repository.Gtk" in sys.modules: - import gi - gi.require_version("Gtk", "3.0") # @UndefinedVariable - from gi.repository import Gtk # @UnresolvedImport + Gtk = gi_import("Gtk") Gtk.main_quit() diff --git a/xpra/net/subprocess_wrapper.py b/xpra/net/subprocess_wrapper.py index b6cc9d8c93..bc7be1e742 100644 --- a/xpra/net/subprocess_wrapper.py +++ b/xpra/net/subprocess_wrapper.py @@ -104,7 +104,7 @@ def __init__(self, input_filename="-", output_filename="-", wrapped_object=None, self.setup_mainloop() def setup_mainloop(self) -> None: - GLib = gi_import("GLib", "2.0") + GLib = gi_import("GLib") self.mainloop = GLib.MainLoop() self.idle_add = GLib.idle_add self.timeout_add = GLib.timeout_add @@ -345,7 +345,7 @@ def __init__(self, description="wrapper"): #hook a default packet handlers: self.connect(CONNECTION_LOST, self.connection_lost) self.connect(GIBBERISH, self.gibberish) - GLib = gi_import("GLib", "2.0") + GLib = gi_import("GLib") self.idle_add = GLib.idle_add self.timeout_add = GLib.timeout_add self.source_remove = GLib.source_remove diff --git a/xpra/notifications/common.py b/xpra/notifications/common.py index b77972784e..1febc57224 100755 --- a/xpra/notifications/common.py +++ b/xpra/notifications/common.py @@ -1,5 +1,5 @@ # This file is part of Xpra. -# Copyright (C) 2018-2022 Antoine Martin +# Copyright (C) 2018-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. @@ -7,7 +7,7 @@ from io import BytesIO from typing import TypeAlias -from xpra.os_util import load_binary_file, first_time +from xpra.os_util import load_binary_file, first_time, gi_import from xpra.log import Logger log = Logger("dbus", "notify") @@ -129,9 +129,7 @@ def get_notification_icon(icon_string:str) -> IconData | None: def get_gtk_theme_icon(icon_string:str): # try to find it in the theme: try: - import gi - gi.require_version('Gtk', '3.0') # @UndefinedVariable - from gi.repository import Gtk # pylint: disable=no-name-in-module + Gtk = gi_import("Gtk") theme = Gtk.IconTheme.get_default() except ImportError: return None diff --git a/xpra/notifications/dbus_notifier.py b/xpra/notifications/dbus_notifier.py index 35464626f4..fc6a9e5946 100644 --- a/xpra/notifications/dbus_notifier.py +++ b/xpra/notifications/dbus_notifier.py @@ -7,7 +7,7 @@ from typing import Any from xpra.util.str_fn import csv, ellipsizer -from xpra.os_util import bytestostr +from xpra.os_util import bytestostr, gi_import from xpra.dbus.helper import native_to_dbus from xpra.common import NotificationID from xpra.notifications.notifier_base import NotifierBase, log @@ -208,9 +208,9 @@ def CloseNotificationError(dbus_error, *_args): def main(): # pylint: disable=import-outside-toplevel - import gi - gi.require_version("Gtk", "3.0") # @UndefinedVariable - from gi.repository import GLib, Gtk # @UnresolvedImport + Gtk = gi_import("Gtk") + GLib = gi_import("GLib") + def show(): n = DBUS_Notifier_factory() #actions = ["0", "Hello", "1", "Bye"] diff --git a/xpra/notifications/pynotify_notifier.py b/xpra/notifications/pynotify_notifier.py index 658048afab..398152e11e 100755 --- a/xpra/notifications/pynotify_notifier.py +++ b/xpra/notifications/pynotify_notifier.py @@ -45,15 +45,16 @@ def close_notify(self, nid:int) -> None: def main(args): - import gi - gi.require_version("Gtk", "3.0") # @UndefinedVariable - from gi.repository import GLib, Gtk # @UnresolvedImport + from xpra.os_util import gi_import + Gtk = gi_import("Gtk") + GLib = gi_import("GLib") summary = "Summary" body = "Body..." if len(args)>1: summary = args[1] if len(args)>2: body = args[2] + def show(): nid = 1 n = PyNotify_Notifier() diff --git a/xpra/os_util.py b/xpra/os_util.py index d6ec550a12..4201a72776 100644 --- a/xpra/os_util.py +++ b/xpra/os_util.py @@ -128,14 +128,19 @@ def get_sysconfig_info() -> dict[str,Any]: log.error("Error calling sysconfig.%s", fn, exc_info=True) return sysinfo + def strtobytes(x) -> bytes: if isinstance(x, bytes): return x return str(x).encode("latin1") + + def bytestostr(x) -> str: if isinstance(x, (bytes, bytearray)): return x.decode("latin1") return str(x) + + def hexstr(v) -> str: return bytestostr(binascii.hexlify(memoryview_to_bytes(v))) @@ -161,13 +166,27 @@ def memoryview_to_bytes(v) -> bytes: def set_proc_title(title) -> None: try: - import setproctitle #pylint: disable=import-outside-toplevel - setproctitle.setproctitle(title) #@UndefinedVariable pylint: disable=c-extension-no-member + import setproctitle # pylint: disable=import-outside-toplevel + setproctitle.setproctitle(title) # @UndefinedVariable pylint: disable=c-extension-no-member except ImportError as e: get_util_logger().debug("setproctitle is not installed: %s", e) -def gi_import(mod="Gtk", version="3.0"): +def gi_import(mod="Gtk", version=""): + gtk_version = os.environ.get("XPRA_GTK_VERSION", "3.0") + version = version or { + "Gtk": gtk_version, + "Gdk": gtk_version, + "GdkX11" : gtk_version, + "Pango": "1.0", + "PangoCairo" : "1.0", + "GLib": "2.0", + "GObject": "2.0", + "GdkPixbuf": "2.0", + "Gio": "2.0", + "Rsvg": "2.0", + "Gst": "1.0", + }.get(mod, "") with SilenceWarningsContext(DeprecationWarning, ImportWarning): import gi gi.require_version(mod, version) @@ -223,11 +242,13 @@ def getuid() -> int: return os.getuid() return 0 + def getgid() -> int: if POSIX: return os.getgid() return 0 + def get_shell_for_uid(uid) -> str: if POSIX: from pwd import getpwuid @@ -237,6 +258,7 @@ def get_shell_for_uid(uid) -> str: pass return "" + def get_username_for_uid(uid) -> str: if POSIX: from pwd import getpwuid @@ -255,12 +277,14 @@ def get_home_for_uid(uid) -> str: pass return "" + def get_groups(username) -> list[str]: if POSIX: import grp return [gr.gr_name for gr in grp.getgrall() if username in gr.gr_mem] return [] + def get_group_id(group) -> int: try: import grp diff --git a/xpra/platform/__init__.py b/xpra/platform/__init__.py index e41d1a0bcd..d649e77f6e 100644 --- a/xpra/platform/__init__.py +++ b/xpra/platform/__init__.py @@ -136,7 +136,7 @@ def set_prgname(name): return try: from xpra.os_util import gi_import - GLib = gi_import("GLib", "2.0") + GLib = gi_import("GLib") GLib.set_prgname(name) except ImportError: pass diff --git a/xpra/platform/darwin/__init__.py b/xpra/platform/darwin/__init__.py index c6703f4c95..79388887e6 100644 --- a/xpra/platform/darwin/__init__.py +++ b/xpra/platform/darwin/__init__.py @@ -30,9 +30,8 @@ def do_init_env(): def default_gtk_main_exit(): - import gi - gi.require_version('Gtk', '3.0') # @UndefinedVariable - from gi.repository import Gtk # @UnresolvedImport + from xpra.os_util import gi_import + Gtk = gi_import("Gtk") Gtk.main_quit() diff --git a/xpra/platform/darwin/clipboard.py b/xpra/platform/darwin/clipboard.py index bf25c82053..8cb1688a89 100644 --- a/xpra/platform/darwin/clipboard.py +++ b/xpra/platform/darwin/clipboard.py @@ -18,7 +18,7 @@ ) from xpra.platform.ui_thread_watcher import get_UI_watcher from xpra.util.str_fn import csv, ellipsizer -from xpra.os_util import bytestostr +from xpra.os_util import bytestostr, gi_import from xpra.log import Logger log = Logger("clipboard", "osx") @@ -276,9 +276,8 @@ def main(): get_UI_watcher(GLib.timeout_add, GLib.source_remove) log.info("testing pasteboard") - import gi - gi.require_version('Gtk', '3.0') # @UndefinedVariable - from gi.repository import Gtk # @UnresolvedImport + + Gtk = gi_import("Gtk") pasteboard = NSPasteboard.generalPasteboard() def nosend(*args): log("nosend%s", args) diff --git a/xpra/platform/darwin/gl_context.py b/xpra/platform/darwin/gl_context.py index 7e1612aa88..f2b1df9cbe 100644 --- a/xpra/platform/darwin/gl_context.py +++ b/xpra/platform/darwin/gl_context.py @@ -16,12 +16,12 @@ from xpra.gtk.window import GDKWindow from xpra.client.gl.check import check_PyOpenGL_support from xpra.platform.darwin.gdk3_bindings import get_nsview_ptr, enable_transparency, get_backing_scale_factor +from xpra.os_util import gi_import from xpra.log import Logger log = Logger("opengl") - class AGLWindowContext: def __init__(self, gl_context:NSOpenGLContext, nsview:int): @@ -129,9 +129,7 @@ def check_support(self, force_enable:bool=False) -> dict[str,Any]: conv, const_val = vdef #ie (bool, NSOpenGLPFAAlphaSize) v = self._get_pfa(const_val, screen)#ie: NSOpenGLPFAAlphaSize=8 si[name] = conv(v) #ie: bool(8) - import gi - gi.require_version("Gdk", "3.0") # @UndefinedVariable - from gi.repository import Gdk # @UnresolvedImport + Gdk = gi_import("Gdk") tmp = GDKWindow(window_type=Gdk.WindowType.TEMP, title="tmp-opengl-check") with self.get_paint_context(tmp): i.update(check_PyOpenGL_support(force_enable)) diff --git a/xpra/platform/darwin/keyboard.py b/xpra/platform/darwin/keyboard.py index 128ba255ac..35466c1297 100644 --- a/xpra/platform/darwin/keyboard.py +++ b/xpra/platform/darwin/keyboard.py @@ -11,7 +11,7 @@ from xpra.platform.keyboard_base import KeyboardBase, log from xpra.platform.darwin.menu import getOSXMenuHelper -Gdk = gi_import("Gdk", "3.0") +Gdk = gi_import("Gdk") NUM_LOCK_KEYCODE = 71 # HARDCODED! # a key and the keys we want to translate it into when swapping keys diff --git a/xpra/platform/darwin/menu.py b/xpra/platform/darwin/menu.py index 3dbd45518d..f64bddec2c 100644 --- a/xpra/platform/darwin/menu.py +++ b/xpra/platform/darwin/menu.py @@ -5,10 +5,7 @@ from collections.abc import Callable -import gi -gi.require_version('Gtk', '3.0') # @UndefinedVariable -from gi.repository import GLib, Gtk # @UnresolvedImport - +from xpra.os_util import gi_import from xpra.util.str_fn import csv from xpra.util.env import envbool from xpra.common import noop @@ -26,6 +23,9 @@ from xpra.client.gui import features from xpra.log import Logger +Gtk = gi_import("Gtk") +GLib = gi_import("GLib") + log = Logger("osx", "tray", "menu") clipboardlog = Logger("osx", "menu", "clipboard") diff --git a/xpra/platform/darwin/tray.py b/xpra/platform/darwin/tray.py index d9e48b1584..4dbc09d4aa 100644 --- a/xpra/platform/darwin/tray.py +++ b/xpra/platform/darwin/tray.py @@ -4,10 +4,8 @@ # later version. See the file COPYING for details. from time import monotonic -import gi -gi.require_version("GdkPixbuf", "2.0") # @UndefinedVariable -from gi.repository import GdkPixbuf # @UnresolvedImport +from xpra.os_util import gi_import from xpra.client.gui.tray_base import TrayBase from xpra.gtk.pixbuf import get_pixbuf_from_data from xpra.platform.darwin.menu import getOSXMenuHelper @@ -15,9 +13,11 @@ from xpra.platform.gui import ready as gui_ready from xpra.log import Logger +GdkPixbuf = gi_import("GdkPixbuf") + log = Logger("tray", "osx") -#constants for attention_request: +# constants for attention_request: CRITICAL_REQUEST = 0 INFO_REQUEST = 10 @@ -103,8 +103,7 @@ def set_global_menu(self) -> None: def set_dock_menu(self) -> None: #dock menu log("OSXTray.set_dock_menu()") - gi.require_version('Gtk', '3.0') # @UndefinedVariable - from gi.repository import Gtk # @UnresolvedImport + Gtk = gi_import("Gtk") self.dock_menu = Gtk.Menu() self.disconnect_dock_item = Gtk.MenuItem(label="Disconnect") self.disconnect_dock_item.connect("activate", self.quit) diff --git a/xpra/platform/posix/appindicator_tray.py b/xpra/platform/posix/appindicator_tray.py index 3f0448f073..53177c160e 100644 --- a/xpra/platform/posix/appindicator_tray.py +++ b/xpra/platform/posix/appindicator_tray.py @@ -158,7 +158,7 @@ def main(): # pragma: no cover enable_debug_for("tray") from xpra.gtk.signals import register_os_signals - Gtk = gi_import("Gtk", "3.0") + Gtk = gi_import("Gtk") menu = Gtk.Menu() item = Gtk.MenuItem(label="Top Menu Item 1") submenu = Gtk.Menu() diff --git a/xpra/platform/posix/gl_context.py b/xpra/platform/posix/gl_context.py index fb8cf9cea8..1d223bb636 100644 --- a/xpra/platform/posix/gl_context.py +++ b/xpra/platform/posix/gl_context.py @@ -10,6 +10,7 @@ from OpenGL.GL import GL_VENDOR, GL_RENDERER, glGetString from OpenGL.raw.GLX._types import struct__XDisplay, struct___GLXcontextRec +from xpra.os_util import gi_import from xpra.util.env import envbool, envfloat from xpra.client.gl.check import check_PyOpenGL_support from xpra.x11.bindings.display_source import get_display_ptr @@ -161,9 +162,7 @@ def __init__(self, alpha=False): self.xdisplay : int = 0 self.context = None self.bit_depth : int = 0 - import gi - gi.require_version("Gdk", "3.0") # @UndefinedVariable - from gi.repository import Gdk # @UnresolvedImport + Gdk = gi_import("Gdk") display = Gdk.Display.get_default() if not display: log.warn("Warning: GLXContext: no default display") @@ -307,9 +306,7 @@ def check_support(self, force_enable=False) -> dict[str,Any]: "enabled" : False, "message" : "cannot access X11 display", } - import gi - gi.require_version("Gtk", "3.0") # @UndefinedVariable - from gi.repository import Gtk # @UnresolvedImport + Gtk = gi_import("Gtk") tmp = Gtk.Window(type=Gtk.WindowType.TOPLEVEL) tmp.resize(1, 1) tmp.set_decorated(False) diff --git a/xpra/platform/posix/remotedesktop.py b/xpra/platform/posix/remotedesktop.py index 6775a2e5f7..a4086fa989 100755 --- a/xpra/platform/posix/remotedesktop.py +++ b/xpra/platform/posix/remotedesktop.py @@ -4,17 +4,17 @@ # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. -import gi -gi.require_version("Gdk", "3.0") -from gi.repository import Gdk from dbus.types import UInt32, Int32 +from xpra.os_util import gi_import from xpra.dbus.helper import native_to_dbus from xpra.net.common import PacketType from xpra.platform.posix.fd_portal import REMOTEDESKTOP_IFACE from xpra.platform.posix.fd_portal_shadow import PortalShadow from xpra.log import Logger +Gdk = gi_import("Gdk") + log = Logger("shadow") keylog = Logger("shadow", "keyboard") mouselog = Logger("shadow", "mouse") diff --git a/xpra/platform/win32/dwm_color.py b/xpra/platform/win32/dwm_color.py index ce8a1cccb0..3faaacd3c9 100644 --- a/xpra/platform/win32/dwm_color.py +++ b/xpra/platform/win32/dwm_color.py @@ -1,18 +1,17 @@ # This file is part of Xpra. -# Copyright (C) 2020 Antoine Martin +# Copyright (C) 2020-2023 Antoine Martin # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. from ctypes import WinDLL, windll, c_int, byref, Structure, POINTER # @UnresolvedImport from ctypes.wintypes import DWORD, PDWORD, PBOOL, BOOL, UINT -import gi -gi.require_version("Gdk", "3.0") # @UndefinedVariable -gi.require_version("Gtk", "3.0") # @UndefinedVariable -from gi.repository import Gdk, Gtk # @UnresolvedImport - from xpra.log import Logger from xpra.util.env import envbool +from xpra.os_util import gi_import + +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") log = Logger("win32") diff --git a/xpra/scripts/main.py b/xpra/scripts/main.py index e542ce0a9f..67272711c7 100755 --- a/xpra/scripts/main.py +++ b/xpra/scripts/main.py @@ -331,8 +331,11 @@ def check_gtk_client() -> None: def check_gtk() -> None: Gtk = gi_import("Gtk") - r = Gtk.init_check(argv=None) - if not r[0]: + if Gtk._version[0]>"3": + r = Gtk.init_check() + else: + r = Gtk.init_check(argv=None)[0] + if not r: raise InitExit(ExitCode.NO_DISPLAY, "failed to initialize Gtk, no display?") check_display() diff --git a/xpra/scripts/pinentry.py b/xpra/scripts/pinentry.py index 6f609c7f61..e69769adce 100755 --- a/xpra/scripts/pinentry.py +++ b/xpra/scripts/pinentry.py @@ -15,7 +15,7 @@ from xpra.os_util import ( WIN32, OSX, POSIX, is_gnome, is_kde, which, bytestostr, - use_gui_prompt, is_main_thread, + use_gui_prompt, is_main_thread, gi_import, ) from xpra.scripts.config import FALSE_OPTIONS, TRUE_OPTIONS, InitExit from xpra.exit_codes import ExitCode @@ -184,9 +184,8 @@ def force_focus() -> None: _force_focus() def dialog_run(run_fn:Callable): - import gi - gi.require_version('Gtk', '3.0') # @UndefinedVariable - from gi.repository import GLib, Gtk # @UnresolvedImport + Gtk = gi_import("Gtk") + GLib = gi_import("GLib") log("dialog_run(%s) is_main_thread=%s, main_level=%i", run_fn, is_main_thread(), Gtk.main_level()) if is_main_thread() or Gtk.main_level()==0: return run_fn() diff --git a/xpra/scripts/server.py b/xpra/scripts/server.py index 55e0e95fad..398cd4aa24 100644 --- a/xpra/scripts/server.py +++ b/xpra/scripts/server.py @@ -1582,7 +1582,7 @@ def attach_client(options, defaults): def verify_gdk_display(display_name): # pylint: disable=import-outside-toplevel # Now we can safely load gtk and connect: - Gdk = gi_import("Gdk", "3.0") + Gdk = gi_import("Gdk") display = Gdk.Display.open(display_name) if not display: from xpra.scripts.config import InitException diff --git a/xpra/server/gtk_server.py b/xpra/server/gtk_server.py index 45d389227f..c2b7bb4fd4 100644 --- a/xpra/server/gtk_server.py +++ b/xpra/server/gtk_server.py @@ -5,21 +5,16 @@ # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. -#pylint: disable=wrong-import-position +# pylint: disable=wrong-import-position import sys from time import monotonic from typing import Any from collections.abc import Callable -import gi -gi.require_version('Gdk', '3.0') # @UndefinedVariable -gi.require_version('Gtk', '3.0') # @UndefinedVariable -from gi.repository import GLib, Gdk, Gtk #pylint: disable=no-name-in-module - from xpra.util.env import envbool from xpra.util.version import dict_version_trim -from xpra.os_util import SilenceWarningsContext +from xpra.os_util import SilenceWarningsContext, gi_import from xpra.common import FULL_INFO from xpra.net.common import PacketType from xpra.gtk.signals import register_os_signals, register_SIGUSR_signals @@ -29,6 +24,10 @@ from xpra.gtk.versions import get_gtk_version_info from xpra.log import Logger +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") + UI_THREAD_WATCHER = envbool("XPRA_UI_THREAD_WATCHER") log = Logger("server", "gtk") diff --git a/xpra/server/shadow/gtk_shadow_server_base.py b/xpra/server/shadow/gtk_shadow_server_base.py index 1cb871fc95..9ef7143641 100644 --- a/xpra/server/shadow/gtk_shadow_server_base.py +++ b/xpra/server/shadow/gtk_shadow_server_base.py @@ -4,19 +4,14 @@ # later version. See the file COPYING for details. import os -import gi from typing import Any -gi.require_version("Gtk", "3.0") -gi.require_version("Gdk", "3.0") -from gi.repository import Gtk, Gdk #pylint: disable=no-name-in-module - from xpra.util.screen import prettify_plug_name from xpra.util.str_fn import csv from xpra.util.parsing import parse_simple_dict from xpra.util.env import envbool from xpra.common import XPRA_APP_ID -from xpra.os_util import POSIX, OSX, SilenceWarningsContext +from xpra.os_util import POSIX, OSX, SilenceWarningsContext, gi_import from xpra.scripts.config import parse_bool from xpra.server import features from xpra.server.shadow.root_window_model import RootWindowModel @@ -29,6 +24,9 @@ from xpra.net.compression import Compressed from xpra.log import Logger +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") + traylog = Logger("tray") notifylog = Logger("notify") screenlog = Logger("screen") diff --git a/xpra/util/child_reaper.py b/xpra/util/child_reaper.py index 834c6080eb..92031a8d6e 100644 --- a/xpra/util/child_reaper.py +++ b/xpra/util/child_reaper.py @@ -18,7 +18,7 @@ from xpra.os_util import POSIX, gi_import from xpra.log import Logger -GLib = gi_import("GLib", "2.0") +GLib = gi_import("GLib") log = Logger("server", "util", "exec") diff --git a/xpra/x11/gtk3/bindings.pyx b/xpra/x11/gtk3/bindings.pyx index 242ffa339c..dd1b41345f 100644 --- a/xpra/x11/gtk3/bindings.pyx +++ b/xpra/x11/gtk3/bindings.pyx @@ -15,10 +15,10 @@ from xpra.util.str_fn import csv from xpra.log import Logger log = Logger("x11", "bindings", "gtk") -GObject = gi_import("GObject", '2.0') -GdkX11= gi_import("GdkX11", '3.0') -Gdk = gi_import("Gdk", '3.0') -Gtk = gi_import("Gtk", '3.0') +GObject = gi_import("GObject") +GdkX11= gi_import("GdkX11") +Gdk = gi_import("Gdk") +Gtk = gi_import("Gtk") from xpra.x11.bindings.xlib cimport ( diff --git a/xpra/x11/gtk_x11/__init__.py b/xpra/x11/gtk_x11/__init__.py index 5ba84a9359..5d701cb8d0 100644 --- a/xpra/x11/gtk_x11/__init__.py +++ b/xpra/x11/gtk_x11/__init__.py @@ -7,7 +7,7 @@ gi_import("Gdk", "3.0") gi_import("Gtk", "3.0") -GdkX11 = gi_import('GdkX11', '3.0') +GdkX11 = gi_import("GdkX11", "3.0") def GDKX11Window(*args, **kwargs) -> GdkX11.X11Window: diff --git a/xpra/x11/gtk_x11/selection.py b/xpra/x11/gtk_x11/selection.py index d75d247797..a6196aa549 100644 --- a/xpra/x11/gtk_x11/selection.py +++ b/xpra/x11/gtk_x11/selection.py @@ -11,10 +11,6 @@ import sys from struct import unpack, calcsize -import gi -gi.require_version('Gtk', '3.0') # @UndefinedVariable -gi.require_version('Gdk', '3.0') # @UndefinedVariable -from gi.repository import GObject, Gtk, Gdk, GLib # @UnresolvedImport from xpra.gtk.gobject import no_arg_signal, one_arg_signal from xpra.x11.bindings.window import constants, X11WindowBindings @@ -26,8 +22,14 @@ ) from xpra.exit_codes import ExitCode from xpra.util.env import envint +from xpra.os_util import gi_import from xpra.log import Logger +Gtk = gi_import("Gtk") +Gdk = gi_import("Gdk") +GLib = gi_import("GLib") +GObject = gi_import("GObject") + log = Logger("x11", "util") SELECTION_EXIT_TIMEOUT = envint("XPRA_SELECTION_EXIT_TIMEOUT", 20) diff --git a/xpra/x11/server/keyboard_config.py b/xpra/x11/server/keyboard_config.py index 8bb28ee3b5..3af9f2bc6f 100644 --- a/xpra/x11/server/keyboard_config.py +++ b/xpra/x11/server/keyboard_config.py @@ -30,7 +30,7 @@ log = Logger("keyboard") -Gdk = gi_import("Gdk", "3.0") +Gdk = gi_import("Gdk") X11Keyboard = X11KeyboardBindings()