#ifdef HAVE_CONFIG_H # include #endif #include #include "callbacks.h" #include "interface.h" #include "support.h" enum { FIRST_CLICK, /* 1回目のクリック */ SECOND_CLICK /* 2回目のクリック */ }; /* クリックカウント用(1ビットカウンタ)*/ gint click_count = FIRST_CLICK; /* 直線の始点の座標 */ gint x0=0,y0=0; /* ラバーバンドの終点座標(消去用) */ gint x1=0,y1=0; /* ラバーバンド描画用GC */ GdkGC *rubber_gc=NULL; /* drawingareaが生成されたとき */ void on_drawingarea_realize (GtkWidget *widget, gpointer user_data) { /* マウスモーションイベントをブロック */ g_signal_handlers_block_by_func(G_OBJECT(widget), G_CALLBACK(on_drawingarea_motion_notify_event),NULL); /* drawingareaの背景色を取得 */ GtkStyle *style = gtk_widget_get_style(widget); GdkColor bgcolor=style->bg[0]; /* ラバーバンド用グラフィックコンテキストを生成 */ rubber_gc = gdk_gc_new(widget->window); /* ラバーバンドの描画色(水色) */ GdkColor rubber_color; rubber_color.red = 0; rubber_color.green = 0xffff; rubber_color.blue = 0xffff; /* ラバーバンド用前景色の設定 */ GdkColor fgcolor; fgcolor.red = (rubber_color.red)^(bgcolor.red); fgcolor.green = (rubber_color.green)^(bgcolor.green); fgcolor.blue = (rubber_color.blue)^(bgcolor.blue); gdk_color_alloc(gdk_colormap_get_system(), &fgcolor); gdk_gc_set_foreground(rubber_gc, &fgcolor); /* XOR描画モードに設定する */ gdk_gc_set_function(rubber_gc, GDK_XOR); } /* drawingarea内でマウスのボタンが押されたとき */ gboolean on_drawingarea_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { /* グラフィックコンテキスト(黒) */ GdkGC *gc = widget->style->black_gc; /* クリック時のマウスカーソルの座標 */ gint x = (gint)event->x; gint y = (gint)event->y; switch(click_count) { /* 1回目のクリックの場合は始点を設定 */ case FIRST_CLICK: x0 = x; y0=y; /* 直線の始点を設定 */ x1=x0; y1=y0; /* ラバーバンドの終点を初期化 */ /* マウスモーションイベントのブロック解除 */ g_signal_handlers_unblock_by_func(G_OBJECT(widget), G_CALLBACK(on_drawingarea_motion_notify_event),NULL); break; /* 2回目のクリックの場合は直線を描画 */ case SECOND_CLICK: gdk_draw_line(widget->window,gc,x0,y0,x,y); /* マウスモーションイベントをブロック */ g_signal_handlers_block_by_func(G_OBJECT(widget), G_CALLBACK(on_drawingarea_motion_notify_event),NULL); break; } /* クリック・カウンタをカウントアップ */ click_count++; click_count=click_count%2; return FALSE; } /* drawingarea内でマウスが動いたとき */ gboolean on_drawingarea_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, gpointer user_data) { /* マウスカーソルの座標 */ gint x = (gint)event->x; gint y = (gint)event->y; /* 前回の線を消去 */ gdk_draw_line(widget->window,rubber_gc,x0,y0,x1,y1); /* ラバーバンドを描画 */ gdk_draw_line(widget->window,rubber_gc,x0,y0,x,y); /* 現在のマウスポインタの位置を保存 */ x1=(gint)event->x; y1=(gint)event->y; return FALSE; }