Feature rich application Launcher for Linux
This report summarizes scanner evidence for Ulauncher/Ulauncher, a Python project with 4,525 GitHub stars. SynthScan examined 22,811 lines of code across 266 source files, recording 665 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 34.0 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 393 finding(s).
Are imports declared and package/API names verified? 170 finding(s).
Are wrappers, guards, and repeated structures necessary? 461 finding(s).
Which changes need focused human review? 665 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 665 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_core.py | 18 | def test_streamed_render_stamps_query_and_pick(self, mocker: MockerFixture) -> None: | CODE |
| LOW | tests/test_core.py | 34 | def test_activating_drops_pending_stream_paint(self, mocker: MockerFixture) -> None: | CODE |
| LOW | tests/test_bin_ulauncher.py | 52 | def test_legacy_terminal_flags_exit_without_python(flag: str, hint: str) -> None: | CODE |
| LOW | tests/test_bin_ulauncher.py | 68 | def test_legacy_rewrite_flags_substitute_and_warn(legacy: str, replacement: str, tmp_path: Path) -> None: | CODE |
| LOW | tests/test_bin_ulauncher.py | 97 | def test_fast_path_execs_gapplication(tmp_path: Path, argv: list[str], expected_lines: list[str]) -> None: | CODE |
| LOW | tests/test_bin_ulauncher.py | 116 | def test_service_unknown_reports_that_ulauncher_is_not_running(tmp_path: Path, argv: list[str], error: str) -> None: | CODE |
| LOW | tests/test_bin_ulauncher.py | 127 | def test_other_gapplication_errors_pass_through_unchanged(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_bin_ulauncher.py | 136 | def test_bare_invocation_from_a_checkout_starts_it_rather_than_the_installed_ulauncher(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_bin_ulauncher.py | 148 | def test_explicit_show_and_toggle_never_start_ulauncher(tmp_path: Path, argv: list[str]) -> None: | CODE |
| LOW | tests/test_bin_ulauncher.py | 159 | def test_installed_ulauncher_activates_without_asking_dbus_for_the_name_owner(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_bin_ulauncher.py | 192 | def test_fast_path_defers_to_python(tmp_path: Path, argv: list[str]) -> None: | CODE |
| LOW | tests/test_cli.py | 76 | def test_parse_command_aliases( | CODE |
| LOW | tests/test_cli.py | 103 | def test_run_command_dispatches_handler_with_expected_bootstrap_mode( | CODE |
| LOW | tests/test_cli.py | 130 | def test_run_command_warns_when_verbose_set_on_runtimeless_command( | CODE |
| LOW | tests/test_cli.py | 143 | def test_groups_top_level_commands_in_help_output(self) -> None: | CODE |
| LOW | tests/test_cli.py | 161 | def test_subcommand_help_does_not_repeat_top_level_command_groups(self, capsys: pytest.CaptureFixture[str]) -> None: | CODE |
| LOW | tests/test_bootstrap_flags.py | 18 | def test_first_run_flags_are_snapshotted_at_import(self, monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_bootstrap_flags.py | 38 | def test_first_run_flags_capture_config_and_state_independently(self, monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/ui/test_result_widget.py | 45 | def test_wrap__name_and_description_labels_wrap_instead_of_ellipsizing(self) -> None: | CODE |
| LOW | tests/ui/test_result_widget.py | 57 | def test_wrap__defaults_to_single_ellipsized_line(self) -> None: | CODE |
| LOW | tests/ui/test_result_widget.py | 69 | def test_wrap__highlighting_is_skipped(self) -> None: | CODE |
| LOW⚡ | tests/ui/test_theme.py | 32 | def test_load_legacy_theme__unusable_manifest__returns_none(tmp_path: Path, content: object) -> None: | CODE |
| LOW⚡ | tests/ui/test_theme.py | 36 | def test_load_legacy_theme__missing_file__returns_none(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/ui/test_theme.py | 40 | def test_get_css__missing_file__raises(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/ui/test_theme.py | 45 | def test_legacy_get_css__missing_file__raises(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/ui/test_theme.py | 67 | def test_get_themes__manifest_in_the_user_themes_root__wins_over_the_css_glob(user_themes: Path) -> None: | CODE |
| LOW⚡ | tests/ui/test_theme.py | 77 | def test_get_themes__css_the_root_manifest_does_not_describe__is_still_a_theme(user_themes: Path) -> None: | CODE |
| LOW⚡ | tests/ui/test_theme.py | 85 | def test_get_themes__unusable_root_manifest__leaves_the_css_themes_alone(user_themes: Path) -> None: | CODE |
| LOW⚡ | tests/ui/test_theme.py | 93 | def test_get_themes__installed_manifest__wins_over_the_css_glob(installed_themes: Path) -> None: | CODE |
| LOW⚡ | tests/ui/test_theme.py | 121 | def test_get_themes__installed_flat_css__is_still_a_theme(installed_themes: Path) -> None: | CODE |
| LOW⚡ | tests/ui/test_theme.py | 129 | def test_get_themes__root_manifest_with_both_css_files__hides_both(user_themes: Path) -> None: | CODE |
| LOW⚡ | tests/ui/test_theme.py | 137 | def test_get_themes__installed_themes__show_up_alongside_user_and_system_ones( | CODE |
| LOW⚡ | tests/ui/test_theme.py | 181 | def test_get_theme_source__nested_variant__returns_owner_repo(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW⚡ | tests/ui/test_theme.py | 188 | def test_get_theme_source__user_theme__returns_user(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW⚡ | tests/ui/test_theme.py | 195 | def test_get_theme_source__system_theme__returns_built_in(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW⚡ | tests/ui/test_theme.py | 203 | def test_get_theme_source__foreign_host__returns_host_and_repo_path( | CODE |
| LOW⚡ | tests/ui/test_theme.py | 211 | def test_get_theme_source__local_install__returns_filesystem_path( | CODE |
| LOW⚡ | tests/ui/test_theme.py | 219 | def test_get_theme_source__installed_without_state__returns_unknown( | CODE |
| LOW | tests/ui/test_theme.py | 16 | def test_load_legacy_theme__valid__returns_theme(tmp_path: Path) -> None: | CODE |
| LOW | tests/ui/test_theme.py | 21 | def test_load_legacy_theme__null_extend_theme__is_dropped(tmp_path: Path) -> None: | CODE |
| LOW | tests/ui/test_theme.py | 106 | def test_get_themes__installed_manifest__hides_all_sibling_css(installed_themes: Path) -> None: | CODE |
| LOW | tests/ui/test_theme.py | 169 | def test_get_theme_source__installed_theme__returns_owner_repo(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/ui/test_results_view.py | 92 | def test_out_of_bounds_select_falls_back_to_first(self, view: ResultsView, items: list[MagicMock]) -> None: | CODE |
| LOW | tests/ui/test_results_view.py | 99 | def test_go_up_from_start_wraps_to_last(self, view: ResultsView, items: list[MagicMock]) -> None: | CODE |
| LOW | tests/ui/test_results_view.py | 113 | def test_go_down_from_last_wraps_to_first(self, view: ResultsView, items: list[MagicMock]) -> None: | CODE |
| LOW | tests/ui/test_results_view.py | 118 | def test_navigation_on_empty_is_noop(self) -> None: | CODE |
| LOW⚡ | tests/ui/test_results_view.py | 134 | def test_select_marks_user_selected(self, view: ResultsView) -> None: | CODE |
| LOW⚡ | tests/ui/test_results_view.py | 140 | def test_apply_selection_uses_default_name_without_marking_user_selected(self, view: ResultsView) -> None: | CODE |
| LOW⚡ | tests/ui/test_results_view.py | 146 | def test_apply_selection_preserves_user_pick(self, view: ResultsView) -> None: | CODE |
| LOW⚡ | tests/ui/test_results_view.py | 155 | def test_apply_selection_falls_back_when_user_pick_gone(self, view: ResultsView) -> None: | CODE |
| LOW⚡ | tests/ui/test_results_view.py | 185 | def test_replace_preserves_user_pick_within_same_query(self, view: ResultsView) -> None: | CODE |
| LOW⚡ | tests/ui/test_results_view.py | 194 | def test_append_grows_list_and_keeps_selection(self, view: ResultsView) -> None: | CODE |
| LOW⚡ | tests/ui/test_results_view.py | 203 | def test_new_query_resets_user_selection(self, view: ResultsView) -> None: | CODE |
| LOW | tests/ui/test_app.py | 23 | def test_cleanup__sweeps_every_staging_root( | CODE |
| LOW | tests/ui/test_app.py | 53 | def test_needs_restart__only_for_persistent_processes( | CODE |
| LOW | tests/ui/test_app.py | 67 | def test_prefs_close__quits_normally_when_not_persistent(mocker: MockerFixture) -> None: | CODE |
| LOW | tests/ui/test_app.py | 91 | def test_restart__decides_by_unit_state( | CODE |
| LOW⚡ | tests/ui/preferences/utils/test_ext_utils.py | 21 | def test_report_link_prefers_the_tracker_and_is_omitted_without_urls( | CODE |
| LOW⚡ | tests/ui/preferences/utils/test_ext_utils.py | 28 | def test_missing_module_links_the_issue_tracker(self) -> None: | CODE |
| LOW⚡ | tests/ui/preferences/utils/test_ext_utils.py | 34 | def test_terminated_links_the_issue_tracker(self) -> None: | CODE |
| 299 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | setup.py | 2 | CODE | |
| LOW | tests/test_core.py | 1 | CODE | |
| LOW | tests/test_bin_ulauncher.py | 1 | CODE | |
| LOW | tests/test_cli.py | 1 | CODE | |
| LOW | tests/test_bootstrap_flags.py | 1 | CODE | |
| LOW | tests/ui/conftest.py | 1 | CODE | |
| LOW | tests/ui/test_result_widget.py | 46 | CODE | |
| LOW | tests/ui/test_result_widget.py | 58 | CODE | |
| LOW | tests/ui/test_result_widget.py | 70 | CODE | |
| LOW | tests/ui/test_results_view.py | 1 | CODE | |
| LOW | tests/ui/test_results_view.py | 4 | CODE | |
| LOW | tests/ui/test_app.py | 1 | CODE | |
| LOW | tests/modes/extensions/test_extension_record.py | 1 | CODE | |
| LOW | tests/modes/extensions/test_extension_mode.py | 1 | CODE | |
| LOW | tests/modes/extensions/test_extension_dependencies.py | 1 | CODE | |
| LOW | tests/modes/extensions/test_extension_lifecycle.py | 10 | CODE | |
| LOW | tests/modes/extensions/test_extension_manifest.py | 1 | CODE | |
| LOW | tests/modes/extensions/test_extension/main.py | 1 | CODE | |
| LOW | tests/modes/calc/test_calc_mode.py | 1 | CODE | |
| LOW | tests/modes/file_browser/test_file_browser_mode.py | 1 | CODE | |
| LOW | tests/modes/shortcuts/test_shortcut_mode.py | 1 | CODE | |
| LOW | tests/modes/shortcuts/test_shortcuts.py | 1 | CODE | |
| LOW | tests/modes/shortcuts/test_run_script.py | 1 | CODE | |
| LOW | tests/modes/apps/test_app_rankings.py | 1 | CODE | |
| LOW | tests/modes/apps/test_app_result.py | 1 | CODE | |
| LOW | tests/utils/test_json_utils.py | 1 | CODE | |
| LOW | tests/utils/test_subprocess_utils.py | 1 | CODE | |
| LOW | tests/utils/test_systemd_controller.py | 1 | CODE | |
| LOW | tests/utils/test_untar.py | 1 | CODE | |
| LOW | tests/utils/test_socket_msg_controller.py | 1 | CODE | |
| LOW | tests/utils/test_display_backend.py | 1 | CODE | |
| LOW | tests/cli/commands/test_uninstall.py | 1 | CODE | |
| LOW | tests/cli/commands/test_upgrade.py | 1 | CODE | |
| LOW | tests/cli/commands/test_themes.py | 1 | CODE | |
| LOW | tests/cli/commands/test_install.py | 1 | CODE | |
| LOW | tests/internals/test_result.py | 1 | CODE | |
| LOW | tests/internals/test_result_buffer.py | 1 | CODE | |
| LOW | tests/internals/test_theme_installer.py | 1 | CODE | |
| LOW | tests/internals/test_effect_utils.py | 1 | CODE | |
| LOW | tests/internals/test_install_source.py | 1 | CODE | |
| LOW | tests/api/test_extension.py | 1 | CODE | |
| LOW | tests/data/test_json_key_value_conf.py | 1 | CODE | |
| LOW | tests/data/test_json_conf.py | 1 | CODE | |
| LOW | ulauncher/init_helpers.py | 1 | CODE | |
| LOW | ulauncher/__init__.py | 4 | CODE | |
| LOW | ulauncher/core.py | 1 | CODE | |
| LOW | ulauncher/gi.py | 12 | CODE | |
| LOW | ulauncher/gi.py | 25 | CODE | |
| LOW | ulauncher/ui/results_view.py | 1 | CODE | |
| LOW | ulauncher/ui/hotkey_dialog.py | 1 | CODE | |
| LOW | ulauncher/ui/load_icon_surface.py | 1 | CODE | |
| LOW | ulauncher/ui/ulauncher_window.py | 1 | CODE | |
| LOW | ulauncher/ui/app.py | 1 | CODE | |
| LOW | ulauncher/ui/result_widget.py | 1 | CODE | |
| LOW | ulauncher/ui/get_icon_path.py | 1 | CODE | |
| LOW | ulauncher/ui/preferences/preferences_window.py | 1 | CODE | |
| LOW | ulauncher/ui/preferences/preferences_window.py | 17 | CODE | |
| LOW | ulauncher/ui/preferences/utils/ext_utils.py | 1 | CODE | |
| LOW | ulauncher/ui/preferences/utils/ext_handlers.py | 1 | CODE | |
| LOW | ulauncher/ui/preferences/utils/sidebar_layout.py | 1 | CODE | |
| 110 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ulauncher/__init__.py | 6 | __all__ = ["version"] | CODE |
| LOW | ulauncher/core.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/core.py | 104 | def set_query(self, query_str: str, callback: ResultsCallback) -> None: | CODE |
| LOW | ulauncher/gi.py | 31 | __all__ = [ | CODE |
| LOW | ulauncher/gi.py | 195 | def _setup_gio_unix() -> None: | CODE |
| LOW | ulauncher/ui/results_view.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/ui/results_view.py | 53 | def set_max_height(self, height: int) -> None: | CODE |
| LOW | ulauncher/ui/hotkey_dialog.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/ui/hotkey_dialog.py | 43 | def set_hotkey(self, key_name: str = "") -> None: | CODE |
| LOW | ulauncher/ui/load_icon_surface.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/ui/ulauncher_window.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/ui/ulauncher_window.py | 404 | def update_results_max_height(self) -> None: | CODE |
| LOW | ulauncher/ui/ulauncher_window.py | 453 | def set_input(self, query_str: str) -> None: | CODE |
| LOW | ulauncher/ui/app.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/ui/app.py | 68 | def set_query(self, value: str, update_input: bool = True) -> None: | CODE |
| LOW | ulauncher/ui/result_widget.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/ui/result_widget.py | 115 | def set_index(self, index: int) -> None: | CODE |
| LOW | ulauncher/ui/get_icon_path.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/ui/preferences/preferences_window.py | 100 | def update_restart_banner(self) -> None: | CODE |
| LOW | ulauncher/ui/preferences/preferences_window.py | 138 | def _setup_keybindings(self) -> None: | CODE |
| LOW | ulauncher/ui/preferences/preferences_window.py | 154 | def _setup_custom_styling(self) -> None: | CODE |
| LOW | ulauncher/ui/preferences/utils/ext_handlers.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/ui/preferences/utils/ext_handlers.py | 159 | def update_extension(self, ext: ExtensionRecord, callback: Callable[[], None]) -> None: | CODE |
| LOW | ulauncher/ui/preferences/utils/sidebar_layout.py | 81 | def set_items(self, items: Sequence[SidebarItem], active_item_id: str | None = None) -> None: | CODE |
| LOW | ulauncher/ui/preferences/utils/sidebar_layout.py | 118 | def set_empty_placeholder_builder(self, builder: Callable[[], Gtk.Widget] | None) -> None: | CODE |
| LOW | ulauncher/ui/preferences/utils/sidebar_layout.py | 253 | def set_content(self, widget: Gtk.Widget) -> None: | CODE |
| LOW | ulauncher/ui/preferences/views/shortcuts.py | 362 | def _update_icon_button(self) -> None: | CODE |
| LOW | ulauncher/ui/preferences/views/preferences.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/ui/preferences/views/__init__.py | 78 | def set_text(self, text: str) -> None: | CODE |
| LOW | ulauncher/ui/preferences/views/extensions.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/ui/helpers/tray_icon.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/ui/helpers/monitor.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/ui/helpers/theme.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/ui/helpers/hotkey_controller.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/ui/helpers/hotkey_controller.py | 22 | def _set_hotkey(hotkey: str) -> None: | CODE |
| LOW | ulauncher/ui/helpers/layer_shell.py | 46 | def set_vertical_position(window: Gtk.Window, pos_y: float) -> None: | CODE |
| LOW | ulauncher/modes/extensions/extension_registry.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/extensions/extension_manifest.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/extensions/extension_mode.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/extensions/extension_runtime.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/extensions/extension_record.py | 68 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/extensions/extension_service.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/extensions/extension_dependencies.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/calc/calc_mode.py | 84 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/file_browser/file_browser_mode.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/file_browser/open_with.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/shortcuts/run_script.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/shortcuts/shortcut_mode.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/apps/app_result.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/apps/launch_app.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/apps/try_raise_app.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/modes/apps/app_mode.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/utils/dbus.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/utils/launch_detached.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/utils/v5_killer.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/utils/fs.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/utils/environment.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/utils/scheduling.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/utils/eventbus.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | ulauncher/utils/eventbus.py | 31 | def set_self(self, self_arg: Any) -> None: | CODE |
| 23 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ulauncher/core.py | 68 | CODE | |
| LOW | ulauncher/core.py | 242 | CODE | |
| LOW | ulauncher/core.py | 252 | CODE | |
| LOW | ulauncher/ui/app.py | 353 | CODE | |
| LOW | ulauncher/ui/result_widget.py | 144 | CODE | |
| LOW | ulauncher/ui/preferences/utils/ext_handlers.py | 196 | CODE | |
| LOW | ulauncher/ui/preferences/views/extensions.py | 585 | CODE | |
| LOW | ulauncher/ui/helpers/hotkey_controller.py | 22 | CODE | |
| LOW | ulauncher/modes/extensions/extension_manifest.py | 72 | CODE | |
| LOW | ulauncher/modes/extensions/extension_finder.py | 46 | CODE | |
| LOW | ulauncher/modes/extensions/extension_mode.py | 219 | CODE | |
| LOW | ulauncher/modes/extensions/extension_runtime.py | 185 | CODE | |
| LOW | ulauncher/modes/extensions/extension_record.py | 55 | CODE | |
| LOW | ulauncher/modes/file_browser/file_browser_mode.py | 63 | CODE | |
| LOW | ulauncher/modes/file_browser/file_browser_mode.py | 118 | CODE | |
| LOW | ulauncher/modes/apps/launch_app.py | 47 | CODE | |
| LOW | ulauncher/modes/apps/try_raise_app.py | 10 | CODE | |
| LOW | ulauncher/utils/settings.py | 53 | CODE | |
| LOW | ulauncher/utils/migrate.py | 87 | CODE | |
| LOW | ulauncher/internals/effect_utils.py | 61 | CODE | |
| LOW | ulauncher/data/json_key_value_conf.py | 20 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | ulauncher/ui/preferences/preferences_window.py | 47 | # Create the main UI | COMMENT |
| MEDIUM | ulauncher/ui/preferences/preferences_window.py | 57 | # Create main container | COMMENT |
| MEDIUM | ulauncher/ui/preferences/views/preferences.py | 97 | # Create main container - centers on wide screens, fills on narrow screens | COMMENT |
| MEDIUM | ulauncher/ui/preferences/views/extensions.py | 241 | # Create a vertical box for authors and updated date | COMMENT |
| MEDIUM | ulauncher/ui/preferences/views/help.py | 65 | # Create a horizontal box for each link | COMMENT |
| MEDIUM | ulauncher/utils/untar.py | 9 | # This function is the same as Path.is_relative_to in 3.9, but we can't use that yet | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | ulauncher/ui/preferences/views/extensions.py | 259 | except (ValueError, AttributeError): | CODE |
| HIGH | ulauncher/modes/calc/calc_mode.py | 204 | except SyntaxError: | CODE |
| HIGH | ulauncher/modes/file_browser/open_with.py | 25 | except GLib.Error: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/modes/calc/test_calc_mode.py | 0 | helper to collect results from callback-based handle_query. | STRING |
| HIGH | tests/modes/file_browser/test_file_browser_mode.py | 0 | helper to collect results from callback-based handle_query. | STRING |
| HIGH | tests/modes/shortcuts/test_shortcut_mode.py | 0 | helper to collect results from callback-based handle_query. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | ulauncher/gi.py | 37 | # ─── GioUnix compatibility namespace ────────────────────────────────────────── | COMMENT |
| MEDIUM | ulauncher/gi.py | 95 | # ─── DesktopAppInfo wrapper ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | ulauncher/gi.py | 192 | # ─── Deferred setup functions ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | ulauncher/gi.py | 230 | # ─── Lazy loader (PEP 562) ──────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ulauncher/core.py | 177 | except Exception: | CODE |
| LOW | ulauncher/modes/extensions/extension_service.py | 200 | except Exception: | CODE |
| LOW | ulauncher/utils/scheduling.py | 49 | except Exception: | CODE |
| LOW | ulauncher/utils/eventbus.py | 55 | except Exception: | CODE |
| LOW | ulauncher/utils/json_utils.py | 77 | except Exception: | CODE |
| LOW | ulauncher/utils/socket_msg_controller.py | 115 | except Exception: | CODE |
| LOW | ulauncher/api/extension.py | 203 | except Exception: | CODE |
| LOW | ulauncher/api/extension.py | 227 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/modes/extensions/test_extension_lifecycle.py | 165 | # rebind the event bus to the module singleton; the harness service took over the binding | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ulauncher/gi.py | 41 | # * GioUnix was originally a namespace for aliases to Unix-specific functionality in the Gio namespace. | COMMENT |
| LOW | ulauncher/gi.py | 61 | # | COMMENT |
| LOW | ulauncher/ui/ulauncher_window.py | 81 | "Layer shell is not supported. If you have issues with window positioning, " | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/api/test_extension.py | 89 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/draft-release.yml | 33 | # make sure to run make sdist after make deb because make deb overwrites the tarball | COMMENT |
| LOW | ulauncher/utils/ewmh.py | 38 | When a property is written, don't forget to really send the notification by | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ulauncher/utils/migrate.py | 68 | # Check if already migrated | COMMENT |