call_end

    • Pl chevron_right

      Matthew Garrett: What is a PC compatible?

      news.movim.eu / PlanetGnome • 4 January 2026 • 12 minutes

    Wikipedia says “An IBM PC compatible is any personal computer that is hardware- and software-compatible with the IBM Personal Computer (IBM PC) and its subsequent models” . But what does this actually mean? The obvious literal interpretation is for a device to be PC compatible, all software originally written for the IBM 5150 must run on it. Is this a reasonable definition? Is it one that any modern hardware can meet?

    Before we dig into that, let’s go back to the early days of the x86 industry. IBM had launched the PC built almost entirely around off-the-shelf Intel components, and shipped full schematics in the IBM PC Technical Reference Manual . Anyone could buy the same parts from Intel and build a compatible board. They’d still need an operating system, but Microsoft was happy to sell MS-DOS to anyone who’d turn up with money. The only thing stopping people from cloning the entire board was the BIOS, the component that sat between the raw hardware and much of the software running on it. The concept of a BIOS originated in CP/M , an operating system originally written in the 70s for systems based on the Intel 8080. At that point in time there was no meaningful standardisation - systems might use the same CPU but otherwise have entirely different hardware, and any software that made assumptions about the underlying hardware wouldn’t run elsewhere. CP/M’s BIOS was effectively an abstraction layer, a set of code that could be modified to suit the specific underlying hardware without needing to modify the rest of the OS. As long as applications only called BIOS functions, they didn’t need to care about the underlying hardware and would run on all systems that had a working CP/M port.

    By 1979, boards based on the 8086, Intel’s successor to the 8080, were hitting the market. The 8086 wasn’t machine code compatible with the 8080, but 8080 assembly code could be assembled to 8086 instructions to simplify porting old code. Despite this, the 8086 version of CP/M was taking some time to appear, and a company called Seattle Computer Products started producing a new OS closely modelled on CP/M and using the same BIOS abstraction layer concept. When IBM started looking for an OS for their upcoming 8088 (an 8086 with an 8-bit data bus rather than a 16-bit one) based PC, a complicated chain of events resulted in Microsoft paying a one-off fee to Seattle Computer Products, porting their OS to IBM’s hardware, and the rest is history.

    But one key part of this was that despite what was now MS-DOS existing only to support IBM’s hardware, the BIOS abstraction remained, and the BIOS was owned by the hardware vendor - in this case, IBM. One key difference, though, was that while CP/M systems typically included the BIOS on boot media, IBM integrated it into ROM. This meant that MS-DOS floppies didn’t include all the code needed to run on a PC - you needed IBM’s BIOS. To begin with this wasn’t obviously a problem in the US market since, in a way that seems extremely odd from where we are now in history, it wasn’t clear that machine code was actually copyrightable. In 1982 Williams v. Artic determined that it could be even if fixed in ROM - this ended up having broader industry impact in Apple v. Franklin and it became clear that clone machines making use of the original vendor’s ROM code wasn’t going to fly. Anyone wanting to make hardware compatible with the PC was going to have to find another way.

    And here’s where things diverge somewhat. Compaq famously performed clean-room reverse engineering of the IBM BIOS to produce a functionally equivalent implementation without violating copyright. Other vendors, well, were less fastidious - they came up with BIOS implementations that either implemented a subset of IBM’s functionality, or didn’t implement all the same behavioural quirks, and compatibility was restricted. In this era several vendors shipped customised versions of MS-DOS that supported different hardware (which you’d think wouldn’t be necessary given that’s what the BIOS was for, but still), and the set of PC software that would run on their hardware varied wildly. This was the era where vendors even shipped systems based on the Intel 80186 , an improved 8086 that was both faster than the 8086 at the same clock speed and was also available at higher clock speeds. Clone vendors saw an opportunity to ship hardware that outperformed the PC, and some of them went for it.

    You’d think that IBM would have immediately jumped on this as well, but no - the 80186 integrated many components that were separate chips on 8086 (and 8088) based platforms, but crucially didn’t maintain compatibility. As long as everything went via the BIOS this shouldn’t have mattered, but there were many cases where going via the BIOS introduced performance overhead or simply didn’t offer the functionality that people wanted, and since this was the era of single-user operating systems with no memory protection, there was nothing stopping developers from just hitting the hardware directly to get what they wanted. Changing the underlying hardware would break them.

    And that’s what happened. IBM was the biggest player, so people targeted IBM’s platform. When BIOS interfaces weren’t sufficient they hit the hardware directly - and even if they weren’t doing that, they’d end up depending on behavioural quirks of IBM’s BIOS implementation. The market for DOS-compatible but not PC-compatible mostly vanished, although there were notable exceptions - in Japan the PC-98 platform achieved significant success, largely as a result of the Japanese market being pretty distinct from the rest of the world at that point in time, but also because it actually handled Japanese at a point where the PC platform was basically restricted to ASCII or minor variants thereof.

    So, things remained fairly stable for some time. Underlying hardware changed - the 80286 introduced the ability to access more than a megabyte of address space and would promptly have broken a bunch of things except IBM came up with an utterly terrifying hack that bit me back in 2009 , and which ended up sufficiently codified into Intel design that it was one mechanism for breaking the original XBox security . The first 286 PC even introduced a new keyboard controller that supported better keyboards but which remained backwards compatible with the original PC to avoid breaking software. Even when IBM launched the PS/2, the first significant rearchitecture of the PC platform with a brand new expansion bus and associated patents to prevent people cloning it without paying off IBM, they made sure that all the hardware was backwards compatible. For decades, PC compatibility meant not only supporting the officially supported interfaces, it meant supporting the underlying hardware. This is what made it possible to ship install media that was expected to work on any PC, even if you’d need some additional media for hardware-specific drivers. It’s something that still distinguishes the PC market from the ARM desktop market. But it’s not as true as it used to be, and it’s interesting to think about whether it ever was as true as people thought.

    Let’s take an extreme case. If I buy a modern laptop, can I run 1981-era DOS on it? The answer is clearly no. First, modern systems largely don’t implement the legacy BIOS. The entire abstraction layer that DOS relies on isn’t there, having been replaced with UEFI. When UEFI first appeared it generally shipped with a Compatibility Services Module, a layer that would translate BIOS interrupts into UEFI calls, allowing vendors to ship hardware with more modern firmware and drivers without having to duplicate them to support older operating systems 1 . Is this system PC compatible? By the strictest of definitions, no.

    Ok. But the hardware is broadly the same, right? There’s projects like CSMWrap that allow a CSM to be implemented on top of stock UEFI, so everything that hits BIOS should work just fine. And well yes, assuming they implement the BIOS interfaces fully, anything using the BIOS interfaces will be happy. But what about stuff that doesn’t? Old software is going to expect that my Sound Blaster is going to be on a limited set of IRQs and is going to assume that it’s going to be able to install its own interrupt handler and ACK those on the interrupt controller itself and that’s really not going to work when you have a PCI card that’s been mapped onto some APIC vector, and also if your keyboard is attached via USB or SPI then reading it via the CSM will work (because it’s calling into UEFI to get the actual data) but trying to read the keyboard controller directly won’t 2 , so you’re still actually relying on the firmware to do the right thing but it’s not, because the average person who wants to run DOS on a modern computer owns three fursuits and some knee length socks and while you are important and vital and I love you all you’re not enough to actually convince a transglobal megacorp to flip the bit in the chipset that makes all this old stuff work.

    But imagine you are, or imagine you’re the sort of person who (like me) thinks writing their own firmware for their weird Chinese Thinkpad knockoff motherboard is a good and sensible use of their time - can you make this work fully? Haha no of course not. Yes, you can probably make sure that the PCI Sound Blaster that’s plugged into a Thunderbolt dock has interrupt routing to something that is absolutely no longer an 8259 but is pretending to be so you can just handle IRQ 5 yourself, and you can probably still even write some SMM code that will make your keyboard work, but what about the corner cases? What if you’re trying to run something built with IBM Pascal 1.0 ? There’s a risk that it’ll assume that trying to access an address just over 1MB will give it the data stored just above 0, and now it’ll break. It’d work fine on an actual PC, and it won’t work here, so are we PC compatible?

    That’s a very interesting abstract question and I’m going to entirely ignore it. Let’s talk about PC graphics 3 . The original PC shipped with two different optional graphics cards - the Monochrome Display Adapter and the Color Graphics Adapter . If you wanted to run games you were doing it on CGA, because MDA had no mechanism to address individual pixels so you could only render full characters. So, even on the original PC, there was software that would run on some hardware but not on other hardware.

    Things got worse from there. CGA was, to put it mildly, shit. Even IBM knew this - in 1984 they launched the PCjr , intended to make the PC platform more attractive to home users. As well as maybe the worst keyboard ever to be associated with the IBM brand, IBM added some new video modes that allowed displaying more than 4 colours on screen at once 4 , and software that depended on that wouldn’t display correctly on an original PC. Of course, because the PCjr was a complete commercial failure, it wouldn’t display correctly on any future PCs either. This is going to become a theme.

    There’s never been a properly specified PC graphics platform. BIOS support for advanced graphics modes 5 ended up specified by VESA rather than IBM, and even then getting good performance involved hitting hardware directly. It wasn’t until Microsoft specced DirectX that anything was broadly usable even if you limited yourself to Microsoft platforms, and this was an OS-level API rather than a hardware one. If you stick to BIOS interfaces then CGA-era code will work fine on graphics hardware produced up until the 20-teens, but if you were trying to hit CGA hardware registers directly then you’re going to have a bad time. This isn’t even a new thing - even if we restrict ourselves to the authentic IBM PC range (and ignore the PCjr), by the time we get to the Enhanced Graphics Adapter we’re not entirely CGA compatible . Is an IBM PC/AT with EGA PC compatible? You’d likely say “yes”, but there’s software written for the original PC that won’t work there.

    And, well, let’s go even more basic. The original PC had a well defined CPU frequency and a well defined CPU that would take a well defined number of cycles to execute any given instruction. People could write software that depended on that. When CPUs got faster, some software broke. This resulted in systems with a Turbo Button - a button that would drop the clock rate to something approximating the original PC so stuff would stop breaking. It’s fine, we’d later end up with Windows crashing on fast machines because hardware details will absolutely bleed through.

    So, what’s a PC compatible? No modern PC will run the DOS that the original PC ran. If you try hard enough you can get it into a state where it’ll run most old software, as long as it doesn’t have assumptions about memory segmentation or your CPU or want to talk to your GPU directly. And even then it’ll potentially be unusable or crash because time is hard.

    The truth is that there’s no way we can technically describe a PC Compatible now - or, honestly, ever. If you sent a modern PC back to 1981 the media would be amazed and also point out that it didn’t run Flight Simulator. “PC Compatible” is a socially defined construct, just like “Woman”. We can get hung up on the details or we can just chill.


    1. Windows 7 is entirely happy to boot on UEFI systems except that it relies on being able to use a BIOS call to set the video mode during boot, which has resulted in things like UEFISeven to make that work on modern systems that don’t provide BIOS compatibility ↩︎

    2. Back in the 90s and early 2000s operating systems didn’t necessarily have native drivers for USB input devices, so there was hardware support for trapping OS accesses to the keyboard controller and redirecting that into System Management Mode where some software that was invisible to the OS would speak to the USB controller and then fake a response anyway that’s how I made a laptop that could boot unmodified MacOS X ↩︎

    3. (my name will not be Wolfwings Shadowflight ) ↩︎

    4. Yes yes ok 8088 MPH demonstrates that if you really want to you can do better than that on CGA ↩︎

    5. and by advanced we’re still talking about the 90s, don’t get excited ↩︎

    • Pl chevron_right

      Christian Hergert: pgsql-glib

      news.movim.eu / PlanetGnome • 2 January 2026

    Much like the s3-glib library I put together recently , I had another itch to scratch. What would it look like to have a PostgreSQL driver that used futures and fibers with libdex? This was something I wondered about more than a decade ago when writing the libmongoc network driver for 10gen (later MongoDB).

    pgsql-glib is such a library which I made to wrap the venerable libpq PostgreSQL state-machine library. It does operations on fibers and awaits FD I/O to make something that feels synchronous even though it is not.

    It also allows for something more “RAII-like” using g_autoptr() which interacts very nicely with fibers.

    API Documentation can be found here.

    • Pl chevron_right

      Felipe Borges: Looking for Mentors for Google Summer of Code 2026

      news.movim.eu / PlanetGnome • 2 January 2026

    It is once again that pre-GSoC time of year where I go around asking GNOME developers for project ideas they are willing to mentor during Google Summer of Code . GSoC is approaching fast, and we should aim to get a preliminary list of project ideas by the end of January.

    Internships offer an opportunity for new contributors to join our community and help us build the software we love.

    @Mentors , please submit new proposals in our Project Ideas GitLab repository .

    Proposals will be reviewed by the GNOME Internship Committee and posted at https://gsoc.gnome.org/2026 . If you have any questions, please don’t hesitate to contact us .

    • Pl chevron_right

      Lennart Poettering: Mastodon Stories for systemd v259

      news.movim.eu / PlanetGnome • 30 December 2025 • 1 minute

    On Dec 17 we released systemd v259 into the wild .

    In the weeks leading up to that release (and since then) I have posted a series of serieses of posts to Mastodon about key new features in this release, under the #systemd259 hash tag. In case you aren't using Mastodon, but would like to read up, here's a list of all 25 posts:

    I intend to do a similar series of serieses of posts for the next systemd release (v260), hence if you haven't left tech Twitter for Mastodon yet, now is the opportunity.

    My series for v260 will begin in a few weeks most likely, under the #systemd260 hash tag.

    In case you are interested, here is the corresponding blog story for systemd v258 , here for v257 , and here for v256 .

    • Pl chevron_right

      Sophie Herold: GNOME in 2025: Some Numbers

      news.movim.eu / PlanetGnome • 27 December 2025 • 3 minutes

    As some of you know, I like aggregating data. So here are some random numbers about GNOME in 2025. This post is not about making any point with the numbers I’m sharing. It’s just for fun.

    So, what is GNOME? In total, 6 692 516 lines of code. Of that, 1 611 526 are from apps. The remaining 5 080 990 are in libraries and other components, like the GNOME Shell. These numbers cover “the GNOME ecosystem,” that is, the combination of all Core, Development Tools, and Circle projects. This currently includes exactly 100 apps. We summarize everything that’s not an app under the name “components.”

    GNOME 48 was at least 90 % translated for 33 languages. In GNOME 49 this increased to 36 languages. That’s a record in the data that I have, going back to GNOME 3.36 in 2020. The languages besides American English are: Basque, Brazilian Portuguese, British English, Bulgarian, Catalan, Chinese (China), Czech, Danish, Dutch, Esperanto, French, Galician, Georgian, German, Greek, Hebrew, Hindi, Hungarian, Indonesian, Italian, Lithuanian, Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian (Latin), Slovak, Slovenian, Spanish, Swedish, Turkish, Uighur, and Ukrainian. There are 19 additional languages that are translated 50 % or more. So maybe you can help with translating GNOME to Belarusian, Catalan (Valencian), Chinese (Taiwan), Croatian, Finnish, Friulian, Icelandic, Japanese, Kazakh, Korean, Latvian, Malay, Nepali, Norwegian Bokmål, Occitan, Punjabi, Thai, Uzbek (Latin), or Vietnamese in 2026?

    Talking about languages. What programming languages are used in GNOME? Let’s look at GNOME Core apps first. Almost half of all apps are written in C. Note that for these data, we are counting TypeScript under JavaScript.

    C: 44.8%, Vala: 20.7%, Rust: 10.3%, Python: 6.9%, JavaScript: 13.8%, C++ 3.45%. Share of GNOME Core apps by programming language.

    The language distribution for GNOME Circle apps looks quite different with Rust (41.7 %), and Python (29.2 %) being the most popular languages.

    C: 6%, Vala, 13%, Rust 42%, Python 29%, JavaScript 10%, Crystal 1% Share of GNOME Circle apps by programming language.

    Overall, we can see that with C, JavaScript/TypeScript, Python, Rust, and Vala, there are five programming languages that are commonly used for app development within the GNOME ecosystem.

    But what about components within GNOME? The default language for libraries is still C. More than three-quarters of the lines of code for components are written in it. The components with the largest codebase are GTK (820 000), GLib (560 000), and Mutter (390 000).

    Lines of code for components within the GNOME ecosystem.

    But what about the remaining quarter? Line of code are of course a questionable metric. For Rust, close to 400 000 lines of code are actually bindings for libraries. The majority of this code is automatically generated. Similarly, 100 000 lines of Vala code are in the Vala repository itself. But there are important components within GNOME that are not written in C: Orca, our screen reader, boasts 110 000 lines of Python code. Half of GNOME Shell is written in JavaScript, adding 65 000 lines of JavaScript code. Librsvg and glycin are libraries written in Rust, that also provide bindings to other languages.

    We are slowly approaching the end of the show. Let’s take a look at the GNOME Circle apps most popular on Flathub. I don’t trust the installation statistics on Flathub, since I have seen indications that for some apps, the number of installations is surprisingly high and cyclic. My guess is that some Linux distribution is installing these apps regularly as part of their test pipeline. Therefore, we instead check how many people have installed the latest update for the app. Not a perfect number either, but something that looks much more reliable. The top five apps are: Blanket, Eyedropper, Newsflash, Fragments, and Shortwave. Sometimes, it needs less than 2 000 lines of code to create popular software.

    And there are 862 people supporting the GNOME Foundation with a recurring donation. Will you join them for 2026 on donate.gnome.org ?

    • Pl chevron_right

      Joan Torres López: Remote Login Design

      news.movim.eu / PlanetGnome • 23 December 2025 • 3 minutes

    GNOME 46 introduced remote login. This post explores the architecture primarily through diagrams and tables for a clearer understanding.

    Components overview


    There are 4 components involved: the remote client, the GRD dispatcher daemon, the GRD handover daemon and the GDM daemon:

    Component Type Responsibility
    Remote Client Remote User Connects remotely via RDP. Supports RDP Server Redirection method.
    Dispatcher GRD System-level daemon Handles initial connections, peeks routing token and orchestrates handovers.
    Handover GRD User-level daemon Runs inside sessions (Greeter or User). Provides remote access of the session to the remote client.
    GDM GDM System-level daemon Manages Displays and Sessions (Greeter or User).

    API Overview


    The components communicate with each other through dbus interfaces:

    Exposed by GDM

    org.gnome.DisplayManager.RemoteDisplayFactory

        • Method CreateRemoteDisplay
          Requests GDM to start a headless greeter. Accepts a RemoteId argument.

    org.gnome.DisplayManager.RemoteDisplay

      • Property RemoteId
        The unique ID generated by the Dispatcher.
      • Property SessionId
        The session ID of the created session wrapped by this display.

    Exposed by GRD Dispatcher

    org.gnome.RemoteDesktop.Dispatcher

      • Method RequestHandover
        Returns the object path of the Handover interface matching the caller’s session ID.

    org.gnome.RemoteDesktop.Handover

    Dynamically created. One for each remote session.

      • Method StartHandover
        Initiates the handover process. Receives one-time username/password, returns certificate and key used by dispatcher.
      • Method TakeClient
        Gives the file descriptor of the remote client’s connection to the caller.
      • Signal TakeClientReady
        Informs that a file descriptor is ready to be taken.
      • Signal RedirectClient
        Instructs the source session to redirect the remote client to the destination session.

    Flow Overview


    Flow phase 1: Initial connection to greeter session

    1. Connection:

      • Dispatcher receives a new connection from a Remote Client . Peeks the first bytes and doesn’t find a routing token. This means this is a new connection.

    2. Authentication:

      • Dispatcher authenticates the Remote Client using system level credentials.

    3. Session Request:

      • Dispatcher generates a unique remote_id (also known as routing token), and calls CreateRemoteDisplay() on GDM with this remote_id .

    4. Registration:

      • GDM starts a headless greeter session.
      • GDM exposes RemoteDisplay object with RemoteId and SessionId .
      • Dispatcher detects new object. Matches RemoteId . Creates Handover D-Bus interface for this SessionId .

    5. Handover Setup:

      • Handover is started in the headless greeter session.
      • Handover calls RequestHandover() to get its D-Bus object path with the Handover interface.
      • Handover calls StartHandover() with autogenerated one-time credentials. Gets from that call the certificate and key (to be used when Remote Client connects).

    6. Redirection (The “Handover”):

      • Dispatcher performs RDP Server Redirection sending the one-time credentials, routing token ( remote_id ) and certificate.
      • Remote Client disconnects and reconnects.
      • Dispatcher peeks bytes; finds valid routing token.
      • Dispatcher emits TakeClientReady on the Handover interface.

    7. Finalization:

      • Handover calls TakeClient() and gets the file descriptor of the Remote Client ‘s connection.
      • Remote Client is connected to the headless greeter session.

    Flow phase 2: Session transition (from greeter to user)

    1. Session Creation:

      • User authenticates.
      • GDM starts a headless user session.

    2. Registration:

      • GDM exposes a new RemoteDisplay with the same RemoteId and a new SessionId .
      • Dispatcher detects a RemoteId collision.
      • State Update: Dispatcher creates a new Handover D-Bus interface ( dst ) to be used by the New Handover in the headless user session.
      • The Existing Handover remains connected to its original Handover interface ( src ).

    3. Handover Setup:

      • New Handover is started in the headless user session.
      • New Handover calls RequestHandover() to obtain its D-Bus object path with the Handover interface.
      • New Handover calls StartHandover() with new one-time credentials and receives the certificate and key.

    4. Redirection Chain:

      • Dispatcher receives StartHandover() from dst .
      • Dispatcher emits RedirectClient on src (headless greeter session) with the new one-time credentials.
      • Existing Handover receives the signal and performs RDP Server Redirection.

    5. Reconnection:

      • Remote Client disconnects and reconnects.
      • Dispatcher peeks bytes and finds a valid routing token ( remote_id ).
      • Dispatcher resolves the remote_id to the destination Handover ( dst ).
      • Dispatcher emits TakeClientReady on dst .

    6. Finalization:

      • New Handover calls TakeClient() and receives the file descriptor of the Remote Client ‘s connection.
      • Remote Client is connected to the headless user session.

    Disclaimer

    Please note that while this post outlines the basic architectural structure and logic, it may not guarantee a 100% match with the actual implementation at any given time. The codebase is subject to ongoing refactoring and potential improvements.

    • Pl chevron_right

      Marcus Lundblad: Xmas & New Year's Maps

      news.movim.eu / PlanetGnome • 21 December 2025 • 3 minutes


    It's that time of year again in (Norther Hemisphere) winter when year's drawing to an end. Which means it's time for the traditional Christmas Maps blogpost.

    Sometimes you hear claims about Santa Claus living at the North Pole (though in Rovaniemi, Finland, I bet they would disagree…). Turns out there's a North Pole near Fairbanks, Alaska as well:


    😄

    OK, enough smalltalk… now on to what's happened since the last update (for the GNOME 49 release in September).

    Sidebar Redesign

    Our old design when it comes to showing information about places has revolved around the trusted old “popover” menu design which has served us pretty well. But it also had it's drawbacks.

    For one it was never a good fit on small screen sizes (such as on phones). Therefore we had our own “home-made” place bar design with a separate dialog opening up when clicking the bar to reveal full details.

    After some discussions and thinking about this, I decided to try out a new approach utilizing the MultiLayout component from libadwaita which gives the option to get an adaptive “auxillary view” widget which works as a sidebar on desktop, and a bottom sheet on mobile.

    Now the routeplanner and place information views have both been consolidated to both reside in this new widget.

    Clicking the route button will now open the sidebar showing the routeplanner, or the bottom sheet depending on the mode.

    And clicking a place icon on the map, or selecting a search result will open the place information, also showing in the sidebar, or bottom sheet.

    multiview-route-planner-sidebar.png
    Route planner showing in sidebar in desktop mode

    multiview-route-planner-bottom-sheet.png
    Routeplanner showing in bottom sheet in mobile/narrow mode

    multiview-route-planner-bottom-sheet-plan.png
    Routeplanner showing public transit itineraries in bottom sheet

    multiview-placeview-sidebar.png
    Showing place information in sidebar in desktop mode

    multiview-placeview-bottom-sheet.png
    Showing place information in bottom sheet in mobile mode

    Redesigning Public Transit Itinerary Rendering

    The displaying of public transit itineraries has also seen some overhaul.

    First I did a bit of redesign of the rows representing journey legs, taking some queues from the Adwaita ExpanderRow style. Improving a bit compared to the old style which had been carried over from GTK 3.

    transit-itinerary-redesign.png
    List of journey legs, with the arrow indicating possibilty to expand to reveal more information

    transit-itinerary-redesign-expanded.png

    List of journey legs, with one leg “expanded” to show intermediate stops made by a train

    Improving further on this Jalen Ng contributed a merge request implementing an improvement to the overview list utilizing Adwaita WrapBoxes to show more complete information the different steps of each presented itinerary option in the overview when searching for travel options with public transit.

    transit-plan-wrapbox.png
    Showing list of transit itineraries each consisting of multiple journey legs

    Jalen also started a redesign of rendering of itineraries (this merge request is still being worked on).

    redesign-transit-itinerary.png
    Redesign of transit itinerary display. Showing each leg as a “track segment“ using the line's color

    Hide Your Location

    We also added the option to hide the marker showing your own location. One use for this e.g. if you want to make screenshots without revealing your exact location.

    show-location-setting-menuitem.png
    Menu to toggle showing your location marker

    And that's not All…

    On top of this some other things. James Westman added support global-state expressions to libshumate's vector tile implementation. This should allow us to e.g. refactor the implementation of light and dark styles and language support in our map style without “recompiling”  the stylesheet at runtime.

    James also fixed a bug sometimes causing the application to freeze when dragging the window between screens when a route is being displayed.

    This fix has been backported to the 49.3 and 48.8 releases which has been tagged today as an early holiday gift.

    And that's all for now, merry holidays, and  happy new year!