Warning, /plasma/oxygen-gtk/README is written in an unsupported language. File is not indexed.
0001 Oxygen-Gtk is a port of the default KDE widget theme (Oxygen), to gtk.
0002
0003 It's primary goal is to ensure visual consistency between gtk and qt-based applications running under kde. A secondary objective is to also have a stand-alone nice looking gtk theme that would behave well on other Desktop Environments.
0004
0005 Unlike other attempts made to port the kde oxygen theme to gtk, this attempt does not depend on Qt (via some Qt to Gtk conversion engine), nor does render the widget appearance via hard coded pixmaps, which otherwise breaks everytime some setting is changed in kde.
0006
0007 Contents:
0008 ---------
0009
0010 I. Introduction
0011
0012 II. Install
0013
0014 III. Hacks
0015 III.1 ARGB support
0016 III.2 DBus support
0017 III.3 Window grabbing
0018 III.4 Window background
0019 III.5 GtkTreeView
0020 III.6 GtkScrolledWindow
0021 III.7 Button order in dialogs
0022 III.8 Mouse-over support
0023 III.9 Tab close buttons
0024 III.10 Combobox list resize
0025 III.11 Inner shadows
0026
0027 IV. Technical details
0028 IV.1 Directories
0029 IV.2 Some details on some files in src
0030 IV.3 Some details on some files in animations
0031
0032 V. Example configuration (aka: how to select the oxygen-gtk style)
0033
0034 VI. How to determine oxygen-gtk version
0035
0036 I. introduction
0037 ---------------
0038
0039 Oxygen-Gtk is a port of the default KDE widget theme (Oxygen) to GTK.
0040
0041 Its primary goal is to ensure visual consistency between gtk-based and qt-based applications running under KDE. A secondary objective is to also have a stand-alone nice looking gtk theme that would behave well on other Desktop Environments.
0042
0043 Unlike other attempts made to port the KDE oxygen theme to gtk, this attempt does not depend on Qt (via some Qt to Gtk conversion engine), nor does render the widget appearance via hard coded pixmaps, which otherwise breaks everytime some setting is changed in KDE.
0044
0045 II. install
0046 -----------
0047 see the INSTALL file in top-level directory
0048
0049 III. Hacks
0050 ----------
0051 This section describes some of the hacks we used in oxygen-gtk to make the style match its Qt/Kde counterpart better.
0052 These details are given here because:
0053
0054 - they might cause crashes or rendering glitches for some apps (at least until we fix it, once aware of it)
0055 - they might cause some widgets to behave differently from what application designers might have expected
0056
0057 III.1 ARGB support
0058 ------------------
0059
0060 Oxygen-gtk renders menus tooltips, drowdown lists, using ARGB (semi-transparent) colormaps. This is needed to have nice non-pixelated rounded corners, as in Oxygen-Qt, and semi-transparent background for tooltips, when compositing is enabled.
0061
0062 Since release 1.0.2, only the colormap for the windows corresponding widgets mentionned above are modified. The colormap for all other windows (notably main windows and dialogs), are unchanged. Unlike with previous relieses of Oxygen-gtk, this now works for 99% of the applications (with firefox and company being the only exception we are aware of).
0063
0064 In case this still causes issues (typically: crashes, or menus not being rendered properly) for applications that we have not tested, we provide a way to black-list applications (so that ARGB support is not enabled).
0065
0066 The full list of black-listed applications is in rc/argb-apps.conf, and is usually installed at:
0067
0068 /usr/share/themes/oxygen-gtk/gtk-2.0/argb-apps.conf
0069
0070 There is also a per-user config file usually in
0071
0072 $HOME/.config/oxygen-gtk/argb-apps.conf
0073
0074 This file will be parsed AFTER the system-wide one, thus allowing the user to override SOME or ALL of the rules set in the system-wide file. I.e., using "disable:all" as a first statement in the per-user config file will make system-wide one inactive.
0075
0076 It can be edited by the user to add (or remove) new applications in case we overlooked some.
0077 The syntax used to add/remove an application in the black-list is described in the argb-apps.conf file.
0078 When there is a need to add new applications, user should also post it in this bug: https://bugs.kde.org/show_bug.cgi?id=260640 so that it also gets added in the distributed code.
0079
0080 There are some environment variables to help debug ARGB hack:
0081
0082 OXYGEN_DISABLE_ARGB_HACK - set it to 1 to check if app will crash without the hack. Oxygen-GTK will print app name to report.
0083 OXYGEN_ARGB_DEBUG - set it to 1 to print all debug information concerning ARGB hack (mainly to debug blacklist logic).
0084 OXYGEN_DISABLE_INNER_SHADOWS_HACK - set it to 1 to disable inner shadows hack, which might make some widgets render in a wrong way or not render at all
0085
0086 III.2 DBus support
0087 ------------------
0088 Provided that dbus-glib-1 is found on the system, oxygen-gtk is compiled with DBus support. This allows gtk applications to be updated automatically when kde (or oxygen) configuration is changed. This covers:
0089 - changing the color scheme
0090 - changing icon theme and sizes
0091 - changing oxygen style options, like the number and position of scrollbar arrows
0092 - ...
0093
0094 The style still compiles (and runs) when dbus support is not found, but the feature above is missing, naturally.
0095
0096 So far we have encountered no issue with this feature.
0097
0098 III.3 Window grabbing
0099 ---------------------
0100
0101 Oxygen-gtk supports the oxygen-qt feature that one can grab a window from any empty area and move it around as one usually does from the window decoration. The detection of 'empty' areas is quite tedious, but works well for all the applications we have tested so far. It is based mostly on main windows (or dialogs) recieving mouse button press/release events, assuming that no other child widget had any use of such events and thus allowing oxygen-gtk to use such events for moving the window.
0102
0103 It might unfortunately happen that some widgets (so far unknown to us) make use of a mouse button press/release events and still pass them to their parent window, in which case the window-grab feature will conflict with the widget's usage of the event.
0104
0105 If this happens, user should
0106 - disable window-grab (using the oxygen-qt's configuration tool; called 'oxygen-settings'), to be able to still use the faulty application
0107 - file a bug report and wait for the bug to be fixed.
0108
0109 III.4 Window background
0110 -----------------------
0111
0112 Oxygen uses gradients for windows and menus background (there is a linear vertical gradient, and a radial gradient at the center of the window's top part) that match the window decoration's background. Some widgets however, paint their own flat background, without any possibility for the style to overwrite these, which results in plain flat squares being painted in the middle of the otherwise well-matched background.
0113
0114 Unfortunately in most cases, there is not much we can do about it. This is most likely either a missing feature on the gtk style (letting the style render the widget's background), or an ill-design of the widget itself.
0115
0116 III.5 GtkTreeView
0117 -----------------
0118
0119 Tree-lines are rendered by default on all tree-views (unless it is disabled in oxygen-qt's configuration tool).
0120 However, in order to have 'solid' grey lines instead of dotted black lines (provided by Gtk, with no way for the style to change it), we completely rewrote the tree-line drawing code (and disabled Gtk's equivalent code). This also allowed us to change the placement of the tree expander and the lines, so that they match Qt.
0121 So far we have encountered no issue with this feature.
0122
0123 III.6 GtkScrolledWindow
0124 -----------------------
0125
0126 For scrolled windows that contain a GtkTreeView, we force the frame to be sunken. This is consistent with Qt, and allows us to properly render mouse-over and focus effects on such lists. There might be some specific widget's layouts however for which this results in rendering glitches (for instance, two sunken frames one embedded in the other). If you observe such things, please report and we'll fix.
0127
0128 III.7 Button order in dialogs
0129 -----------------------------
0130
0131 We changed the button order in dialogs so that it matches the Qt convention. Notably, "accept" buttons are usually located 'left-of' "cancel" buttons. This choice was driven to improve consistency accross applications, although it might disorient Gnome users.
0132
0133 III.8 Mouse-over support
0134 ------------------------
0135
0136 We added mouse-over support (that is: highlight when mouse pointer enters the widget) for a number of widgets for which gtk did not support it. This is notably the case for: GtkTreeView, GtkEntry, GtkNoteBook. This is achieved by watching enter/leave and mouse-move events for such widgets and some of their children. To our knowledge there is no remaining issue with this feature.
0137
0138 III.9 Tab close buttons
0139 -----------------------
0140
0141 GTK notebook doesn't provide a standard way for apps to put close buttons on tabs. Because of this, close buttons in different apps are implemented differently. Oxygen-gtk hides such buttons' icons/text, and draws Qt close button images instead. But there's no way of detecting if the button is really _close_ one. So, current implementation may break apps which have some additional buttons in the tabs. If you find such apps with multiple buttons on single tab (which all look like close buttons) when using oxygen-gtk, file a bug report.
0142
0143 III.10 Combobox list resize
0144 ---------------------------
0145
0146 We haven't figured out any way to draw combobox button glow outside of the button widget, so the button is drawn reduced by glow dimensions. This leads to combobox list not match button in size (it's 6px wider than the button). To make popped-up combobox look nicer, we resize it on each popup.
0147 This may result in flicker, so if it's undesirable, this hack can be disabled this in CMakeLists.txt: set ENABLE_COMBOBOX_LIST_RESIZE to 0 instead of default 1.
0148
0149 III.11 Inner shadows
0150 --------------------
0151
0152 To implement inner shadows so that they get inside their child windows, we make children windows composited (gdk_window_set_composited()).
0153 This may lead to inexpected effects such as not rendered (or rendered as garbage) children of GtkScrolledWindow and GtkViewport.
0154 Currently no such problems are known.
0155 To disable this hack, set ENABLE_INNER_SHADOWS_HACK to 0 in CMakeLists.txt.
0156
0157 Note: this feature requires gtk version 2.24.2 or later.
0158
0159
0160 IV. Technical details
0161 ---------------------
0162
0163 Oxygen-Gtk is written in c++ (but makes only 'c' style calls to Gtk methods).
0164 This section provides some details about the files and classes structure of oxygen-gtk.
0165
0166 IV.1. Directories:
0167 ------------------
0168
0169 rc/ contains 'default' configuration files
0170 src/ contains all the source code.
0171 src/animations/ contains code needed for hover/focus effects, and will contain code for smooth animations.
0172 It connects to various widgets signals and events to setup and trigger widget updates when appropriate conditions are fullfilled.
0173
0174 IV.2. Some details on some files in src/
0175 ----------------------------------------
0176
0177 oxygenrcstyle:
0178 oxygenstylewrapper:
0179 are the core gtk style files. Oxygenstylewrapper wraps all gtk painting calls to oxygenstyle singleton painting class.
0180
0181 oxygenstyle:
0182 does all the painting, as called by oxygenstylewrapper
0183
0184 oxygenstylehelper:
0185 contains some lower level painting classes, that depend on cairo context, and not on gtk windows/widgets any more. It is also responsible for generating the tilesets.
0186
0187 oxygentileset:
0188 stores 3x3 pixmap array to handle scalable widgets, similar to what KDE/plasma does (as well as oxygen-qt)
0189 These tilesets are cached using home-made stl-based cache containers can be cached.
0190
0191 oxygenwindowmanager: handles window grabbing
0192
0193 oxygenrgba:
0194 stores rgba color representation and has some conversion utility functions, mostly imported from KDE/Qt.
0195
0196 oxygencolorutils:
0197 all color handling, used to shade, mix, blend, etc. It is based on code in oxygen-qt and kde/kdelibs/kdeui kcolorutils and kcolorscheme.
0198
0199 oxygenpalette:
0200 internal storage of colors. It extends the colors used by gdk and passed via gtkstyle
0201
0202 oxygenqtsettings:
0203 does all the handling of Qt/Kde options, and conversion to gtk options where needed
0204
0205 oxygengtkicons:
0206 is responsible for mapping/replacing gtk icons by oxygen icons. This is largely inspired from QtCurve-gtk
0207
0208 utility files/classes:
0209 oxygengeometry.h: some low-level geometry classes
0210 oxygencairocontext: a self-freed wrapper around cairo_context_t;
0211 oxygencairopattern: a self-freed wrapper around cairo_pattern_t;
0212 oxygencache: some stl based implementation of a fifo cache and a mru cache;
0213 oxygencairoutils: some cairo/gdk-cairo utilities
0214 oxygengtkdetail: wrapper around the 'detail' strings passed to painting routines
0215 oxygengtkutils: some widget/window ancestry tree navigation utility functions.
0216 oxygenflags: generic utility class to handle enumeration based bit patterns, inspired from the QFlag Qt class.
0217 oxygentaboptions: stores options relevant for tab rendering in notebooks.
0218 oxygenstyleoptions: stores generic options for widget rendering, based on their state, shadow, etc.
0219
0220 IV.3. some details on some files in animations/
0221 -----------------------------------------------
0222
0223 All types of animations (mostly mouse-over effects for the moment) have two classes:
0224 - a Data class, that stores widget specific information on a per widget basis
0225 - an Engine class, that collects all Data objects and map them to their matching GtkWidget. When a GtkWidget is destroyed, the corresponding entry in the map is removed.
0226
0227 All engines are stored inside the oxygenanimations class, and owned by it.
0228 All engines must derive from Oxygen::BaseEngine, to be stored inside Animations.
0229 For convenience and to minimize redundant code, an Oxygen::GenericEngine class is used as a base class for most engines.
0230
0231 For a "Data" object to be used in an engine, it must contain a "::connect(GtkWidget*)" and a "::disconnect(GtkWidget*)" class.
0232 These two methods are responsible for the initialization and clean-up of the Data object.
0233
0234 utility files/classes:
0235 oxygendatamap:
0236 keeps track of association between widgets and data objects. It also keeps track of the last accessed widget, in case it is re-used immediately; for optimization.
0237
0238 oxygentimer:
0239 a convenience class to handle delayed actions.
0240
0241 oxygensignal:
0242 a convenience class to handle signal/callback connections and disconnections.
0243
0244 V. Example configuration (aka: how to select the oxygen-gtk style)
0245 ------------------------------------------------------------------
0246 Below is a 'sample' .gtkrc-2.0 file used to select oxygen-gtk for a style.
0247 For kde users this should be copied to $HOME/.gtkrc-2.0-kde
0248 For others, in $HOME/.gtkrc-2.0 (or make a soft-link to the file above).
0249 It is provided here without any warranty, and users should backup their old config file before modifying.
0250 It is unclear whether this file will work for all configurations, all desktop environments and all systems (your distribution and DM would know better). On the other hand it has worked (by experience) in many cases.
0251
0252 ----- begin of file ------
0253 include "/usr/share/themes/oxygen-gtk/gtk-2.0/gtkrc"
0254
0255 style "user-font"
0256 {
0257 font_name="Sans Serif"
0258 }
0259 widget_class "*" style "user-font"
0260
0261 gtk-theme-name="oxygen-gtk"
0262 gtk-font-name="Sans Serif 8"
0263 ----- end of file -----
0264
0265 VI. How to determine oxygen-gtk version
0266 ---------------------------------------
0267 If you have installed oxygen-gtk from source, then deleted the sources, you can still determine oxygen-gtk version when needed using either of these commands:
0268 oxygen-gtk-demo --version
0269 oxygen-gtk-deco --version