diff --git a/srcpkgs/onboard/patches/python-3.12.patch b/srcpkgs/onboard/patches/python-3.12.patch new file mode 100644 index 00000000000..31f3ae91994 --- /dev/null +++ b/srcpkgs/onboard/patches/python-3.12.patch @@ -0,0 +1,245 @@ +--- a/Onboard/Appearance.py ++++ b/Onboard/Appearance.py +@@ -921,7 +921,7 @@ class ColorScheme(object): + ColorScheme._parse_dom_node_item(node, item) + return item + +- _key_ids_pattern = re.compile('[\w-]+(?:[.][\w-]+)?', re.UNICODE) ++ _key_ids_pattern = re.compile(r'[\w-]+(?:[.][\w-]+)?', re.UNICODE) + + @staticmethod + def _parse_key_group(node, used_keys): +@@ -1063,7 +1063,7 @@ class ColorScheme(object): + + # read key ids + text = "".join([n.data for n in group.childNodes]) +- key_ids = [x for x in re.findall('\w+(?:[.][\w-]+)?', text) if x] ++ key_ids = [x for x in re.findall(r'\w+(?:[.][\w-]+)?', text) if x] + + # check for duplicate key definitions + for key_id in key_ids: +--- a/Onboard/LayoutLoaderSVG.py ++++ b/Onboard/LayoutLoaderSVG.py +@@ -95,7 +95,7 @@ class LayoutLoaderSVG: + self._layout_filename = "" + self._color_scheme = None + self._root_layout_dir = "" # path to svg files +- self._layout_regex = re.compile("([^\(]+) (?: \( ([^\)]*) \) )?", ++ self._layout_regex = re.compile(r"([^\(]+) (?: \( ([^\)]*) \) )?", + re.VERBOSE) + + def load(self, vk, layout_filename, color_scheme): +--- a/Onboard/SpellChecker.py ++++ b/Onboard/SpellChecker.py +@@ -321,7 +321,7 @@ class hunspell(SCBackend): + def is_running(self): + return not self._osk_hunspell is None + +- SPLITWORDS = re.compile("[^-_\s]+", re.UNICODE|re.DOTALL) ++ SPLITWORDS = re.compile(r"[^-_\s]+", re.UNICODE|re.DOTALL) + + def query(self, text): + """ +--- a/Onboard/TextDomain.py ++++ b/Onboard/TextDomain.py +@@ -141,7 +141,7 @@ class TextDomain: + + # Split at whitespace to catch whole URLs/file names and + # keep separators. +- strings = re.split('(\s+)', context) ++ strings = re.split(r'(\s+)', context) + if strings: + string = strings[-1] + if self._url_parser.is_maybe_url(string): +@@ -158,7 +158,7 @@ class TextDomain: + + + def _search_valid_file_name(self, strings): +- """ ++ r""" + Search for a valid filename backwards across separators. + + Doctests: +@@ -174,17 +174,17 @@ class TextDomain: + >>> with open(fn2, mode="w") as f: n = f.write("") + + # simple file in dir with spaces must return as filename +- >>> strings = re.split('(\s+)', fn1) ++ >>> strings = re.split(r'(\s+)', fn1) + >>> "/test onboard" in d._search_valid_file_name(strings) + True + + # file with spaces in dir with spaces must return as filename +- >>> strings = re.split('(\s+)', fn2) ++ >>> strings = re.split(r'(\s+)', fn2) + >>> "/test onboard" in d._search_valid_file_name(strings) + True + + # random string after a valid file must not be confused with a filename +- >>> strings = re.split('(\s+)', fn2 + " no-file") ++ >>> strings = re.split(r'(\s+)', fn2 + " no-file") + >>> d._search_valid_file_name(strings) is None + True + """ +@@ -288,7 +288,7 @@ class TextDomain: + def handle_key_press(self, keycode, mod_mask): + return True, None # entering_text, end_of_editing + +- _growth_sections_pattern = re.compile("[^\s?#@]+", re.DOTALL) ++ _growth_sections_pattern = re.compile(r"[^\s?#@]+", re.DOTALL) + + def _split_growth_sections(self, text): + """ +@@ -444,11 +444,11 @@ class DomainTerminal(TextDomain): + ( + "^gdb$ ", + "^>>> ", # python +- "^In \[[0-9]*\]: ", # ipython ++ r"^In \[[0-9]*\]: ", # ipython + "^:", # vi command mode + "^/", # vi search +- "^\?", # vi reverse search +- "\$ ", # generic prompt ++ r"^\?", # vi reverse search ++ r"\$ ", # generic prompt + "# ", # root prompt + "^.*?@.*?/.*?> " # fish + ) +@@ -456,7 +456,7 @@ class DomainTerminal(TextDomain): + + _prompt_blacklist_patterns = tuple(re.compile(p, re.UNICODE) for p in + ( +- "^\(.*\)`.*': ", # bash incremental search ++ r"^\(.*\)`.*': ", # bash incremental search + ) + ) + +@@ -736,7 +736,7 @@ class PartialURLParser: + _protocols = ["mailto", "apt"] + _all_schemes = _schemes + _protocols + +- _url_pattern = re.compile("([\w-]+)|(\W+)", re.UNICODE) ++ _url_pattern = re.compile(r"([\w-]+)|(\W+)", re.UNICODE) + + def iter_url(self, url): + return self._url_pattern.finditer(url) +--- a/Onboard/WordSuggestions.py ++++ b/Onboard/WordSuggestions.py +@@ -1250,8 +1250,8 @@ class WordSuggestions: + return word_span + return None + +- _section_begin_pattern = re.compile("\S*\s*$") +- _section_end_pattern = re.compile("\S*(?=\s*)") ++ _section_begin_pattern = re.compile(r"\S*\s*$") ++ _section_end_pattern = re.compile(r"\S*(?=\s*)") + + def _get_section_before_span(self, insertion_span): + """ +--- a/Onboard/pypredict/lm_wrapper.py ++++ b/Onboard/pypredict/lm_wrapper.py +@@ -299,7 +299,7 @@ def split_tokens_at(tokens, split_indice + + + SENTENCE_PATTERN = re.compile( \ +- """ .*? ++ r""" .*? + (?: + (?:[.;:!?](?:(?=[\s]) | \")) # punctuation + | (?:\\s*\\n\\s*)+(?=[\\n]) # multiples newlines +@@ -365,7 +365,7 @@ def split_sentences(text, disambiguate=F + return sentences, spans + + +-tokenize_pattern = """ ++tokenize_pattern = r""" + ( # + (?:^|(?<=\s)) + \S*(\S)\\2{{3,}}\S* # char repeated more than 3 times +@@ -464,7 +464,7 @@ def tokenize_context(text): + The result is ready for use in predict(). + """ + tokens, spans = tokenize_text(text, is_context = True) +- if not re.match(""" ++ if not re.match(r""" + ^$ # empty string? + | .*[-'´΄\w]$ # word at the end? + | (?:^|.*\s)[|]=?$ # recognized operator? +@@ -501,7 +501,7 @@ def read_order(filename, encoding=None): + continue + + if data: # data section? +- result = re.search("ngram (\d+)=\d+", line) ++ result = re.search(r"ngram (\d+)=\d+", line) + if result: + if order is None: + order = 0 +@@ -621,7 +621,7 @@ def simulate_typing(query_model, learn_m + context, spans = tokenize_context(". " + inputline) # simulate sentence begin + prefix = context[len(context)-1] if context else "" + prefix_to_end = sentence[len(inputline)-len(prefix):] +- target_word = re.search("^([\w]|[-'])*", prefix_to_end, re.UNICODE).group() ++ target_word = re.search(r"^([\w]|[-'])*", prefix_to_end, re.UNICODE).group() + choices = query_model.predict(context, limit) + + if 0: # step mode for debugging +--- a/Onboard/utils.py ++++ b/Onboard/utils.py +@@ -148,7 +148,7 @@ def get_keysym_from_name(name): + return keysyms[name] + + def parse_key_combination(combo, avaliable_key_ids = None): +- """ ++ r""" + Parses a key combination into a list of modifier masks and key_ids. + The key-id part of the combo may contain a regex pattern. + +@@ -169,7 +169,7 @@ def parse_key_combination(combo, avaliab + [('TAB', 5)] + + # regex +- >>> parse_key_combination(["F\d+"], ["TAB", "F1", "F2", "F3", "F9"]) ++ >>> parse_key_combination([r"F\d+"], ["TAB", "F1", "F2", "F3", "F9"]) + [('F1', 0), ('F2', 0), ('F3', 0), ('F9', 0)] + """ + modifiers = combo[:-1] +@@ -217,8 +217,8 @@ def run_script(script): + def toprettyxml(domdoc): + ugly_xml = domdoc.toprettyxml(indent=' ') + # Join lines with text elements with their tag lines +- pattern = re.compile('>\n\s+([^<>\s].*?)\n\s+\g<1>\n\s+([^<>\s].*?)\n\s+\g<1> +--- a/setup.py ++++ b/setup.py +@@ -115,7 +115,7 @@ def get_pkg_version(package): + .format(repr(package), status), file=sys.stderr) + sys.exit(2) + +- version = re.search('(?:(?:\d+)\.)+\d+', output).group() ++ version = re.search(r'(?:(?:\d+)\.)+\d+', output).group() + components = version.split(".") + major, minor = int(components[0]), int(components[1]) + revision = int(components[2]) if len(components) >= 3 else 0 diff --git a/srcpkgs/onboard/patches/thread-state.patch b/srcpkgs/onboard/patches/thread-state.patch new file mode 100644 index 00000000000..7a59d251c91 --- /dev/null +++ b/srcpkgs/onboard/patches/thread-state.patch @@ -0,0 +1,37 @@ +--- a/Onboard/osk/osk_devices.c ++++ b/Onboard/osk/osk_devices.c +@@ -97,13 +97,15 @@ osk_device_event_dealloc (OskDeviceEvent + static OskDeviceEvent* + new_device_event (void) + { +- OskDeviceEvent *ev = PyObject_New(OskDeviceEvent, &osk_device_event_type); ++ OskDeviceEvent *ev; ++ PyGILState_STATE gstate = PyGILState_Ensure(); ++ ev = PyObject_New(OskDeviceEvent, &osk_device_event_type); + if (ev) + { + osk_device_event_type.tp_init((PyObject*) ev, NULL, NULL); +- return ev; + } +- return NULL; ++ PyGILState_Release(gstate); ++ return ev; + } + + static PyObject * +@@ -334,6 +336,7 @@ osk_devices_dealloc (OskDevices *dev) + static void + queue_event (OskDevices* dev, OskDeviceEvent* event, Bool discard_pending) + { ++ PyGILState_STATE state = PyGILState_Ensure (); + GQueue* queue = dev->event_queue; + if (queue) + { +@@ -364,6 +367,7 @@ queue_event (OskDevices* dev, OskDeviceE + Py_INCREF(event); + g_queue_push_head(queue, event); + } ++ PyGILState_Release (state); + } + + static gboolean idle_process_event_queue (OskDevices* dev) diff --git a/srcpkgs/onboard/template b/srcpkgs/onboard/template index 3243a078312..dce61e662d2 100644 --- a/srcpkgs/onboard/template +++ b/srcpkgs/onboard/template @@ -1,7 +1,7 @@ # Template file for 'onboard' pkgname=onboard version=1.4.1 -revision=12 +revision=13 build_style=python3-module hostmakedepends="intltool pkg-config python3-distutils-extra python3-setuptools" makedepends="dconf-devel eudev-libudev-devel gtk+3-devel hunspell-devel