diff options
author | Gianluca Pacchiella <pacchiel@studenti.ph.unito.it> | 2007-08-03 20:00:01 +0200 |
---|---|---|
committer | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-08-06 13:37:05 +0930 |
commit | b91e7faee69bf5dadfa31fe4dc3cf9a0a0b6f1ca (patch) | |
tree | 1b30c52fa8685003a165eaf529367bdb2cb3dcef | |
parent | 32895d3ae72e90886b5f9dcc97c5a71aface7e69 (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.ac | 1 | ||||
-rw-r--r-- | images/Makefile.am | 4 | ||||
-rw-r--r-- | images/bare_cursor.png | bin | 0 -> 407 bytes | |||
-rw-r--r-- | images/cursors/Makefile.am | 21 | ||||
-rw-r--r-- | images/cursors/cursor1.png | bin | 420 -> 0 bytes | |||
-rw-r--r-- | images/cursors/cursor2.png | bin | 499 -> 0 bytes | |||
-rw-r--r-- | images/cursors/cursor3.png | bin | 538 -> 0 bytes | |||
-rw-r--r-- | images/cursors/cursor4.png | bin | 467 -> 0 bytes | |||
-rw-r--r-- | images/cursors/cursor5.png | bin | 487 -> 0 bytes | |||
-rw-r--r-- | images/cursors/cursor6.png | bin | 546 -> 0 bytes | |||
-rw-r--r-- | images/cursors/cursor7.png | bin | 476 -> 0 bytes | |||
-rw-r--r-- | images/cursors/cursor8.png | bin | 568 -> 0 bytes | |||
-rw-r--r-- | images/cursors/cursor9.png | bin | 547 -> 0 bytes | |||
-rw-r--r-- | images/cursors/cursor_original.xcf | bin | 1876 -> 0 bytes | |||
-rw-r--r-- | images/cursors/cursorgen.sh | 10 | ||||
-rw-r--r-- | src/Config.cpp | 5 | ||||
-rw-r--r-- | src/Config.h | 6 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/PointerDevice.cpp | 76 | ||||
-rw-r--r-- | src/PointerDevice.h | 4 |
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 Binary files differnew file mode 100644 index 0000000..019e2cb --- /dev/null +++ b/images/bare_cursor.png 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 Binary files differdeleted file mode 100644 index df448ea..0000000 --- a/images/cursors/cursor1.png +++ /dev/null diff --git a/images/cursors/cursor2.png b/images/cursors/cursor2.png Binary files differdeleted file mode 100644 index cd2f905..0000000 --- a/images/cursors/cursor2.png +++ /dev/null diff --git a/images/cursors/cursor3.png b/images/cursors/cursor3.png Binary files differdeleted file mode 100644 index a642ace..0000000 --- a/images/cursors/cursor3.png +++ /dev/null diff --git a/images/cursors/cursor4.png b/images/cursors/cursor4.png Binary files differdeleted file mode 100644 index 786aed1..0000000 --- a/images/cursors/cursor4.png +++ /dev/null diff --git a/images/cursors/cursor5.png b/images/cursors/cursor5.png Binary files differdeleted file mode 100644 index d418f91..0000000 --- a/images/cursors/cursor5.png +++ /dev/null diff --git a/images/cursors/cursor6.png b/images/cursors/cursor6.png Binary files differdeleted file mode 100644 index 3760ced..0000000 --- a/images/cursors/cursor6.png +++ /dev/null diff --git a/images/cursors/cursor7.png b/images/cursors/cursor7.png Binary files differdeleted file mode 100644 index c7a00d7..0000000 --- a/images/cursors/cursor7.png +++ /dev/null diff --git a/images/cursors/cursor8.png b/images/cursors/cursor8.png Binary files differdeleted file mode 100644 index 32111f1..0000000 --- a/images/cursors/cursor8.png +++ /dev/null diff --git a/images/cursors/cursor9.png b/images/cursors/cursor9.png Binary files differdeleted file mode 100644 index 9424cff..0000000 --- a/images/cursors/cursor9.png +++ /dev/null diff --git a/images/cursors/cursor_original.xcf b/images/cursors/cursor_original.xcf Binary files differdeleted file mode 100644 index 7c1b280..0000000 --- a/images/cursors/cursor_original.xcf +++ /dev/null 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 |