Commit graph

1580 commits

Author SHA1 Message Date
Wu Shuwen ade2d9cda7
fix: synchronize bundle metadata version with 0.16.2 (#3566) 2026-09-05 14:08:20 +02:00
Morax d5f6810095
fix: render COLRv1 fonts on Linux (#3544)
Some checks failed
Lint Website / Lint website (push) Has been cancelled
Build and Publish Website / Build Website (push) Has been cancelled
Build and Publish Website / Generate Sitemap (push) Has been cancelled
Build and Publish Website / Publish Website (push) Has been cancelled
* fix: render COLRv1 fonts on Linux

---------

Co-authored-by: Alexsander Falcucci <alex.falcucci@gmail.com>
2026-09-05 00:52:17 +02:00
Alexsander Falcucci 02a06c6699
profile scroll command pressure without tracy fibers (#3561)
tracy fibers describe execution on one native thread, but tokio tasks are
owned by the scheduler and can move across runtime threads after an await.
that made the old serial command instrumentation invalid.

also we add a profiling only scroll metric for what we actually need to
compare for the follow up patch targeting batch wheel scrolls.

error

  Instrumentation failure: Fiber execution stopped on a thread which is not executing a fiber.
2026-09-02 16:04:00 +02:00
Alexsander Falcucci 0f18a8775f
bump skia-safe to 0.99.0 (#3560) 2026-09-01 12:29:13 +02:00
Morax b756bc557d
fix: ignore unrelated config directory events (#3545)
Co-authored-by: Alexsander Falcucci <alex.falcucci@gmail.com>
2026-08-29 02:22:00 +02:00
Alexsander Falcucci 92e4d46d86
swap the drained vector out using std::mem::take (#3559)
fix clippy errors
2026-08-29 01:50:58 +02:00
Alexsander Falcucci ba8c41f423
handle neovim bufwrite progress events (#3546)
Some checks failed
Lint Website / Lint website (push) Has been cancelled
Build and Publish Website / Build Website (push) Has been cancelled
Build and Publish Website / Generate Sitemap (push) Has been cancelled
Build and Publish Website / Publish Website (push) Has been cancelled
after some debugging, stable and nightly currently encode buffer writes
differently meaning that stable has something like:

    {
      data = ...,
      id = "bufwrite",
      percent = 0,
      source = "nvim",
      status = "running",
      text = { '[file-path]' },
      title = ""
    }

against the current nightly

    {
      data = ...,
      id = 'nvim.bufwrite "[file-path]"',
      source = "nvim",
      status = "running",
      text = { '"[file-path]" ' },
      title = ""
    }

so missing percentages now finish the active progress item instead of starting
a 0% animation, while determinate progress continues to animate by id.

for example now we will show the progress bar only when a neovim producer
(a plugin or any process event that uses nvim_echo) sends a real determinate percent.

    vim.api.nvim_echo({ { "my-progress-bar." } }, true, {
      kind = "progress",
      id = "neovide-task",
      source = "plugin-name",
      percent = 25,
      status = "running",
    })
2026-08-12 01:03:06 +02:00
Kaylee Simmons b56abb653a
Improve cursor animations when jumping along cardinal directions. Animate cursor in the context of the window scroll delta keeping the cursor tighter to the window when the only movement is due to a scroll. Fix formatting error in Cargo.toml (#3543) 2026-08-08 20:01:36 -07:00
Marek Langiewicz 7f90c1276c
ci: fix AppImage updates for nightly builds (#3535) 2026-07-26 15:41:15 +02:00
27Onion Nebell 7af518d72c
fix: parsing neovim api function parameters (#3530)
* fix: parsing neovim api function parameters

Fix neovim API parsing failure after dc8934482e.

* refactor api parameter type parsing

---------

Co-authored-by: Alexsander Falcucci <alex.falcucci@gmail.com>
2026-07-21 00:53:15 +02:00
Alexsander Falcucci 9477f53a9c
macOS: add a custom native Editors window switcher (#3527)
we are now replacing the native tabs switcher into a Neovide-owned custom editor switcher.

Why?

The native tab overview was a temporary choice for this feature. 

editors should be about moving between Neovide editors without limitations,
but tying it to the system tabs overview made the behavior depend on whether native
tabs to be enabled, plus hacking to make it work properly not affecting separate
windows. 

users who prefers separate-window has been forced to merge
and detach windows just to present a choice to switcher windows easier which
made the single-window case fall back to pinned-window toggling. That
was a known gap.

now with a Neovide-owned custom switcher it gives both modes the
outcome.

NOTE: behavior-wise shouldn't change, besides the switcher appearing now even
for separate-window mode.
2026-07-18 01:25:19 +02:00
Alexsander Falcucci 618605b79d
add startup-message capture settings (#3517)
Some checks failed
Lint Website / Lint website (push) Has been cancelled
Build and Publish Website / Build Website (push) Has been cancelled
Build and Publish Website / Generate Sitemap (push) Has been cancelled
Build and Publish Website / Publish Website (push) Has been cancelled
neovide started temporarily requesting external messages in #3504 so
startup errors from #3499 would not disappear behind a hit-enter prompt
before the first grid was rendered.

losing early startup errors is a bad failure mode and users should not have to
guess why Neovim is stuck before neovide has a real message area.

but this also made neovide advertise ext_messages and ext_cmdline during
plugin startup. noice.nvim explicitly checks nvim_list_uis() before
attaching its own UI and refuses to handle messages or the cmdline when
another UI client already owns those extensions.
2026-06-17 09:58:13 +02:00
Alexsander Falcucci 090851dc76
bump skia-safe to 0.97.2 (#3510) 2026-06-02 16:46:39 +02:00
windexlight 8c48a699e2
windows: fix overlapped pipe read crash (#3505)
* windows: fix overlapped pipe read crash

* improve windows stdio pipe handling documentation

---------

Co-authored-by: Alexsander Falcucci <alex.falcucci@gmail.com>
2026-05-16 16:34:22 +02:00
Alexsander Falcucci 98ff6127c7
fix: surface startup errors before first grid - 0.12+ only (#3504)
neovim can hit wait-return during startup before the first grid update. at that point
we have no message area to show the error and no useful window to accept the Enter
that would let startup continue.

now temporarily we request external messages during startup, capture msg_show events until the
first rendered batch, restore the built-in message and cmdline UI, then replay the captured
messages through nvim_echo without duplicating message history.

we keep this path gated to nvim 0.12+, since 0.10/0.11 externalize cmdline prompts in ways
we do not render during startup, so we preserve cmdheight across the temporary external-message
mode where the startup capture does not silently rewrite the user's message area.
2026-05-13 14:42:29 +02:00
Alexsander Falcucci dfc854bd91
fix event loop CPU spin without deadline (#3503)
the old fallback mapped None to WaitUntil(now), which asks the
event loop to wake up immediately. during startup, if nvim blocks before
the first render state exists, that turns into a tight CPU loop.

the error-window special case was the wrong abstraction: no deadline
should mean idle wait, regardless of why there is no render deadline.

we keep WaitUntil only for real deadlines and use Wait otherwise.
2026-05-09 20:58:42 +02:00
Alexsander Falcucci fdd02c24ff
bump skia-safe to 0.97 (#3501) 2026-05-04 16:35:14 +02:00
Alexsander Falcucci 2fed95572f
fix: avoid fullscreen on new tab windows if already set (#3496)
the second fullscreen transition is what previously made
the AppKit assertion wrongly. 

```
Assertion failure in -[NSWindowStackController _enterWindow:intoFullScreenWithWindow:]
```

If the host window is already fullscreen, reapplying the
global fullscreen setting to the new window is redundant.

now we just resolve the initial fullscreen state for new
windows more carefully: if the new window is being created from a
fullscreen native-tab host, we skip the initial fullscreen call for
that secondary window and leave the host alone.

since its state is already fullscreen, the new window will be created in
a normal state and then transition to fullscreen immediately after.
2026-04-26 00:26:36 +02:00
Alexsander Falcucci 510d7f1b8a
macos: add system window proxy icon support (#3494)
driven by the document state, we are using the NSWindow
representedFilename API's to sync the current buffer state.
2026-04-23 20:00:27 +02:00
Ole c8b801493a
feat: settings for menu shortcuts on macOS (#3481)
* feat: settings for menu shortcuts on macOS

---------

Co-authored-by: Alexsander Falcucci <alex.falcucci@gmail.com>
2026-04-22 11:26:25 +02:00
Alexsander Falcucci b5363a36b7
chore: update rust edition to 2024 (#3489) 2026-04-20 23:03:33 +02:00
Alexsander Falcucci 99a62e5ab5
fix: track reasonable cmdline modes and reset springs on immediate cursor moves (#3484)
the cursor setting neovide_cursor_animate_command_line was broken

see https://github.com/neovide/neovide/discussions/3180

first,

neovim has three actual editing modes:
- cmdline_normal
- cmdline_insert
- cmdline_replace
- cmdline_hover (ignored, mouse shape state, not editing mode)

secondly,

the immediate movement wasn't actually immediate. we snapped the cursor position,
but left the corner springs alive, so the next frame resumed animating and
produced the trail we were supposed to suppress.

we basically now reset the spring state when movement is forced immediate.

there is also a ui2 incompatibility that we fix. (experimental)

with ui2, leaving the cmdline is not a single clean mode transition.

neovim leaves MODE_CMDLINE first, then ui2
redraws the cursor in its cmdline float one more time before the cursor
returns to the real editing window. A plain previous_mode/current_mode
check misses that last hop.

we fix that by tracking a small cmdline cursor context in the renderer,
so the final ui2 exit hop is still treated as part of the cmdline transition.
2026-04-19 05:59:19 +02:00
Alexsander Falcucci 8355b0c985
fix: panicking on zero-height grids (#3487)
zero-height grids happen during relayout. doing modulo by zero
in the ring buffer just made it break.
2026-04-19 05:52:15 +02:00
Alexsander Falcucci 7c3505eaf0
fix clippy warnings after new rust stable version (#3485) 2026-04-17 20:23:07 +02:00
Ryan Patterson 04fcd7ac24
handoff: add neovim-bin and neovim arguments (#3440)
* handoff: pass neovim_bin and neovim_args

* handoff: keep route cwd on duplicate windows

since duplicating a window now takes with it its neovim bin/args, it's
reasonable to keep also its route cwd as well to not sound incomplete.

---------

Co-authored-by: Alexsander Falcucci <alex.falcucci@gmail.com>
2026-04-16 00:31:42 +02:00
Alexsander Falcucci d2d6ebd4ee
chore: prepare release 0.16.2 (#3478) 2026-04-14 21:16:16 +02:00
pvxx 40391b4a30
fix: keypad * mapping (use NumpadMultiply instead of NumpadStar) (#3477) 2026-04-14 20:56:55 +02:00
Alexsander Falcucci 05e823020f
ui2: don't let resize restore hidden grids (#3476)
*A grid having a size is not the same thing as that grid being visible*

the experimental ui2 just exposed an assumption that we were doing.

See #3446

A resize tells us that a grid exists and what size it has. It does not
tell us that the grid is actually visible. Those seems to be different
states from neovim, and we were treating them as if they were the same.

For a new non-root grid that first appeared through a resize, we would
instantiate a window immediately. That construction also gave it a
position, and the renderer then treated that position update as if it
meant to show that window. That logic only works if every resized grid is
supposed to become visible right away.

hidden helper windows can be resized long before neovim decides to place
or show them. which seems to be the case now on ui2. So our old behavior
could restore a window that neovim still considered hidden, which is why
the wrong border and stale helper window would leak on startup and
again after resizing.
2026-04-14 18:49:30 +02:00
Alexsander Falcucci afb366be0c
docs: update tracy dependency instructions (#3472) 2026-04-13 22:50:52 +02:00
Alexsander Falcucci 473504a49e
performance: stop retrying invalid fallback entries on shape-cache misses (#3468)
mainly linux users affected but users who doesnt explicitly set 'guifont'
and doesn't have the default upstream list installed could notice some
slowness.

see https://github.com/neovide/neovide/issues/3457

font loading is very fast but expensive if we do redundant stuff.

neovim now sends platform-specific default 'guifont' fallback lists.

on affected systems the first entry in that list may not be installed,
but Neovide still keeps it in the active fallback chain and probes it
again on every shape-cache miss. That turns a normal miss into repeated
redundant load_font churn before we ever get to a font that can actually
render the text.

we now fix that in two ways:

 - remember FontKeys that already failed to load;
 - drop failed normal guifont entries from the cache fallback list
   after validation, so the miss path stops re-searching fallback chains
   around fonts we already rejected
2026-04-10 12:36:53 +02:00
Ryan Patterson 1e286a3921
fix: handle nvim-initiated too-large resizes (#3439) 2026-04-07 22:33:09 +02:00
Alexsander Falcucci 084db1b141
chore: prepare release 0.16.1 (#3456) 2026-04-04 17:57:02 +02:00
Alexsander Falcucci a672a0635e
fix: preserve cwd on login-shell launches (#3455)
if we want an explicit cwd to be respected, it has to be part of the
actual command executed by the non interactive login.

So we do the following now:

- resolve the cwd once before building the command spec
- pass that cwd into the command builder
- emit cd <cwd> && exec <command> for desktop launches
- keep the terminal-launch path unchanged
2026-04-04 17:24:33 +02:00
Alexsander Falcucci 09dd277429
fix: treat clipboard failure as a state, not as fatal (#3454)
previously we assumed that clipboard support was always there, so
unwrap() was inappropriate meaning that if the clipboard provider failed to
initialize, we panicked.

todo: in fact we should ERASE all unwrap() from the codebase if not tests.

so to model the thing we actually have:

  - a clipboard provider that *can* be available
  - or it can be unavailable, with a reason

x11 PRIMARY vs CLIPBOARD selections
see https://specifications.freedesktop.org/clipboard-spec/1.0

x11 display connection is explicit and may fail
see https://www.x.org/archive/X11R7.5/doc/man/man3/XOpenDisplay.3.html

wayland display is an explicit compositor connection and connect can fail
see https://wayland.freedesktop.org/docs/html/apb.html
2026-04-04 05:17:43 +02:00
Alexsander Falcucci 3b5062625a
fix: split startup preflight from runtime setup (#3453) 2026-04-04 01:02:31 +02:00
Alexsander Falcucci 0d7483c8f0
fix: apply neovide_scale_factor at startup and on updates correctly (#3451)
see: https://github.com/neovide/neovide/issues/3447

after the multi-window refactor, the renderer can be created before
neovim initial globals are ready.

the runtime path had a second bug:
scale factor updates through settings updates stored the new user scale
and then recomputed the grid scale with the old one. so scale changes were
always one step behind also reported at
https://github.com/neovide/neovide/issues/3447
2026-04-02 22:59:42 +02:00
Alexsander Falcucci 4ca822524e
fix: expand tilde in chdir on config (#3449)
the bug is that the common startup path that picks the child cwd was assuming
that every caller had already normalized the path.
2026-04-02 02:17:25 +02:00
Alexsander Falcucci 4a954a4958
fix: defer cold-start file drops until ui_attach completes (#3448)
the real problem is that neovim handle wasnt really ready yet. The queued file-open events
e.g from finder were being flushed as soon as the first handler registered,
but the handler registration happens before ui_attach and in embedded mode neovim
does not finish startup until the UI attaches.

we were replaying `:drop` into an instance that had not finished loading a bunch of
of things like filetype detection, syntax setup or user startup scripts.

see: https://github.com/neovide/neovide/issues/3444
2026-04-02 01:24:13 +02:00
Ryan Patterson 9d8e9317eb
fix: reintroduce error window for launch failures (#3445)
* reintroduce error window for launch failures

* fix: high cpu usage launch-error windows

just adding some control flow for the eventloop scheduler to avoid it
to wake up immediately when the only remaining window is an error
dialog, or if it is an error window in general.

---------

Co-authored-by: Alexsander Falcucci <alex.falcucci@gmail.com>
2026-04-01 19:48:47 +02:00
Alexsander Falcucci 32f223ae75
fix: update neovim listen_addr restart protocol and keep open args per route (#3441)
the old :restart progpath/argv payload is not the protocol anymore
see: https://github.com/neovim/neovim/pull/35223

the contract is now simpler:

  - the server starts the new neovim instance
  - the UI gets a restart event with the new listen address
  - the UI follows that address instead of rebuilding argv

impl the new protocol exposes the second bug. if a reused Neovide process
opens a new embedded window, that route has to start with the files it was
actually asked to open, otherwise :restart will attempt to restart the
process startup args from the first window, or an empty session.
2026-03-31 22:03:25 +02:00
Alexsander Falcucci 458bfd0578
docs: update nightly references to 0.16 (#3435) 2026-03-30 21:04:58 +02:00
Alexsander Falcucci e636e9091f
chore: prepare release 0.16.0 (#3434) 2026-03-30 19:39:35 +02:00
Alexsander Falcucci a76304c7ec
fix: render the correct message window geometry (#3430)
note: neovim reports message grids with the full default-grid height even when only
the bottom few rows are actually on screen.

f2d0b06ecb/src/nvim/message.c?plain=1#L205-L254

we were already compensating for that in one place when clamping the target
position, but then we turned around and used the full backing-grid size for
pixel_region()

that means the renderer still treated the message window as if
all rows were visible, which is wrong.

https://github.com/neovide/neovide/issues/3427
2026-03-30 14:06:06 +02:00
Alexsander Falcucci b943884298
fix: remove theme option from config file (#3433)
we mistakenly added a theme option to the config file, but it is not
actually used anywhere, must be impl in the future.

let g:neovide_theme has no changes.
2026-03-30 13:39:54 +02:00
Alexsander Falcucci 12c2a97a94
fix: rename macos-* to system-* for multi-window settings (#3432)
naming it for a target OS is not correct, lets keep it generic.
2026-03-30 01:42:39 +02:00
Alexsander Falcucci 20cf79ebb3
bump time = "0.3.47" (#3426) 2026-03-25 22:42:18 +01:00
Alexsander Falcucci 6cac6da20a
docs: --new-window handoff (#3425)
just a simple documentation atm.
2026-03-25 15:30:52 +01:00
Alexsander Falcucci a3fa12ee74
docs: --reuse-instance handoff (#3424)
just a simple documentation for now.
2026-03-25 15:28:08 +01:00
Alexsander Falcucci 75be80885e
handoff: return the listener version in responses (#3423)
when we are debugging the reuse-instance behavior, the version is
helpful to troubleshoot.
2026-03-25 13:33:37 +01:00
Alexsander Falcucci 5c4054db46
fix: split route cwd from caller cwd on handoffs (#3422)
the mistake here was treating --chdir and a relative file arg as if
they described the same directory.

they don't.

For a handoff like

  cd ~/neovide
  neovide --reuse-instance --new-window src/main.rs --chdir ~

the file comes from the caller shell cwd, so it should still mean ~/neovide/src/main.rs
but the new neovim route itself should start with cwd ~

now we take both meanings explicitly through the handoff path:
- cwd: the per-route startup cwd
- caller_cwd: the base directory for resolving relative file drops
2026-03-25 00:20:53 +01:00