summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGianluca Pacchiella <pacchiel@studenti.ph.unito.it>2007-08-03 20:00:01 +0200
committerPeter Hutterer <peter@cs.unisa.edu.au>2007-08-06 13:37:05 +0930
commitb91e7faee69bf5dadfa31fe4dc3cf9a0a0b6f1ca (patch)
tree1b30c52fa8685003a165eaf529367bdb2cb3dcef
parent32895d3ae72e90886b5f9dcc97c5a71aface7e69 (diff)
Added automatic generation of cursor images.
+ Added private function in PointerDevice class that generates with cairo the ID number of the device. + Added check for xcursorgen program in configure.ac - Deleted images/cursors directory.
-rw-r--r--configure.ac1
-rw-r--r--images/Makefile.am4
-rw-r--r--images/bare_cursor.pngbin0 -> 407 bytes
-rw-r--r--images/cursors/Makefile.am21
-rw-r--r--images/cursors/cursor1.pngbin420 -> 0 bytes
-rw-r--r--images/cursors/cursor2.pngbin499 -> 0 bytes
-rw-r--r--images/cursors/cursor3.pngbin538 -> 0 bytes
-rw-r--r--images/cursors/cursor4.pngbin467 -> 0 bytes
-rw-r--r--images/cursors/cursor5.pngbin487 -> 0 bytes
-rw-r--r--images/cursors/cursor6.pngbin546 -> 0 bytes
-rw-r--r--images/cursors/cursor7.pngbin476 -> 0 bytes
-rw-r--r--images/cursors/cursor8.pngbin568 -> 0 bytes
-rw-r--r--images/cursors/cursor9.pngbin547 -> 0 bytes
-rw-r--r--images/cursors/cursor_original.xcfbin1876 -> 0 bytes
-rw-r--r--images/cursors/cursorgen.sh10
-rw-r--r--src/Config.cpp5
-rw-r--r--src/Config.h6
-rw-r--r--src/Makefile.am2
-rw-r--r--src/PointerDevice.cpp76
-rw-r--r--src/PointerDevice.h4
20 files changed, 89 insertions, 40 deletions
diff --git a/configure.ac b/configure.ac
index d7762e5..eaaf9a3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -10,6 +10,7 @@ AM_CONFIG_HEADER([config.h])
AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
+AC_CHECK_PROG([XCURSORGEN],[xcursorgen],[`which xcursorgen`])
# XSetClientPointer is only in the MPX aware lib, so we're all good if it
# exists.
diff --git a/images/Makefile.am b/images/Makefile.am
index 1f8b3f3..08cda69 100644
--- a/images/Makefile.am
+++ b/images/Makefile.am
@@ -1,4 +1,3 @@
-SUBDIRS = cursors
dist_pkgdata_DATA = abiword.png \
background.png \
calculator.png \
@@ -6,4 +5,5 @@ dist_pkgdata_DATA = abiword.png \
gimp.png \
keyboard.png \
malaminya.png \
- terminal.png
+ terminal.png \
+ bare_cursor.png
diff --git a/images/bare_cursor.png b/images/bare_cursor.png
new file mode 100644
index 0000000..019e2cb
--- /dev/null
+++ b/images/bare_cursor.png
Binary files differ
diff --git a/images/cursors/Makefile.am b/images/cursors/Makefile.am
deleted file mode 100644
index 61adbbc..0000000
--- a/images/cursors/Makefile.am
+++ /dev/null
@@ -1,21 +0,0 @@
-cursordir = $(pkgdatadir)/cursors/
-CURSORS = cursor1.cur \
- cursor2.cur \
- cursor3.cur \
- cursor4.cur \
- cursor5.cur \
- cursor6.cur \
- cursor7.cur \
- cursor8.cur \
- cursor9.cur
-
-dist_cursor_DATA = $(CURSORS) \
- cursor_original.xcf \
- cursorgen.sh
-
-CLEANFILES = $(CURSORS)
-
-# generate the cursors images
-%.cur:%.png
- @echo "Generating cursor images"
- @sh cursorgen.sh
diff --git a/images/cursors/cursor1.png b/images/cursors/cursor1.png
deleted file mode 100644
index df448ea..0000000
--- a/images/cursors/cursor1.png
+++ /dev/null
Binary files differ
diff --git a/images/cursors/cursor2.png b/images/cursors/cursor2.png
deleted file mode 100644
index cd2f905..0000000
--- a/images/cursors/cursor2.png
+++ /dev/null
Binary files differ
diff --git a/images/cursors/cursor3.png b/images/cursors/cursor3.png
deleted file mode 100644
index a642ace..0000000
--- a/images/cursors/cursor3.png
+++ /dev/null
Binary files differ
diff --git a/images/cursors/cursor4.png b/images/cursors/cursor4.png
deleted file mode 100644
index 786aed1..0000000
--- a/images/cursors/cursor4.png
+++ /dev/null
Binary files differ
diff --git a/images/cursors/cursor5.png b/images/cursors/cursor5.png
deleted file mode 100644
index d418f91..0000000
--- a/images/cursors/cursor5.png
+++ /dev/null
Binary files differ
diff --git a/images/cursors/cursor6.png b/images/cursors/cursor6.png
deleted file mode 100644
index 3760ced..0000000
--- a/images/cursors/cursor6.png
+++ /dev/null
Binary files differ
diff --git a/images/cursors/cursor7.png b/images/cursors/cursor7.png
deleted file mode 100644
index c7a00d7..0000000
--- a/images/cursors/cursor7.png
+++ /dev/null
Binary files differ
diff --git a/images/cursors/cursor8.png b/images/cursors/cursor8.png
deleted file mode 100644
index 32111f1..0000000
--- a/images/cursors/cursor8.png
+++ /dev/null
Binary files differ
diff --git a/images/cursors/cursor9.png b/images/cursors/cursor9.png
deleted file mode 100644
index 9424cff..0000000
--- a/images/cursors/cursor9.png
+++ /dev/null
Binary files differ
diff --git a/images/cursors/cursor_original.xcf b/images/cursors/cursor_original.xcf
deleted file mode 100644
index 7c1b280..0000000
--- a/images/cursors/cursor_original.xcf
+++ /dev/null
Binary files differ
diff --git a/images/cursors/cursorgen.sh b/images/cursors/cursorgen.sh
deleted file mode 100644
index 55e30f9..0000000
--- a/images/cursors/cursorgen.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-TMPFILE=/tmp/xcursorgen.config
-DST=$PWD
-
-for file in cursor*.png
-do
- echo "32 2 3 $file 0" > $TMPFILE
- xcursorgen $TMPFILE "${file%%.png}.cur"
-done
-
-rm $TMPFILE
diff --git a/src/Config.cpp b/src/Config.cpp
index abc1b70..602b002 100644
--- a/src/Config.cpp
+++ b/src/Config.cpp
@@ -49,8 +49,13 @@ Config::Config(XConn* x11)
clientOffset = 3;
imgBackground = IMAGEPATH "background.png";
kbdImage = IMAGEPATH "keyboard.png";
+ crsImage = IMAGEPATH "bare_cursor.png";
windowBarHeight = 30;
+ idXOffset = 11;
+ idYOffset = 25;
+ idFontSize = 18;
+
buttonWidth = 20;
buttonHeight = 10;
diff --git a/src/Config.h b/src/Config.h
index 57bf757..9ea5ab9 100644
--- a/src/Config.h
+++ b/src/Config.h
@@ -28,6 +28,12 @@ class Config
public:
char* imgBackground;
char* kbdImage;
+ char* crsImage;
+
+ int idXOffset;
+ int idYOffset;
+ int idFontSize;
+
int clientOffset;
int windowBarHeight;
int resizeBarHeight;
diff --git a/src/Makefile.am b/src/Makefile.am
index 1edf066..017f63b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,5 +1,5 @@
bin_PROGRAMS = mpwm
-INCLUDES=@MPWM_CFLAGS@ -DIMAGEPATH=\"${datadir}/@PACKAGE@/\"
+INCLUDES=@MPWM_CFLAGS@ -DIMAGEPATH=\"${datadir}/@PACKAGE@/\" -DXCURSORGEN=\"@XCURSORGEN@\"
mpwm_LDADD = $(MPWM_LIBS)
mpwm_SOURCES = main.cpp \
diff --git a/src/PointerDevice.cpp b/src/PointerDevice.cpp
index daa5e56..d5bd91f 100644
--- a/src/PointerDevice.cpp
+++ b/src/PointerDevice.cpp
@@ -50,14 +50,13 @@ PointerDevice::PointerDevice(XDeviceInfo* dev, XConn* x11, Manager* manager)
XSelectExtensionEvent(x11->dpy, x11->root, &motion, 1);
color = Config::getInstance()->cursorColor(pointerID);
- std::string filename = std::string(IMAGEPATH"/cursors/cursor");
- filename += (char)((dev->id % 10)+ '0');
- filename += ".cur";
- Cursor cursor = XcursorFilenameLoadCursor(x11->dpy, filename.c_str());
+ generatePointerImage(dev->id);
+
+ Cursor cursor = XcursorFilenameLoadCursor(x11->dpy, "/tmp/.mpwm_pointer.cur");
XDefineDeviceCursor(x11->dpy, d, x11->root, cursor);
- TRACE("Device %d (%s) initialised, with cursor %s\n",
- (unsigned int)dev->id, dev->name, filename.c_str());
+ TRACE("Device %d (%s) initialised\n",
+ (unsigned int)dev->id, dev->name);
}
/**
@@ -229,3 +228,68 @@ void PointerDevice::setButtonPressEventMask(Window win)
XEventClass evclass = evclasses[XI_ButtonPress];
XSelectExtensionEvent(x11->dpy, win, &evclass, 1);
}
+
+void PointerDevice::generatePointerImage(int number){
+ int bare_cursor_width,
+ bare_cursor_height,
+ total_width,
+ total_height;
+ stringstream s;
+ s << number;
+ std::string text = std::string(s.str());
+
+ cairo_surface_t* dummy_surface;
+ cairo_surface_t* main_surface;
+ cairo_t* cr;
+
+ TRACE("Generating cursor from %s\n",Config::getInstance()->crsImage);
+ cairo_surface_t* png_cursor =
+ cairo_image_surface_create_from_png(Config::getInstance()->crsImage);
+ bare_cursor_width = cairo_image_surface_get_width(png_cursor);
+ bare_cursor_height = cairo_image_surface_get_height(png_cursor);
+
+ dummy_surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,10,10);
+ cr = cairo_create(dummy_surface);
+ cairo_text_extents_t est;
+ cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL,
+ CAIRO_FONT_WEIGHT_BOLD);
+ cairo_set_font_size (cr, Config::getInstance()->idFontSize);
+
+ cairo_text_extents(cr,text.c_str(),&est);
+ TRACE("Generated ID pointer text (%2.0fx%2.0f)\n",est.width,est.height);
+
+ total_width = (int)(Config::getInstance()->idXOffset + est.width + est.x_bearing);
+ total_height = (int)(Config::getInstance()->idYOffset + est.height + est.y_bearing);
+
+ main_surface = cairo_image_surface_create(
+ CAIRO_FORMAT_ARGB32,
+ total_width,
+ total_height
+ );
+
+ cr = cairo_create(main_surface);
+ cairo_set_source_surface(cr,png_cursor,0,0);
+ cairo_paint (cr);
+
+ cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL,
+ CAIRO_FONT_WEIGHT_BOLD);
+ cairo_set_font_size (cr, Config::getInstance()->idFontSize);
+
+ cairo_set_source_rgb(cr,255,0,0);
+ cairo_move_to(cr,Config::getInstance()->idXOffset,Config::getInstance()->idYOffset);
+ cairo_show_text(cr,text.c_str());
+
+ cairo_surface_write_to_png(main_surface,"/tmp/.mpwm_pointer.png");
+
+ cairo_destroy(cr);
+ cairo_surface_destroy(dummy_surface);
+ cairo_surface_destroy(main_surface);
+ cairo_surface_destroy(png_cursor);
+
+ /*FIXME: I should use internal API*/
+ /*/usr/include/X11/Xcursor/Xcursor.h*/
+ /*XCursorImage* XcursorFileLoadImage(FILE* file,int size)*/
+ /*Cursor XcursorImageLoadCursor(Display* dpy,const XcursorImage* image)*/
+ system("echo \"24 0 0 /tmp/.mpwm_pointer.png \" > /tmp/.mpwm_pointer.cfg");
+ system(XCURSORGEN" /tmp/.mpwm_pointer.cfg /tmp/.mpwm_pointer.cur");
+}
diff --git a/src/PointerDevice.h b/src/PointerDevice.h
index 2182314..ce97b84 100644
--- a/src/PointerDevice.h
+++ b/src/PointerDevice.h
@@ -10,6 +10,7 @@
#include<X11/extensions/XInput.h>
#include<map>
#include<string>
+#include<sstream>
#include "DeviceError.h"
#include "Config.h"
#include "logger.h"
@@ -69,6 +70,9 @@ class PointerDevice
long getColor() { return color; }
void setButtonPressEventMask(Window win);
+
+ private:
+ void generatePointerImage(int number);
};
#endif