PageSourceSearch

https://www.electronjs.org/assets/js/83e6a4d2.c3fc19d3.js

js electronjs.org collected 2026-09-24 07:04:43 UTC 27,759 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkelectronjs=self.webpackChunkelectronjs||[]).push([["29161"],{84420(e,n,t){t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var s=t(69193),a=t(74848),o=t(28453);let i={title:"Tech Talk: How Electron went Wayland-native, and what it means for your apps",date:new Date("2026-03-17T00:00:00.000Z"),authors:[{name:"mitchchn",url:"https://github.com/mitchchn",image_url:"https://github.com/mitchchn.png?size=96"}],slug:"tech-talk-wayland",tags:["techtalk","internals"],description:"Electron recently switched to Wayland by default on Linux, bringing dozens of popular desktop apps along with it. Here's what changed and how it affects developers and users."},r,l={authorsImageUrls:[void 0]},d=[{value:"The third impact: Electron goes Wayland-native",id:"the-third-impact-electron-goes-wayland-native",level:2},{value:"Wayland\u2019s house, Wayland\u2019s rules",id:"waylands-house-waylands-rules",level:2},{value:"Understanding CSD, or when a window isn\u2019t a window",id:"understanding-csd-or-when-a-window-isnt-a-window",level:2},{value:"What\u2019s next \u2014 and how you can help",id:"whats-next--and-how-you-can-help",level:2}];function h(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.admonition,{type:"info",children:(0,a.jsxs)(n.p,{children:["Tech talks are a new blog post series where we share glimpses into our work on Electron. If you find this work interesting, please consider ",(0,a.jsx)(n.a,{href:"https://github.com/electron/electron/",children:"contributing"}),"!"]})}),"\n",(0,a.jsxs)(n.p,{children:["When Electron switched to ",(0,a.jsx)(n.a,{href:"https://wayland.freedesktop.org/",children:"Wayland"})," on Linux last fall, most people didn't notice."]}),"\n",(0,a.jsxs)(n.p,{children:["Major Linux distributions adopted the modern display protocol years ago, and both the KDE Plasma and GNOME desktop environments are in the process of ",(0,a.jsx)(n.a,{href:"https://blogs.kde.org/2025/11/26/going-all-in-on-a-wayland-future/",children:"dropping X11 support"})," ",(0,a.jsx)(n.a,{href:"https://www.phoronix.com/news/GNOME-50-Alpha/",children:"completely"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["But a platform migration isn't complete without apps, and a large part of the Linux app ecosystem went through a second Wayland transition last August \u2014 well after most distros had changed their defaults. That's when Chromium ",(0,a.jsx)(n.a,{href:"https://chromium-review.googlesource.com/c/chromium/src/+/6819616",children:"turned on Wayland by default"}),", bringing Electron and dozens of Linux desktop apps along with it."]}),"\n",(0,a.jsx)(n.h2,{id:"the-third-impact-electron-goes-wayland-native",children:"The third impact: Electron goes Wayland-native"}),"\n",(0,a.jsxs)(n.p,{children:["Wayland is supported out of the box in ",(0,a.jsx)(n.a,{href:"https://releases.electronjs.org/release/v38.2.0",children:"Electron 38.2"})," and newer. As long as your apps are up-to-date, it just works. (If you were previously launching your Electron apps with very long commands like ",(0,a.jsx)(n.code,{children:"CONFUSING_OZONE_VARIABLE --ozone-platform=wayland"}),", you no longer need to do that.)"]}),"\n",(0,a.jsxs)(n.p,{children:["This change was possible because the Chromium and Electron projects have been ",(0,a.jsx)(n.a,{href:"https://github.com/electron/electron/pull/26022",children:"working on Wayland support"})," for more than half a decade. But until recently, Chrome and Electron apps continued to use X11 by default, even when launched in a Wayland session. This wasn\u2019t a big issue, since X11 apps still work fairly well on Wayland by running inside an invisible X server called ",(0,a.jsx)(n.a,{href:"https://wayland.freedesktop.org/docs/html/ch05.html",children:"Xwayland"}),"."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(22739).A+"",children:(0,a.jsx)(n.img,{alt:"Screenshot of an Electron app running in X11 compatibility mode (XWayland) in a Wayland session on Ubuntu",src:t(9351).A+"",width:"1280",height:"960"})})}),"\n",(0,a.jsx)(n.p,{children:"Running apps through a compatibility layer is not the same as running them directly on Wayland. On Wayland, there\u2019s less sitting between your app and the compositor, so there's lower overhead and much stronger isolation between applications. Modern Wayland compositors also let apps take advantage of newer platform and display features like variable refresh rates, HiDPI and fractional scaling, and HDR."}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(99083).A+"",children:(0,a.jsx)(n.img,{alt:"Screenshot of an Electron app running natively on Wayland, demonstrating support for wide gamut color and HDR",src:t(12383).A+"",width:"1295",height:"1076"})})}),"\n",(0,a.jsxs)(n.p,{children:["These are all good reasons for Electron to make the switch. In late September, Electron followed Chromium\u2019s lead and began ",(0,a.jsx)(n.a,{href:"https://www.electronjs.org/blog/electron-38-0#removed-electron_ozone_platform_hint-environment-variable",children:"defaulting to Wayland"}),". And as apps began to update, people who had been \u201Cusing Wayland\u201D without issues for months or years started to find out what it was really like to experience the
1ir apps on Wayland for the first time."]}),"\n",(0,a.jsx)(n.h2,{id:"waylands-house-waylands-rules",children:"Wayland\u2019s house, Wayland\u2019s rules"}),"\n",(0,a.jsxs)(n.p,{children:["Supporting Wayland required dozens of changes throughout ",(0,a.jsx)(n.a,{href:"https://chromium-review.googlesource.com/q/subject:%22wayland%22",children:"Chromium"})," and ",(0,a.jsx)(n.a,{href:"https://github.com/electron/electron/pulls?q=is%3Apr+wayland",children:"Electron"}),", from internals to developer-facing APIs. It also required a different way of thinking about what desktop apps should be able to do."]}),"\n",(0,a.jsx)(n.p,{children:"Wayland reconsiders assumptions made by older systems and asks whether apps should be able to:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Take focus away from other apps"}),"\n",(0,a.jsx)(n.li,{children:"View and interact with windows from other apps"}),"\n",(0,a.jsx)(n.li,{children:"Respond to mouse and keyboard input when not focused"}),"\n",(0,a.jsx)(n.li,{children:"Choose where to position their own windows on the screen (and which physical monitor to appear on)"}),"\n",(0,a.jsx)(n.li,{children:"Resize their windows at any time"}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["Wayland's answer to these questions is essentially \u201Cno.\u201D When you open a window, the compositor \u2014 not the app developer \u2014 decides where it goes. Apps cannot unilaterally move, resize, or focus their windows without user input, and they can only interact with the rest of the desktop through optional ",(0,a.jsx)(n.a,{href:"https://wayland.app/protocols/",children:"protocol extensions"})," and ",(0,a.jsx)(n.a,{href:"https://flatpak.github.io/xdg-desktop-portal/",children:"XDG portals"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"These kinds of rules are understandable; no one likes it when a misbehaving app steals focus or loads halfway off the screen. But it can still surprise people when their apps suddenly lose access to familiar affordances on Wayland. This is especially the case for a cross-platform framework like Electron, which exists to help developers achieve consistent results everywhere."}),"\n",(0,a.jsxs)(n.p,{children:["Some widely used Electron APIs that work on X11, macOS, and Windows are not available on Wayland. For example, ",(0,a.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/api/base-window#winsetpositionx-y-animate",children:(0,a.jsx)(n.code,{children:"win.setPosition(x, y)"})})," and ",(0,a.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/api/screen#screengetcursorscreenpoint",children:(0,a.jsx)(n.code,{children:"screen.getCursorScreenPoint()"})})," aren't supported, as Wayland ",(0,a.jsx)(n.a,{href:"https://lists.freedesktop.org/archives/wayland-devel/2015-September/024410.html",children:"deliberately forbids"})," apps from accessing global screen coordinates."]}),"\n",(0,a.jsxs)(n.p,{children:["Other features work differently: recording the screen with ",(0,a.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/api/desktop-capturer",children:(0,a.jsx)(n.code,{children:"desktopCapturer"})})," and setting keyboard shortcuts with ",(0,a.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/api/global-shortcut",children:(0,a.jsx)(n.code,{children:"globalShortcut"})})," are more restricted, and both heavily depend on the desktop environment and portal versions. Here's what it looks like when screen sharing in Signal Desktop on GNOME 48."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(24680).A+"",children:(0,a.jsx)(n.img,{alt:"Screenshot of Signal Desktop requesting permission to share the screen on GNOME",src:t(67532).A+"",width:"1627",height:"1198"})})}),"\n",(0,a.jsxs)(n.p,{children:["Making this more complicated for developers is the fact that Wayland isn't a single piece of software, but a protocol. Every ",(0,a.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Wayland_(protocol)#Wayland_compositors",children:"compositor"})," implements it a little differently, almost like browser engines. (There are even ",(0,a.jsx)(n.a,{href:"https://absurdlysuspicious.github.io/wayland-protocols-table/",children:"protocol support trackers"})," that look like they came from MDN or CanIUse.)"]}),"\n",(0,a.jsxs)(n.p,{children:["So when Slack tries to focus its main window with ",(0,a.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/api/browser-window#winfocus",children:(0,a.jsx)(n.code,{children:"win.focus()"})}),", GNOME's compositor (Mutter) shows a notification. On KDE Plasma (KWin), the app icon flashes in the panel instead. Neither outcome is what the app's developers had in mind, but both are valid interpretations of the ",(0,a.jsx)(n.a,{href:"https://wayland.app/protocols/xdg-activation-v1",children:"activation spec"}),"."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(99957).A+"",children:(0,a.jsx)(n.img,{alt:"Screenshot comparing what happens when Slack tries to focus itself on GNOME and KDE",src:t(92313).A+"",width:"1280",height:"720"})})}),"\n",(0,a.jsxs)(n.p,{children:["Some capabilities simply work better on Wayland than on X11, including anything to do with colors, transparency, and hardware-accelerated rendering. ",(0,a.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/api/base-window#winsetopacityopacity-windows-macos",children:(0,a.jsx)(n.code,{children:"win.setOpacity(n)"})})," is an example of an Electron API which hasn't been available on Linux in the past, but which will now be feasible to supp
1ort."]}),"\n",(0,a.jsxs)(n.p,{children:["Even the stricter restrictions can benefit apps. When 1Password runs on Wayland, its ",(0,a.jsx)(n.a,{href:"https://developer.1password.com/docs/ssh/agent/",children:"SSH agent"})," lets users confirm requests with a single click instead of asking them to enter their passwords. This is safe because Wayland's input isolation is strong enough to prevent the prompt from being skipped with ",(0,a.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Clickjacking",children:"clickjacking"})," \u2014 only a real human being can click the button."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(87533).A+"",children:(0,a.jsx)(n.img,{alt:"Screenshot of the 1Password SSH agent showing a prompt with an Authorize button, floating over a terminal with an SSH command.",src:t(97225).A+"",width:"1641",height:"1293"})})}),"\n",(0,a.jsx)(n.p,{children:"The basic tradeoff is that Wayland restricts some of what apps can do but also enables them to be more capable and secure. And in one area, Wayland gives developers more flexibility and more responsibility than before: client-side decorations (CSD)."}),"\n",(0,a.jsx)(n.h2,{id:"understanding-csd-or-when-a-window-isnt-a-window",children:"Understanding CSD, or when a window isn\u2019t a window"}),"\n",(0,a.jsxs)(n.p,{children:["The Wayland protocol is very lightweight, and its simplicity extends to the way it draws window frames. On X11, the window manager typically supplies a window\u2019s title bar and frame decorations. But when you create a window (",(0,a.jsx)(n.a,{href:"https://wayland.app/protocols/xdg-shell",children:(0,a.jsx)(n.code,{children:"xdg_toplevel"})}),") on Wayland, all you get back from the compositor is a plain rectangle."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(99142).A+"",children:(0,a.jsx)(n.img,{alt:"Screenshot of a blank app window on Wayland with no decorations. It's just a white rectangle.",src:t(23442).A+"",width:"1280",height:"960"})})}),"\n",(0,a.jsx)(n.p,{children:"That rectangle is a powerful canvas. On a modern compositor like GNOME\u2019s Mutter, it\u2019s triple-buffered and GPU-accelerated. But if you want any of the trimmings users might expect \u2014 title bar buttons, drop shadows, even resize handles \u2014 you have to add them yourself. This requirement is called client-side decorations (CSD), and it\u2019s one of the major differences between X11 and Wayland."}),"\n",(0,a.jsxs)(n.p,{children:["Electron already had some support for client-side decorations, provided by a class called ",(0,a.jsx)(n.code,{children:"ClientFrameViewLinux"})," which uses GTK to paint convincing native window frames. These look very similar to the ones GNOME used to supply on X11, but they are produced entirely in-framework."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(43142).A+"",children:(0,a.jsx)(n.img,{alt:"Screenshot of a ClientFrameViewLinux with client-side decorations on GNOME",src:t(86178).A+"",width:"1280",height:"960"})})}),"\n",(0,a.jsx)(n.p,{children:"But client-side window frames are not an exact match for server-side decorations (SSD) from X11 window managers. They need to be implemented by each app or framework, so the details can look noticeably different when you put apps side by side, from their title bar areas right down to their drop shadows and corner shapes."}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(48128).A+"",children:(0,a.jsx)(n.img,{alt:"Screenshot of four apps with CSD from different frameworks (clockwise from top-left: Adwaita, Qt, Electron, and Firefox)",src:t(48772).A+"",width:"1728",height:"1296"})})}),"\n",(0,a.jsx)(n.p,{children:"The differences are usually minor, but when CSD is completely absent from a window, the result can be visually jarring."}),"\n",(0,a.jsxs)(n.p,{children:["Many popular apps, including Visual Studio Code, Obsidian, and Discord, use ",(0,a.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/tutorial/custom-window-styles",children:"frameless windows"})," with ",(0,a.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/tutorial/custom-title-bar",children:"custom title bars"}),". Prior to ",(0,a.jsx)(n.a,{href:"https://www.electronjs.org/blog/electron-41-0",children:"Electron 41"}),", frameless windows did not support CSD at all, so they looked like featureless rectangles on Wayland."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(33322).A+"",children:(0,a.jsx)(n.img,{alt:"Screenshot of VS Code on KDE with no CSD",src:t(60494).A+"",width:"1731",height:"1300"})})}),"\n",(0,a.jsx)(n.p,{children:"Improving coverage for CSD was a task with framework-wide consequences. The biggest obstacle involved window sizes and how to measure and set them accurately. Electron already manages two different kinds of window boundaries:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"\u201Cwindow bounds\u201D"}),", the size of the window, including its titlebar, menubar, and frame."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"\u201Ccontent bounds\u201D"}),", the size of the internal web view which hosts the app\u2019s web content."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["Both values can be controlled independently. If a developer calls for an 800x600 window, Electron calculates the height of the title bar and shrinks the web app to something like 800x540. (It also works the other way around for ",(0,a.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/api/base-window#new-basewindowoptions",children:"content-sized"})," windows.)"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(9354).A+"",children:(0,a.jsx)(n.img,{alt:"Diagram of an Electron app's window and content bounds without CSD",src:t(98070).A+"",width:"1650",height:"1275"})})}
1),"\n",(0,a.jsx)(n.p,{children:"To support CSD, Electron also needed to keep track of a new kind of boundary:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"\u201Cwidget bounds\u201D"}),", the size of the transparent widget which draws everything inside of it, including the window frame and its external decorations."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["When CSD is required, Electron first takes the window's underlying ",(0,a.jsx)(n.a,{href:"https://wayland.app/protocols/xdg-shell#xdg_surface",children:"surface"})," (accessed internally via a Chromium ",(0,a.jsx)(n.a,{href:"https://source.chromium.org/chromium/chromium/src/+/main:ui/ozone/platform/wayland/host/wayland_window.cc;l=94;drc=ac4eed7b549169cd64f0e15b503f4f0635dc1bd9",children:"accelerated widget"}),") and inflates it so it's large enough to fit all the decorations."]}),"\n",(0,a.jsx)(n.p,{children:"The framework then paints the opaque bits of the window (title bar, frame, and web content) at their appropriate sizes and positions inside the transparent widget. The outermost areas are filled in with drop shadows and resize hit targets, creating the look and feel of a native, three-dimensional window without relying on server-side decorations."}),"\n",(0,a.jsx)(n.p,{children:"With CSD, a \"logical\" window at 800x600 might be inset into a 840x640 widget. The exact geometries depend on the user's theme and the window's state: whether it is currently active, maximized, tiled, or fullscreen can affect the size and presence of decorations."}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(40938).A+"",children:(0,a.jsx)(n.img,{alt:"Diagram of an Electron app's full CSD bounds, including the transparent widget surrounding the window",src:t(26614).A+"",width:"1650",height:"1275"})})}),"\n",(0,a.jsx)(n.p,{children:"Of course, widget bounds should never leak into the public API. The framework needs to abstract this complexity away from app developers, who are generally not thinking about the extents of resize targets or shadow insets changing underneath them."}),"\n",(0,a.jsxs)(n.p,{children:["The good news is that much of this was sorted out between last September and March, and as a result, Electron 41 supports CSD on Wayland in all window configurations, including frameless windows with ",(0,a.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/api/structures/base-window-options",children:"Window Controls Overlay"}),"."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(92761).A+"",children:(0,a.jsx)(n.img,{alt:"Screenshot of VS Code using a prerelease version of Electron 41.x with CSD shadows.",src:t(22173).A+"",width:"1813",height:"1316"})})}),"\n",(0,a.jsx)(n.h2,{id:"whats-next--and-how-you-can-help",children:"What\u2019s next \u2014 and how you can help"}),"\n",(0,a.jsx)(n.p,{children:"Wayland is an everyday reality for Linux users in 2026, so a great Wayland experience is now just what it means to support Linux."}),"\n",(0,a.jsxs)(n.p,{children:["Electron reached an important milestone last month with the creation of a ",(0,a.jsx)(n.a,{href:"https://github.com/electron/electron/pull/49908",children:"Wayland test job in CI"}),". More tests still need to be ported over, but it\u2019s now much easier to catch regressions."]}),"\n",(0,a.jsxs)(n.p,{children:["Now that the basic support is in place, Wayland opens up new possibilities for Electron apps. CSD in particular offers developers more ways to customize window frames and integrate them with both their web content and the platform. ",(0,a.jsx)(n.a,{href:"https://github.com/electron/electron/issues",children:"Let us know"})," what you'd like to see; one feature that's high on my own shortlist is rounded corners."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(11694).A+"",children:(0,a.jsx)(n.img,{alt:"Screenshot of a frameless window with rounded corners (not currently possible in Electron, but soon?)",src:t(30362).A+"",width:"1840",height:"1439"})})}),"\n",(0,a.jsxs)(n.p,{children:["The framework is only part of the story. If you develop an Electron app and you haven\u2019t thoroughly tested it on Linux in a while (even as recently as last fall), give it a spin with Electron 41+ on a modern distribution like Ubuntu 25.10 or Fedora 43. Try your app on both KDE Plasma and GNOME, and maybe something more exotic like ",(0,a.jsx)(n.a,{href:"https://github.com/niri-wm/niri",children:"Niri"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["You may discover changes you could make to accommodate Wayland's unique constraints. Some differences are covered in the ",(0,a.jsx)(n.a,{href:"https://www.electronjs.org/docs/latest/api/browser-window",children:"Electron documentation"}),", but the best way to understand the new environment is to use it."]}),"\n",(0,a.jsxs)(n.p,{children:["And if you\u2019d like to see faster progress and support for more platform features, consider ",(0,a.jsx)(n.a,{href:"https://github.com/electron/electron/blob/main/CONTRIBUTING.md",children:"becoming a contributor"}),". Like Linux itself, Electron is a community-run ",(0,a.jsx)(n.a,{href:"https://openjsf.org/blog/electron-joins-the-openjs-foundation",children:"free software project"})," that\u2019s open to everyone, and we're actively looking for Linux contributors and maintainers."]}),"\n",(0,a.jsx)(n.p,{children:"Electron powers many of the most popular desktop apps across platforms, so getting involved is an effective way to help make desktop Linux more viable for millions of people."})]})}function c(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},87533(e,n,t){t.d(n,{A:()=>s});
1let s=t.p+"assets/files/1passwordssh-6ef79e1c3174043cb11571d3874802bf.png"},43142(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/files/clientframeviewlinux-cfd509bc5a3099a12009bb9aa9da3749.png"},48128(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/files/csdcomparison-92a791c2382c1f4c96e8cd20d932276d.png"},99957(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/files/focus-bd12b1a8eb0999cba0edfb16934505d4.png"},99083(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/files/hdr-f6b141a7502024160f550c614c947608.png"},11694(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/files/roundedcorners-da8eb9a58504779605f9f315f9a55392.png"},24680(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/files/signalscreenshare-4f0031952ec13722d28814608d871c25.png"},92761(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/files/vscodecsd-26e13ece78b184484cc8e27f122e3e99.png"},33322(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/files/vscodenocsd-6f2013f1656e09eff0cfca1e94fa0a71.png"},99142(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/files/waylandnocsd-1fda0479eb87487d13ce5473ed32277f.png"},40938(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/files/widgetbounds-e2921ef22f4dad4281d9cb74357b3d83.png"},9354(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/files/windowbounds-b41c7193d91e6981b341bb9acabdc6a6.png"},22739(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/files/xwayland-8fc6983c43adb7294e26749d678d1b60.png"},97225(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/images/1passwordssh-6ef79e1c3174043cb11571d3874802bf.png"},86178(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/images/clientframeviewlinux-cfd509bc5a3099a12009bb9aa9da3749.png"},48772(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/images/csdcomparison-92a791c2382c1f4c96e8cd20d932276d.png"},92313(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/images/focus-bd12b1a8eb0999cba0edfb16934505d4.png"},12383(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/images/hdr-f6b141a7502024160f550c614c947608.png"},30362(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/images/roundedcorners-da8eb9a58504779605f9f315f9a55392.png"},67532(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/images/signalscreenshare-4f0031952ec13722d28814608d871c25.png"},22173(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/images/vscodecsd-26e13ece78b184484cc8e27f122e3e99.png"},60494(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/images/vscodenocsd-6f2013f1656e09eff0cfca1e94fa0a71.png"},23442(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/images/waylandnocsd-1fda0479eb87487d13ce5473ed32277f.png"},26614(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/images/widgetbounds-e2921ef22f4dad4281d9cb74357b3d83.png"},98070(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/images/windowbounds-b41c7193d91e6981b341bb9acabdc6a6.png"},9351(e,n,t){t.d(n,{A:()=>s});let s=t.p+"assets/images/xwayland-8fc6983c43adb7294e26749d678d1b60.png"},28453(e,n,t){t.d(n,{R:()=>i,x:()=>r});var s=t(96540);let a={},o=s.createContext(a);function i(e){let n=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(o.Provider,{value:n},e.children)}},69193(e){e.exports=JSON.parse('{"permalink":"/blog/tech-talk-wayland","source":"@site/blog/tech-talk-wayland.md","title":"Tech Talk: How Electron went Wayland-native, and what it means for your apps","description":"Electron recently switched to Wayland by default on Linux, bringing dozens of popular desktop apps along with it. Here\'s what changed and how it affects developers and users.","date":"2026-03-17T00:00:00.000Z","tags":[{"inline":false,"label":"Tech Talk","permalink":"/blog/tags/techtalk","description":"\'Sharing glimpses into our work on Electron\'\\n"},{"inline":false,"label":"Electron Internals","permalink":"/blog/tags/internals","description":"\'Technical deep dives through Electron\'s source code\'\\n"}],"readingTime":12.26,"hasTruncateMarker":true,"authors":[{"name":"mitchchn","url":"https://github.com/mitchchn","image_url":"https://github.com/mitchchn.png?size=96","imageURL":"https://github.com/mitchchn.png?size=96","socials":{},"key":null,"page":null}],"frontMatter":{"title":"Tech Talk: How Electron went Wayland-native, and what it means for your apps","date":"2026-03-17T00:00:00.000Z","authors":[{"name":"mitchchn","url":"https://github.com/mitchchn","image_url":"https://github.com/mitchchn.png?size=96","imageURL":"https://github.com/mitchchn.png?size=96"}],"slug":"tech-talk-wayland","tags":["techtalk","internals"],"description":"Electron recently switched to Wayland by default on Linux, bringing dozens of popular desktop apps along with it. Here\'s what changed and how it affects developers and users."},"unlisted":false,"prevItem":{"title":"Electron 42","permalink":"/blog/electron-42-0"},"nextItem":{"title":"Electron 41","permalink":"/blog/electron-41-0"}}')}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.