eXperience GTK+ engine

Warning

Development has been discontinued for a long time now. This site only exists for historic purposes (and is semi broken).

I created the eXperience-GTK engine as a project to help my brother with his Luna style GTK-Theme (It is available from art.gnome.org and freshmeat).

An up to date version of the engine itself can be downloaded from http://benjamin.sipsolutions.net/experience. You can of course also get it from freshmeat or art.gnome.org. I also have some debian packages in my repository. They are available at

deb http://benjamin.sipsolutions.net/debian stable main
# Packages for GTK+ 2.10 are currently in my experimental repository.
# Note that I are bugged by having a lower version number than the stable ones.
# (I just couldn't be bothered to fix that.)
deb http://benjamin.sipsolutions.net/debian experimental main

Screenshots

Features

General

  • Stack multiple images.
  • inheritance
  • you can access all properties of widgets (for matching)

Image manipulation

  • Rotate, mirror images.
  • Place them anywhere on the widget.
  • Change the color (to gtk colors)
  • Change brightness
  • Change saturation
  • pixelate them (checkerboard)
  • Change the opacity

How To

Change Log

Speed

Often people just say this engine is slow. I do not think that this is true. But, it gives the user the power to create very slow themes. I was able to speed up the eXperience theme a lot by tweaking the theme.

So basically my oppinion is that just saying "The eXperience engine is slow" is wrong. You may say that the theme is slow. I have to agree, that it is not very fast.

Well, lets compare the eXperience engine to the pixmap engine. This is the only fair comparison to do. I have not done any testing in this direction (should be pretty simple, I would suggest to just port a pixmap engine theme to the eXperience engine). I would expect the eXperience engine to be slightly slower. This is because it has a different rendering model and needs a temporary pixmap. But the scaling works exactly in the same way.
BUT to complete this test, you will be able to improve the speed of the theme using the eXperience engine. This is because you can select a faster scaling algorithm, and completly remove transparent areas.

NOTE: If someone really wants to do this, you need to set draw_components = BORDER as this is what the pixmap engine does. For the eXperience engine it does not make any sense to add a special case for this.

Also I am pretty much done with a cairo port. This means that some people can get hardware acceleration.


If you set the enviroment variable EXPERIENCE_PRINT_WIDGET_PATH=TRUE the engine will print out all drawing operations to stderr (Loads of output). It prints out the class (and widget) path of the widget that is drawn, and the group used to do this. This is very usefull for tweaking apps.

Bugs

Some Ideas

Any ideas to improve the engine?


Maybe add support for themeing, how text is being rendered. That means, add a text section to the config similar to the icon section.

Something like the following might be used to draw insensitive text embossed. Patches are welcome (Maybe some other format would be smarter, but this is just about what I would like to have.)

engine "experience" {
        text {
                insensitive {
                        1 {
                                x_offset = 1
                                y_offset = 1
                                color = "#ff0000"
                        }
                        2 {
                                # text[] should of course be used ...
                                color = text[INSENSITIVE]
                        }
                }
        }
}

cairo port

Screenshots of the cairo based engine are at http://benjamin.sipsolutions.net/screenshots/experience-cairo

I started porting the engine to cairo. Well, first of all cairo is really nice! I was able to kick out large chunks of code ...

Bugs

Currently there are three bugs cairo has that need to be fixed, before the engine will be usable:

  1. Rotating images does not work correctly, images will get set off by one pixel. This bug has already been reported to the bugzilla https://bugs.freedesktop.org/show_bug.cgi?id=2488.
  2. There is a bug in the XLib surface. When something is drawn tiled and rotate at the same time, nothing is visible. It is possible to work around this bug by falling back to the image surface. (not sure if this is still the case. probably fixed.)

Compatibility

The cairo port is not completly backward compatible. The following incompatibilities exist:

  • Because the rotation is now done by cairo, it will not affect the rouding anymore. So you might get "of by one" errors.
  • The colors seem to be slightly different in the cairo based engine.

As there will be some mistakes anyway, I think that I will also change the brightness algorithm to a more correct one (ie. convert to the HSV color space) I have no idea how big of a difference this will make.

New Features

Of course there are some new features now (updated as I add them):

  • groups can now be embedded into each other, which allows saving loads of code.

(More will come, especially if someone has a specific requests)

More info in Future


Hey sorry for this guys... just wanted to say that your engine does not work... nowhere to find anything that does it get to work... conflicts with libgtk2.0-0... lol?! A joke isn't it... really super awesome engine... xD

Oh, what a way of complaining. You could have mailed me, added something to /Bugs, or at least given a sane description of the error instead of complaining like this! I have a good idea what you are trying to do, and it is exactly what is supposed to happen. If you had read the error message more closely you would see that it is a versioned dependency as any GTK+ engine needs to be recompiled for GTK+ 2.10. I bet you agree that it is better to have a conflict than a an installation that does not work. What you can do is to either run "apt-get source" and build the engine yourself, or get it from my experimental repository instead. (OK, there I really made a mistake, and the experimental version is "lower" than the stable one, so one needs to force it currently.)