Skip to content

PCMan/gtk3-nocsd

Repository files navigation

#gtk3-nocsd

gtk3-nocsd is a small module used to disable the client side decoration of Gtk 3.

##Introduction: Since Gtk 3.10, its developers added a so-called header bar or custom title bar. With this and the client-side decoration, the original title bar and window border provided by the window manager are disabled by Gtk . This makes all Gtk 3 programs look alike. Even worse, this may break some window manager or compositors.

Unfortunately, the Gtk developers decided to be against the existing standards and provide "no option" to turn it off.

Luckily, with gtk3-nocsd, we still have a way to (partially) turn it off. Window manager (title bar and window border) can be re-enabled.

##Preview: This is how the gtk3 windows look like before and after using gtk3-nocsd.

Screenshot of gedit with CSDs still enabled

Screenshot of gedit with CSDs disabled by gtk3-nocsd

#How to use:

  • gtk3-nocsd should work with all Gtk 3 versions.

  • Install necessary packages:

    • On Debian-based systems (including Ubuntu and Mint), install pkg-config, libgtk-3-dev, libgirepository1.0-dev.

    • On Fedora-based distros (including RHEL, CentOS), install pkgconfig, gtk3-devel, gtk -devel, gobject-introspection-devel.

  • Build the code. Run make from command line. After this you'll have the files gtk3-nocsdand libgtk3-nocsd.so.0 in the same directory.

  • Now to run individual Gtk 3 apps (say gedit) using this hack, use the command ./gtk3-nocsd gedit from the same directory.

  • To have all Gtk 3 apps (of current user) use this hack, export some environment variables in your ~/.bashrc:

      export GTK_CSD=0
      export LD_PRELOAD=<"full path" of your libgtk3-nocsd.so.0 file>
    
  • On Arch Linux, you should use ~/.xsession instead of ~/.bashrc for the CSDs to be disabled properly.

  • On Debian-based systems with graphical login, instead modify (or create) ~/.xsessionrc and add the following code:

      if [ -n "$STARTUP" ]; then
        BASESTARTUP=${STARTUP%% *}
        BASESTARTUP=${BASESTARTUP##*/}
        if [ "$BASESTARTUP" = x-session-manager ]; then
          BASESTARTUP=$(basename $(readlink /etc/alternatives/x-session-manager))
        fi
        if [ x"$BASESTARTUP" = x"${BASESTARTUP#gnome-session}" ] ; then
          export GTK_CSD=0
          STARTUP="env LD_PRELOAD=/path/to/libgtk3-nocsd.so.0 $STARTUP"
        fi
      fi
    

    gtk3-nocsd is now packaged for Debian though (see below), so manual installation may not be necessary.

  • Re-login to make the environment variables take effect.

  • Hooray! GTK 3 client-side decorations are disabled now.

#Distribution packages:

gtk3-nocsd is packaged in Debian's unstable and testing distributions, see gtk3-nocsd in Debian's package database. The Debian package already comes with integration code to automatically disable CSDs when installed, so after package installation only a re-login is required to have CSDs disabled on non-GNOME desktops.

There is also a gtk3-nocsd-git package for Arch Linux.

#How it works:

$LD_PRELOAD is used to override several Gdk and glib/gobject APIs to intercept related calls Gtk 3 uses to setup CSDs. For older versions of Gtk 3, while it is trying to initialize CSDs, it is led to believe that there is no compositor available, so CSDs are not added. For later Gtk 3 versions (3.16.1 ), the gtk_window_set_titlebar method is reimplemented, as tricking Gtk 3 into thinking the compositor is disabled has side effects and is not sufficent anymore.

Additionally, as gtk_window_set_titlebar is also called from Gtk internally (and LD_PRELOAD cannot override function calls within a library), several other places in Gtk 3 (e.g. buildable interfaces for GtkWindow and GtkDialog) are also overridden to ensure that CSDs are disabled.