/** xpmcursor.c **/ #include gint eventDelete(GtkWidget *widget, GdkEvent *event,gpointer data); gint eventDestroy(GtkWidget *widget, GdkEvent *event,gpointer data); GdkCursor *newCursorFromXPM(gchar *xpm[], gchar blackLetter,GdkColor *blackColor, gchar whiteLetter,GdkColor *whiteColor, gint xHot,gint yHot); #include "sancha.xpm" GdkColor green = {0,0x0000,0xFFFF,0x0000}; GdkColor black = {0,0x0000,0x0000,0x0000}; int main(int argc,char *argv[]) { GtkWidget *topLevel; GdkCursor *cursor; gnome_init("xpmcursor","1.0",argc,argv); topLevel = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(topLevel), 150,150); gtk_signal_connect(GTK_OBJECT(topLevel),"delete_event", GTK_SIGNAL_FUNC(eventDelete),NULL); gtk_signal_connect(GTK_OBJECT(topLevel),"destroy", GTK_SIGNAL_FUNC(eventDestroy),NULL); gtk_widget_show_all(topLevel); cursor = newCursorFromXPM(sancha, 'B',&black,'W',&green, 12,13); gdk_window_set_cursor(topLevel->window,cursor); gtk_main(); exit(0); } GdkCursor *newCursorFromXPM(gchar *xpm[], gchar blackLetter,GdkColor *blackColor, gchar whiteLetter,GdkColor *whiteColor, gint xHot,gint yHot) { gint height; gint width; gint colors; gint pchars; gint x; gint y; GdkBitmap *bitmap; GdkBitmap *mask; GdkCursor *cursor; guchar *bitmapData; guchar *maskData; gint byteIndex = 0; gint bitCount = 0; sscanf(xpm[0],"%d %d %d %d", &height,&width,&colors,&pchars); g_assert(pchars == 1); bitmapData = (guchar *)g_malloc((width * height) / 8); maskData = (guchar *)g_malloc((width * height) / 8); for(y=(colors+4); y < (height+4); y++) { for(x=0; x>= 1; bitmapData[byteIndex] >>= 1; } } } bitmap = gdk_bitmap_create_from_data(NULL,bitmapData, width,height); mask = gdk_bitmap_create_from_data(NULL,maskData, width,height); cursor = gdk_cursor_new_from_pixmap(bitmap,mask, whiteColor,blackColor, xHot,yHot); g_free(bitmapData); g_free(maskData); return(cursor); } gint eventDelete(GtkWidget *widget, GdkEvent *event,gpointer data) { return(FALSE); } gint eventDestroy(GtkWidget *widget, GdkEvent *event,gpointer data) { gtk_main_quit(); return(0); }