libxfcegui4's xinerama wrapper
Brian J. Tarricone
bjt23 at cornell.edu
Thu May 13 09:19:53 CEST 2004
Jasper Huijsmans wrote:
> I was wondering, how about using the GdkScreen API? It is available
> since gtk 2.2, so we could use it for Xfce 4.2. Are there any problems
> with that?
i started using some of it with xfdesktop, but frankly i find it
somewhat confusing. i just looked at it again, and i think ive figured
it out. here's how i understand it:
GdkDisplayManager: this is weird, and i don't think we care about it, so
i'll skip it.
GdkDisplay: logically, this maps to a single X display, coinciding
(usually) with a single instance of an X server. somewhat confusing the
issue is gdk_display_open(), which can open a connection to an arbitrary
GdkDisplay (identified by a char* name). i don't think we need to worry
about it; assuming a single display via gdk_display_get_default() should
be sufficient.
GdkScreen: this seems to have two somewhat-related meanings:
* non-xinerama mode: a single GdkScreen maps to a unique monitor (or
head, whatever you want to call it). you can get these by using
gdk_display_get_screen(gdpy, num). you can discover the number of such
screens on the display by calling gdk_display_get_n_screens(gdpy). the
functions gdk_screen_get_width(gscrn) and gdk_screen_get_height(gscrn)
return the size of the display area on the specified monitor (head).
* xinerama mode: the GdkScreen is essentially a singleton object, and
there is one GdkScreen for the default GdkDisplay. this GdkScreen
represents the entire screen real estate controlled by the xinerama
display, made up of all the monitors (heads) connected to the
GdkDisplay. calling gdk_screen_get_width(gscrn) or
gdk_screen_get_height(gscrn) on the singleton GdkScreen should return
the maximum width or height of the arranged xinerama setup.
now, for xinerama mode, it looks like we can go one layer deeper:
gdk_screen_get_n_monitors() and gdk_screen_get_monitor_geometry(). i
would guess that the former returns the number of physical monitors that
make up the xinerama screen. the latter should return the position and
size of the numbered monitor within the xinerama screen.
also of note are the gdk_spawn_on_screen() family of functions, which
can be used to start a program on a particular GdkScreen. this is
useful for non-xinerama mode, but, for xinerama mode, it doesn't appear
that we can decide what monitor the app should end up on. the WM will
handle it using its normal algorithm (but using a coordinate space that
encompasses several physical monitors).
this all seems to make some amount of sense to me, but, as i've never
actually tried it, and the docs seem somewhat sparse, i can't be sure.
feel free to correct me.
xfdesktop already uses gdk_display_get_n_screens() and
gdk_screen_get_{width,height}(), and that's enough to support
non-xinerama multihead mode. i suppose, for a xinerama-enabled setup,
gdk_display_get_n_screens() will return 1, but
gdk_screen_get_n_monitors() will return something > 1. in the former
case, simply placing a fullscreen window at (0,0) is sufficient, because
each screen gets its own coordinate space. in the latter case, i'd need
to use gdk_screen_get_monitor_geometry() to figure out both the size of
the physical monitor and the (x,y) coordinate that corresponds to the
origin point of the monitor. i'm tempted to also support the ability of
having a single huge fullscreen window that encompasses all monitors.
however, this needs to be an option, because it's possible to have
differing monitor resolutions such that you end up with a
non-rectangular display. xfdesktop CVS already requires gtk 2.2 at
minimum, so making use of the rest of the API shouldn't be a problem,
and i really like the added level of abstraction you get out of it.
whew, that was interesting. time for bed for now.
-brian
More information about the Xfce4-dev
mailing list