Hi, I am programming with Gtk+ v1.2 for mouse cursor changing.But I have some garbage displaying on mouse cursor when I do double clicking of mouse buttons many times.
Here I attached the codes.
Down 3 files are the attached ones too.
Did I miss some flushing functions?
bkna
FILE 1: cursor_f.xpm
/* XPM */
static char *cursor_f[] = {
/* width height ncolors chars_per_pixel */
"24 39 13 1",
/* colors */
"` c black",
"a c lime green",
"b c cyan",
"c c green",
"d c dodger blue",
"e c gainsboro",
"f c grey",
"g c sienna",
"i c orange",
"j c gold",
"k c slate grey",
"l c orange",
"m c sea green",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" aaaaaaaaaaaaaaaa ",
" aaaaaaaaaaaaaaaa ",
" aaa ",
" aaa ",
" aaa ",
" aaa aa ",
" aaaaaaaaaaaaa ",
" aaaaaaaaaaaaa ",
" aaa aa ",
" aaa ",
" aaa ",
" aaa ",
" aaa ",
" aaa ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" "
};
FILE 2: cusror_z.xpm
/* XPM */
static char *cursor_z[] = {
/* width height ncolors chars_per_pixel */
"24 39 13 1",
/* colors */
"` c black",
"a c lime green",
"b c cyan",
"c c green",
"d c dodger blue",
"e c gainsboro",
"f c grey",
"g c sienna",
"i c orange",
"j c gold",
"k c slate grey",
"l c orange",
"m c sea green",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" aaaaaaaaaaaaaaaa ",
" aaaaaaaaaaaaaaaa ",
" aaa ",
" aaa ",
" aaa ",
" aaa ",
" aaa ",
" aaaaaaaaaaaaaa ",
" aaaaaaaaaaaaaa ",
" aaa ",
" aaa ",
" aaa ",
" aaa ",
" aaa ",
" aaaaaaaaaaaaaaaa ",
" aaaaaaaaaaaaaaaa ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" "
};
FILE 3: cursor.c
#include <stdio.h>
#include <gtk/gtk.h>
int doubleclicks;
#include "cursor_f.xpm"
#include "cursor_z.xpm"
GdkColor red = {0,0xFFFF,0x0000,0x0000};
GdkColor white = {0,0xFFFF,0xFFFF,0xFFFF};
GdkCursor *newCursorFromXPM (gchar *xpm[],
gchar blackLetter,GdkColor *blackColor,
gchar whiteLetter,GdkColor *whiteColor,
gint xHot,gint yHot)
{
gint height, width, colors, pchars, x, y;
GdkBitmap *bitmap, *mask;
GdkCursor *cursor;
guchar *bitmapData, *maskData;
gint byteIndex = 0, bitCount = 0;
sscanf (xpm[0],"%d %d %d %d", &width, &height, &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<width; x++) {
if(xpm[y][x] == whiteLetter) {
maskData[byteIndex] |= 0x80;
bitmapData[byteIndex] |= 0x80;
}
else if(xpm[y][x] == blackLetter) {
maskData[byteIndex] |= 0x80;
}
if(++bitCount == 8) {
byteIndex++;
bitCount = 0;
}
else {
maskData[byteIndex] >>= 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);
}
void box_released(GtkWidget *widget, GdkEventButton *event)
{
gtk_grab_remove(widget);
gdk_pointer_ungrab(0);
}
void box_motion(GtkWidget *widget, GdkEventMotion *event)
{
}
void box_pressed(GtkWidget *widget, GdkEventButton *event, GtkWidget *topLevel)
{
GdkCursor *cursor;
if (event->type == GDK_2BUTTON_PRESS) {
if (doubleclicks) {
doubleclicks = 0;
cursor = newCursorFromXPM (cursor_z, 'b', &white, 'a', &red, 12, 13);
gdk_window_set_cursor (topLevel->window, cursor);
}
else {
doubleclicks = 1;
cursor = newCursorFromXPM (cursor_f, 'b', &white, 'a', &red, 12, 13);
gdk_window_set_cursor (topLevel->window, cursor);
}
}
gtk_grab_add(widget);
gdk_pointer_grab(widget->window, TRUE,
GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK, NULL, NULL, 0);
return;
}
int main(int argc, char *argv[])
{
GtkWidget *topwin;
GtkWidget *button;
GdkCursor *cursor;
gtk_set_locale();
gtk_init(&argc,&argv);
topwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
doubleclicks = 0;
gtk_container_border_width(GTK_CONTAINER(topwin),50);
button = gtk_toggle_button_new_with_label("button");
gtk_widget_set_events (button, GDK_BUTTON_MOTION_MASK|GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK);
gtk_signal_connect (GTK_OBJECT(button), "button_press_event", GTK_SIGNAL_FUNC(box_pressed), topwin);
gtk_signal_connect (GTK_OBJECT(button), "button_release_event", GTK_SIGNAL_FUNC(box_released), NULL);
gtk_signal_connect (GTK_OBJECT(button), "motion_notify_event", GTK_SIGNAL_FUNC(box_motion), NULL);
gtk_container_add(GTK_CONTAINER(topwin), button);
gtk_widget_show(button);
gtk_widget_show(topwin);
cursor = newCursorFromXPM (cursor_z, 'b', &white, 'a', &red, 12, 13);
gdk_window_set_cursor (topwin->window, cursor);
gtk_main();
return 0;
}
#include <stdio.h>
#include <gtk/gtk.h>
int doubleclicks;
#include "cursor_f.xpm"
#include "cursor_z.xpm"
GdkColor red = {0,0xFFFF,0x0000,0x0000};
GdkColor white = {0,0xFFFF,0xFFFF,0xFFFF};
GdkCursor *newCursorFromXPM (gchar *xpm[],
gchar blackLetter,GdkColor *blackColor,
gchar whiteLetter,GdkColor *whiteColor,
gint xHot,gint yHot)
{
gint height, width, colors, pchars, x, y;
GdkBitmap *bitmap, *mask;
GdkCursor *cursor;
guchar *bitmapData, *maskData;
gint byteIndex = 0, bitCount = 0;
sscanf (xpm[0],"%d %d %d %d", &width, &height, &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<width; x++) {
if(xpm[y][x] == whiteLetter) {
maskData[byteIndex] |= 0x80;
bitmapData[byteIndex] |= 0x80;
}
else if(xpm[y][x] == blackLetter) {
maskData[byteIndex] |= 0x80;
}
if(++bitCount == 8) {
byteIndex++;
bitCount = 0;
}
else {
maskData[byteIndex] >>= 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);
}
void box_released(GtkWidget *widget, GdkEventButton *event)
{
gtk_grab_remove(widget);
gdk_pointer_ungrab(0);
}
void box_motion(GtkWidget *widget, GdkEventMotion *event)
{
}
void box_pressed(GtkWidget *widget, GdkEventButton *event, GtkWidget *topLevel)
{
GdkCursor *cursor;
if (event->type == GDK_2BUTTON_PRESS) {
if (doubleclicks) {
doubleclicks = 0;
cursor = newCursorFromXPM (cursor_z, 'b', &white, 'a', &red, 12, 13);
gdk_window_set_cursor (topLevel->window, cursor);
}
else {
doubleclicks = 1;
cursor = newCursorFromXPM (cursor_f, 'b', &white, 'a', &red, 12, 13);
gdk_window_set_cursor (topLevel->window, cursor);
}
}
gtk_grab_add(widget);
gdk_pointer_grab(widget->window, TRUE,
GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK, NULL, NULL, 0);
return;
}
int main(int argc, char *argv[])
{
GtkWidget *topwin;
GtkWidget *button;
GdkCursor *cursor;
gtk_set_locale();
gtk_init(&argc,&argv);
topwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
doubleclicks = 0;
gtk_container_border_width(GTK_CONTAINER(topwin),50);
button = gtk_toggle_button_new_with_label("button");
gtk_widget_set_events (button, GDK_BUTTON_MOTION_MASK|GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK);
gtk_signal_connect (GTK_OBJECT(button), "button_press_event", GTK_SIGNAL_FUNC(box_pressed), topwin);
gtk_signal_connect (GTK_OBJECT(button), "button_release_event", GTK_SIGNAL_FUNC(box_released), NULL);
gtk_signal_connect (GTK_OBJECT(button), "motion_notify_event", GTK_SIGNAL_FUNC(box_motion), NULL);
gtk_container_add(GTK_CONTAINER(topwin), button);
gtk_widget_show(button);
gtk_widget_show(topwin);
cursor = newCursorFromXPM (cursor_z, 'b', &white, 'a', &red, 12, 13);
gdk_window_set_cursor (topwin->window, cursor);
gtk_main();
return 0;
}
Attachment:
makefile
Description: application/java-vm