diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | configure.ac | 37 | ||||
-rw-r--r-- | src/core/mb-window-manager.c | 82 | ||||
-rw-r--r-- | src/core/mb-window-manager.h | 15 |
4 files changed, 134 insertions, 10 deletions
@@ -1,4 +1,14 @@ 2007-10-19 Tomas Frydrych <tf@o-hand.com> + + * configure.ac: + Added checks for Xfixes and XCursor. + + * src/core/mb-window-manager.c: + * src/core/mb-window-manager.h: + (mb_wm_set_cursor): + New function. + +2007-10-19 Tomas Frydrych <tf@o-hand.com> * src/core/mb-window-manager.c: * src/core/mb-wm-client.c: diff --git a/configure.ac b/configure.ac index 411fbfe..7ce3ee5 100644 --- a/configure.ac +++ b/configure.ac @@ -86,12 +86,24 @@ fi AC_SUBST(MANAGERS) +PKG_CHECK_MODULES(XFIXES, xfixes >= 4.0, have_xfixes=yes, have_xfixes=no) + +if test x$have_xfixes = xyes; then + AC_DEFINE(HAVE_XFIXES, [1], [Use XFixes ext to really hide cursor]) +fi + +PKG_CHECK_MODULES(XCURSOR, xcursor, have_xcursor=yes, have_xcursor=no) + +if test x$have_xcursor = xyes; then + AC_DEFINE(HAVE_XCURSOR, [1], [Use XCursor to sync pointer themes]) +fi + MBWM_INCS='-I$(top_srcdir)/src/core -I$(top_srcdir)/src/client-types -I$(top_srcdir)/src/theme-engines' MBWM_CORE_LIB='$(top_builddir)/src/core/libmatchbox-window-manager-2-core.a' MBWM_CLIENT_LIBS='$(top_builddir)/src/client-types' MBWM_THEME_LIBS='$(top_builddir)/src/theme-engines' -MBWM_CFLAGS="$MBWM_CFLAGS $MBWM_DEBUG_CFLAGS $THEME_PNG_CFLAGS" -MBWM_LIBS="$MBWM_LIBS $THEME_PNG_LIBS" +MBWM_CFLAGS="$MBWM_CFLAGS $MBWM_DEBUG_CFLAGS $THEME_PNG_CFLAGS $XFIXES_CFLAGS $XCURSOR_CFLAGS" +MBWM_LIBS="$MBWM_LIBS $THEME_PNG_LIBS $XFIXES_LIBS $XCURSOR_LIBS" AC_SUBST([MBWM_CFLAGS]) AC_SUBST([MBWM_LIBS]) @@ -120,14 +132,21 @@ echo " Matchbox Window Manager II ========================== - install prefix: ${prefix} + Directories: source code location: ${srcdir} + install prefix : ${prefix} + + Extension: + Xfixes : ${have_xfixes} + Xcursor : ${have_cursor} - Cairo theme: ${use_cairo} - PNG theme: ${png_theme} - GTK integration: ${use_gtk} + Themes: + Cairo theme : ${use_cairo} + PNG theme : ${png_theme} + GTK integration : ${use_gtk} - Simple manager: ${simple_manager} - Maemo manager: ${maemo_manager} - Debugging output: ${want_debug} + Managers: + Simple manager : ${simple_manager} + Maemo manager : ${maemo_manager} + Debugging output : ${want_debug} " diff --git a/src/core/mb-window-manager.c b/src/core/mb-window-manager.c index 6411f68..499ea42 100644 --- a/src/core/mb-window-manager.c +++ b/src/core/mb-window-manager.c @@ -10,6 +10,16 @@ #include <X11/Xmd.h> +#ifdef HAVE_XFIXES +#include <X11/extensions/Xfixes.h> /* Used to *really* hide cursor */ +#endif + +#ifdef HAVE_XCURSOR +#include <X11/Xcursor/Xcursor.h> +#endif + +#include <X11/cursorfont.h> + static void mb_wm_process_cmdline (MBWindowManager *wm, int argc, char **argv); @@ -947,6 +957,27 @@ mb_wm_init_xdpy (MBWindowManager * wm, const char * display) return 1; } +static void +mb_wm_init_cursors (MBWindowManager * wm) +{ + XColor col; + Pixmap pix = XCreatePixmap (wm->xdpy, wm->root_win->xwindow, 1, 1, 1); + + memset (&col, 0, sizeof (col)); + + wm->cursors[MBWindowManagerCursorNone] = + XCreatePixmapCursor (wm->xdpy, pix, pix, &col, &col, 1, 1); + + XFreePixmap (wm->xdpy, pix); + + wm->cursors[MBWindowManagerCursorLeftPtr] = + XCreateFontCursor(wm->xdpy, XC_left_ptr); + + MBWM_ASSERT (wm->cursors[_MBWindowManagerCursorLast - 1] != 0); + + mb_wm_set_cursor (wm, MBWindowManagerCursorLeftPtr); +} + static int mb_wm_init (MBWMObject *this, va_list vap) { @@ -1045,7 +1076,7 @@ mb_wm_init (MBWMObject *this, va_list vap) mb_wm_keys_init(wm); - /* mb_wm_decor_init (wm); */ + mb_wm_init_cursors (wm); base_foo (); @@ -1373,3 +1404,52 @@ mb_wm_set_theme_from_path (MBWindowManager *wm, const char *theme_path) mb_wm_set_theme (wm, theme); } +void +mb_wm_set_cursor (MBWindowManager * wm, MBWindowManagerCursor cursor) +{ + static int major = 0, minor = 0, ev_base, err_base; + Display * dpy; + Window rwin; + + if (wm->cursor == cursor) + return; + + dpy = wm->xdpy; + rwin = wm->root_win->xwindow; + + mb_wm_util_trap_x_errors(); + +#ifdef HAVE_XFIXES + if (!major) + { + if (XFixesQueryExtension (dpy, &ev_base, &err_base)) + XFixesQueryVersion (dpy, &major, &minor); + else + major = -1; + } + + if (major >= 4) + { + if (cursor == MBWindowManagerCursorNone) + { + XFixesHideCursor (dpy, rwin); + } + else + { + XDefineCursor(dpy, rwin, wm->cursors[cursor]); + XFixesShowCursor (dpy, rwin); + mb_wm_util_trap_x_errors(); + } + } + else +#endif + { + XDefineCursor(dpy, rwin, wm->cursors[cursor]); + } + + XSync (dpy, False); + + if (!mb_wm_util_untrap_x_errors()) + wm->cursor = cursor; +} + diff --git a/src/core/mb-window-manager.h b/src/core/mb-window-manager.h index 6cba9eb..bb11082 100644 --- a/src/core/mb-window-manager.h +++ b/src/core/mb-window-manager.h @@ -38,6 +38,15 @@ typedef enum MBWindowManagerSignalThemeChange = 1, } MBWindowManagerSingal; +typedef enum +{ + MBWindowManagerCursorNone = 0, + MBWindowManagerCursorLeftPtr, + + _MBWindowManagerCursorLast +} MBWindowManagerCursor; + + struct MBWindowManager { MBWMObject parent; @@ -71,6 +80,9 @@ struct MBWindowManager MBWMMainContext *main_ctx; MBWindowManagerFlag flags; + MBWindowManagerCursor cursor; + Cursor cursors[_MBWindowManagerCursorLast]; + /* Temporary stuff, only valid during object initialization */ const char *theme_path; }; @@ -160,4 +172,7 @@ mb_wm_set_theme (MBWindowManager *wm, MBWMTheme * theme); void mb_wm_set_theme_from_path (MBWindowManager *wm, const char *theme_path); +void +mb_wm_set_cursor (MBWindowManager * wm, MBWindowManagerCursor cursor); + #endif |