ZIm/crates
Thorsten Ball 64755a7aea
linux/x11: Custom run loop with mio instead of calloop (#13646)
This changes the implementation of the X11 client to use `mio`, as a
polling mechanism, and a custom run loop instead of `calloop` and its
callback-based approach.

We're doing this for one big reason: more control over how we handle
events.

With `calloop` we don't have any control over which events are processed
when and how long they're processes for. For example: we could be
blasted with 150 input events from X11 and miss a frame while processing
them, but instead of then drawing a new frame, calloop could decide to
work off the runnables that were generated from application-level code,
which would then again cause us to be behind.

We kinda worked around some of that in
https://github.com/zed-industries/zed/pull/12839 but the problem still
persists.

So what we're doing here is to use `mio` as a polling-mechanism. `mio`
notifies us if there are X11 on the XCB connection socket to be
processed. We also use its timeout mechanism to make sure that we don't
wait for events when we should render frames.

On top of `mio` we now have a custom run loop that allows us to decide
how much time to spend on what — input events, rendering windows, XDG
events, runnables — and in what order we work things off.

This custom run loop is consciously "dumb": we render all windows at the
highest frame rate right now, because we want to keep things predictable
for now while we test this approach more. We can then always switch to
more granular timings. But considering that our loop runs and checks for
windows to be redrawn whenever there's an event, this is more an
optimization than a requirement.

One reason for why we're doing this for X11 but not for Wayland is due
to how peculiar X11's event handling is: it's asynchronous and by
default X11 generates synthetic events when a key is held down. That can
lead to us being flooded with input events if someone keeps a key
pressed.

So another optimization that's in here is inspired by [GLFW's X11 input
handling](b35641f4a3/src/x11_window.c (L1321-L1349)):
based on a heuristic we detect whether a `KeyRelease` event was
auto-generated and if so, we drop it. That essentially halves the amount
of events we have to process when someone keeps a key pressed.

Release Notes:

- N/A

---------

Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
Co-authored-by: Conrad <conrad@zed.dev>
2024-07-03 17:05:26 +02:00
..
activity_indicator Make LSP task cancellation discoverable (#13226) 2024-06-18 12:44:35 -07:00
anthropic Make Claude 3.5 the default Anthropic model (#13324) 2024-06-21 18:47:38 +02:00
assets Move from Zed fonts to IBM Plex (#13596) 2024-06-27 14:36:44 -06:00
assistant Allow extensions to define providers for indexing docs (#13755) 2024-07-02 19:49:20 -04:00
assistant_slash_command assistant: Include worktree name in diagnostics slash command (#13354) 2024-06-21 11:48:52 +02:00
assistant_tooling Bring the Tool Calling README up to date (#11683) 2024-05-12 04:47:19 -07:00
audio Make tests less noisy (#12463) 2024-05-29 18:06:45 -07:00
auto_update auto-updates: Do not poll for updates on dev channel (#13311) 2024-06-20 15:00:54 +02:00
breadcrumbs Add more menus to Zed (#12940) 2024-06-18 12:16:54 -07:00
call Remove never-used client parameter from message handler functions (#13406) 2024-06-22 16:07:36 -07:00
channel Remove never-used client parameter from message handler functions (#13406) 2024-06-22 16:07:36 -07:00
cli Stop relying on binary location to be in libexec on Linux (#13374) 2024-06-26 13:00:52 -06:00
client Send telemetry events for pnpm usage (#13748) 2024-07-02 13:59:26 -04:00
clock Use iterators instead of loops in clock.rs (#13561) 2024-06-27 09:30:21 +03:00
collab Log extension queries to axiom (#13752) 2024-07-02 15:24:56 -06:00
collab_ui Extract title_bar crate (#13597) 2024-06-27 19:14:13 -04:00
collections gpui: Add SVG rendering to img element and generic asset cache (#9931) 2024-03-29 17:09:49 -07:00
command_palette Use UpdateGlobal accessors in more places (#11925) 2024-05-16 13:30:04 -04:00
command_palette_hooks Introduce InlineCompletionProvider (#9777) 2024-03-26 13:28:06 +01:00
copilot paths: Replace lazy_static! with OnceLock (#13213) 2024-06-18 12:22:37 -04:00
db paths: Replace lazy_static! with OnceLock (#13213) 2024-06-18 12:22:37 -04:00
dev_server_projects Remove never-used client parameter from message handler functions (#13406) 2024-06-22 16:07:36 -07:00
diagnostics vim: Empty pane improvements (#13624) 2024-06-27 21:54:03 -06:00
editor Fix auto-rename ranges with special characters (#13719) 2024-07-01 23:58:10 +02:00
extension Rename ExtensionDocsIndexer to ExtensionIndexedDocsProvider (#13776) 2024-07-03 10:14:57 -04:00
extension_api Allow extensions to define providers for indexing docs (#13755) 2024-07-02 19:49:20 -04:00
extension_cli extension_cli: Allow building without dynamically linking WebRTC (#13080) 2024-06-14 20:13:31 -04:00
extensions_ui ui: Use PopoverMenu::new for constructing PopoverMenus (#13178) 2024-06-17 18:14:37 -04:00
feature_flags assistant: Feature flag terminal inline assistant (#13732) 2024-07-02 11:47:11 +02:00
feedback Refine inline transformation UX (#12939) 2024-06-13 08:35:22 +02:00
file_finder Fix a prompt typo (#13416) 2024-06-23 07:39:01 -04:00
file_icons Make tests less noisy (#12463) 2024-05-29 18:06:45 -07:00
fs paths: Replace lazy_static! with OnceLock (#13213) 2024-06-18 12:22:37 -04:00
fsevent Retain run loop (#11241) 2024-04-30 23:31:59 -06:00
fuzzy Introduce an outline panel (#12637) 2024-06-12 23:22:52 +03:00
git Introduce an outline panel (#12637) 2024-06-12 23:22:52 +03:00
git_hosting_providers Extract http from util (#11680) 2024-05-10 15:50:20 -06:00
go_to_line Add more menus to Zed (#12940) 2024-06-18 12:16:54 -07:00
google_ai Respect requested gemini model (#13427) 2024-06-23 14:10:31 -06:00
gpui linux/x11: Custom run loop with mio instead of calloop (#13646) 2024-07-03 17:05:26 +02:00
gpui_macros gpui_macros: Disable doctests (#13015) 2024-06-13 18:45:28 -04:00
headless Remove never-used client parameter from message handler functions (#13406) 2024-06-22 16:07:36 -07:00
html_to_markdown Publish html_to_markdown (#13718) 2024-07-01 17:18:58 -04:00
http zed_extension_api: Add github_release_by_tag_name (#12172) 2024-05-22 20:40:31 -04:00
image_viewer Make tests less noisy (#12463) 2024-05-29 18:06:45 -07:00
indexed_docs Allow extensions to define providers for indexing docs (#13755) 2024-07-02 19:49:20 -04:00
inline_completion_button paths: Replace lazy_static! with OnceLock (#13213) 2024-06-18 12:22:37 -04:00
install_cli Fix flickering (#9012) 2024-03-11 10:45:57 +01:00
journal Add the ability for extensions to provide language settings (#10296) 2024-04-08 19:17:12 -04:00
language tasks: Add experimental support for user-defined task variables (#13699) 2024-07-01 15:59:19 +02:00
language_selector Move Clippy configuration to the workspace level (#8891) 2024-03-05 12:01:17 -05:00
language_tools ui: Use PopoverMenu::new for constructing PopoverMenus (#13178) 2024-06-17 18:14:37 -04:00
languages JSON: Fix validation being disabled following #13459 (#13770) 2024-07-03 11:17:20 +02:00
live_kit_client extension_cli: Allow building without dynamically linking WebRTC (#13080) 2024-06-14 20:13:31 -04:00
live_kit_server Vendor LiveKit protocol (#11672) 2024-05-10 14:18:40 -04:00
lsp Demote LSP request time log to trace level 2024-06-22 15:59:53 -07:00
markdown Move from Zed fonts to IBM Plex (#13596) 2024-06-27 14:36:44 -06:00
markdown_preview Refine inline transformation UX (#12939) 2024-06-13 08:35:22 +02:00
media Revert "Revert "Revert dependency updates in #9836 (#10089)"" 2024-04-02 13:12:38 -06:00
menu Fix the linux keymap (#9829) 2024-03-26 16:10:09 -07:00
multi_buffer Combine multiple buffer update count fields into one (#13449) 2024-06-23 22:20:10 -07:00
node_runtime JSON: Show package.json dependency tooltips on hover (#13481) 2024-06-25 14:59:29 +02:00
notifications Remove never-used client parameter from message handler functions (#13406) 2024-06-22 16:07:36 -07:00
ollama Allow Ollama Model KeepAlive to be None, defaulting to indefinite (#13059) 2024-06-14 10:33:28 -07:00
open_ai Add the ability to customize available models for OpenAI-compatible services (#13276) 2024-06-25 16:37:02 -04:00
outline Add more menus to Zed (#12940) 2024-06-18 12:16:54 -07:00
outline_panel Slightly improve project panel ergonomics (#13704) 2024-07-01 19:36:20 +03:00
paths settings: Load .zed/settings.json even if .gitignored (#13370) 2024-06-21 18:39:14 +02:00
picker Fix: Picker select_last not scrolling to item index (#13393) 2024-06-23 09:36:52 +02:00
prettier Fix Prettier parser values when formatting files with paths (#13666) 2024-06-29 11:37:22 +03:00
project tasks: Add experimental support for user-defined task variables (#13699) 2024-07-01 15:59:19 +02:00
project_panel project panel: Respect y offset of a click-and-drag on a scrollbar (#13506) 2024-06-25 14:20:37 +02:00
project_symbols Add more menus to Zed (#12940) 2024-06-18 12:16:54 -07:00
proto Allow canceling in-progress language server work (e.g. cargo check) (#13173) 2024-06-17 17:58:47 -07:00
quick_action_bar Reorganize Quick Action Bar (#13476) 2024-06-24 15:34:22 -04:00
recent_projects Move from Zed fonts to IBM Plex (#13596) 2024-06-27 14:36:44 -06:00
refineable Move Clippy configuration to the workspace level (#8891) 2024-03-05 12:01:17 -05:00
release_channel auto-updates: Do not poll for updates on dev channel (#13311) 2024-06-20 15:00:54 +02:00
repl Bump image crate (#13397) 2024-06-25 15:12:45 +02:00
rich_text New revision of the Assistant Panel (#10870) 2024-04-23 16:23:26 -07:00
rope Indent guides (#11503) 2024-05-23 15:50:59 +02:00
rpc Dynamicer builds (#13074) 2024-06-21 16:32:32 -07:00
search Use user-defined font weight, where appropriate (#13653) 2024-07-01 09:45:01 -04:00
semantic_index Refactor: Make it possible to share a remote worktree (#12775) 2024-06-07 12:53:01 -07:00
semantic_version Extract SemanticVersion into its own crate (#9956) 2024-03-29 12:11:57 -04:00
settings paths: Replace lazy_static! with OnceLock (#13213) 2024-06-18 12:22:37 -04:00
snippet html: Add support for autoclosing of tags (#11761) 2024-05-20 17:00:27 +02:00
sqlez Dynamicer builds (#13074) 2024-06-21 16:32:32 -07:00
sqlez_macros Dynamicer builds (#13074) 2024-06-21 16:32:32 -07:00
story Introduce a new markdown crate (#11556) 2024-05-09 11:03:33 +02:00
storybook Extract title_bar crate (#13597) 2024-06-27 19:14:13 -04:00
sum_tree Introduce Editor::insert_flaps and Editor::remove_flaps (#12096) 2024-05-21 20:23:37 +02:00
supermaven Reduce spamming of inline completion discard events (#11999) 2024-05-17 16:37:17 -04:00
supermaven_api paths: Replace lazy_static! with OnceLock (#13213) 2024-06-18 12:22:37 -04:00
tab_switcher Introduce recent files ambient context for assistant (#11791) 2024-05-14 13:48:36 +02:00
task task: Add re-run task button to terminal title (#12379) 2024-05-29 11:40:43 +02:00
tasks_ui task: Rebind UseSelectedQuery in modal to F2 (#12601) 2024-06-03 12:52:44 +02:00
telemetry_events Add metrics_id to editor_events (#13525) 2024-06-25 16:47:55 -04:00
terminal Add terminal inline assistant (#13638) 2024-07-01 20:53:56 +02:00
terminal_view Fix focusing terminal when running tasks (#13675) 2024-07-02 10:57:54 +03:00
text Refine inline transformation UX (#12939) 2024-06-13 08:35:22 +02:00
theme Add more menus to Zed (#12940) 2024-06-18 12:16:54 -07:00
theme_importer Hoist indexmap to workspace level (#12901) 2024-06-11 15:31:55 -04:00
theme_selector Use UpdateGlobal accessors in more places (#11925) 2024-05-16 13:30:04 -04:00
time_format Inline git blame (#10398) 2024-04-15 14:21:52 +02:00
title_bar Update Platform Controls (#13751) 2024-07-02 16:15:59 -04:00
ui Update Platform Controls (#13751) 2024-07-02 16:15:59 -04:00
ui_text_field Allow UI font weight to be assigned in settings (#12333) 2024-05-26 23:06:58 -06:00
util Associate logs from log_err with the calling crate (#13617) 2024-06-27 17:03:47 -07:00
vcs_menu vcs_menu: Fix header taking up too much space (#12646) 2024-06-04 19:13:21 +02:00
vim vim: Support for q and @ (#13761) 2024-07-03 09:03:39 -06:00
welcome Pull app / OS info out of GPUI, add Linux information, make fallible window initialization (#12869) 2024-06-11 11:43:12 -07:00
workspace search: Improve performance of replace_all (#13654) 2024-06-28 19:06:44 +02:00
worktree Fix a bug introduced by #13479 (#13516) 2024-06-25 10:03:29 -07:00
zed Move from Zed fonts to IBM Plex (#13596) 2024-06-27 14:36:44 -06:00
zed_actions Add more menus to Zed (#12940) 2024-06-18 12:16:54 -07:00