aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--configure.ac37
-rw-r--r--src/core/mb-window-manager.c82
-rw-r--r--src/core/mb-window-manager.h15
4 files changed, 134 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index f6b5684..1b4d149 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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