diff options
Diffstat (limited to 'app/wlib/gtklib/gtkdraw-cairo.c')
-rw-r--r-- | app/wlib/gtklib/gtkdraw-cairo.c | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/app/wlib/gtklib/gtkdraw-cairo.c b/app/wlib/gtklib/gtkdraw-cairo.c index a19eb2b..4f3b1d2 100644 --- a/app/wlib/gtklib/gtkdraw-cairo.c +++ b/app/wlib/gtklib/gtkdraw-cairo.c @@ -174,8 +174,9 @@ static cairo_t* gtkDrawCreateCairoContext( } case wDrawLineDash: { - double dashes[] = { 5, 5 }; - cairo_set_dash(cairo, dashes, 2, 0); + double dashes[] = { 5, 3 }; + static int len_dashes = sizeof(dashes) / sizeof(dashes[0]); + cairo_set_dash(cairo, dashes, len_dashes, 0); break; } } @@ -183,13 +184,14 @@ static cairo_t* gtkDrawCreateCairoContext( if(opts & wDrawOptTemp) { cairo_set_source_rgba(cairo, 0, 0, 0, 0); + cairo_set_operator(cairo, CAIRO_OPERATOR_OVER); } else { GdkColor* const gcolor = wlibGetColor(color, TRUE); cairo_set_source_rgb(cairo, gcolor->red / 65535.0, gcolor->green / 65535.0, gcolor->blue / 65535.0); - cairo_set_operator(cairo, CAIRO_OPERATOR_OVER); + cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE); } return cairo; @@ -197,6 +199,7 @@ static cairo_t* gtkDrawCreateCairoContext( static cairo_t* gtkDrawDestroyCairoContext(cairo_t *cairo) { cairo_destroy(cairo); + return NULL; } void wDrawDelayUpdate( @@ -442,7 +445,7 @@ static cairo_t* gtkDrawDestroyCairoContext(cairo_t *cairo) { update_rect.x = (gint) x - ascent - descent - 1; update_rect.y = (gint) y - (gint) ascent - 1; update_rect.width = (gint) (w * cos( angle ) + 2 + ascent + descent); - update_rect.height = (gint) (w * sin( angle ) + ascent + descent + 2 ); + update_rect.height = (gint) (h * sin( angle ) + ascent + descent + 2 ); gtk_widget_draw(bd->widget, &update_rect); } @@ -469,8 +472,8 @@ static cairo_t* gtkDrawDestroyCairoContext(cairo_t *cairo) { (int *) &ascent, (int *) &descent)); *w = (wPos_t) textWidth; - *h = (wPos_t) ascent; - *d = (wPos_t) descent; + *h = (wPos_t) textHeight; + *d = (wPos_t) textHeight-ascent; if (debugWindow >= 3) fprintf(stderr, "text metrics: w=%d, h=%d, d=%d\n", *w, *h, *d); @@ -693,7 +696,7 @@ static cairo_t* gtkDrawDestroyCairoContext(cairo_t *cairo) { wDrawColor color, wDrawOpts opts ) { - GdkGC * gc; + //GdkGC * gc; GdkRectangle update_rect; int i, j, wb; wPos_t xx, yy; @@ -703,7 +706,8 @@ static cairo_t* gtkDrawDestroyCairoContext(cairo_t *cairo) { x = INMAPX( bd, x-bm->x ); y = INMAPY( bd, y-bm->y )-bm->h; wb = (bm->w+7)/8; - gc = selectGC( bd, 0, wDrawLineSolid, color, opts ); + //gc = selectGC( bd, 0, wDrawLineSolid, color, opts ); + cairo_t* cairo = gtkDrawCreateCairoContext(bd, 0, wDrawLineSolid, color, opts); for ( i=0; i<bm->w; i++ ) for ( j=0; j<bm->h; j++ ) @@ -732,7 +736,9 @@ static cairo_t* gtkDrawDestroyCairoContext(cairo_t *cairo) { continue; } /*printf( "gdk_draw_point( %ld, gc, %d, %d )\n", (long)gdk_window, xx, yy );*/ - gdk_draw_point( gdk_window, gc, xx, yy ); + //gdk_draw_point( gdk_window, gc, xx, yy ); + cairo_rectangle(cairo, xx-0.5, yy-0.5, 1, 1); + cairo_fill(cairo); if ( b && b->type == B_DRAW ) { update_rect.x = xx-1; update_rect.y = yy-1; @@ -741,6 +747,7 @@ static cairo_t* gtkDrawDestroyCairoContext(cairo_t *cairo) { gtk_widget_draw( b->widget, &update_rect ); } } + gtkDrawDestroyCairoContext(cairo); #ifdef LATER gdk_draw_pixmap(bd->pixmap, gc, bm->pixmap, @@ -836,9 +843,9 @@ static cairo_t* gtkDrawDestroyCairoContext(cairo_t *cairo) { bd->pixmap = gdk_pixmap_new( bd->widget->window, w, h, -1 ); wDrawClear( bd ); - /*bd->redraw( bd, bd->context, w, h );*/ + bd->redraw( bd, bd->context, w, h ); } - /*wRedraw( bd );*/ + /*wRedraw( bd )*/; } @@ -996,7 +1003,8 @@ static gint draw_button_event( printf( "%s[%dx%d]\n", actionNames[action], bd->lastX, bd->lastY ); bd->action( bd, bd->context, action, bd->lastX, bd->lastY ); } - gtk_widget_grab_focus( bd->widget ); + if (!(bd->option & BD_NOFOCUS)) + gtk_widget_grab_focus( bd->widget ); return TRUE; } @@ -1032,7 +1040,8 @@ static gint draw_motion_event( if (drawVerbose >= 2) printf( "%lx: %s[%dx%d] %s\n", (long)bd, actionNames[action], bd->lastX, bd->lastY, event->is_hint?"<Hint>":"<>" ); bd->action( bd, bd->context, action, bd->lastX, bd->lastY ); - gtk_widget_grab_focus( bd->widget ); + if (!(bd->option & BD_NOFOCUS)) + gtk_widget_grab_focus( bd->widget ); return TRUE; } @@ -1042,11 +1051,17 @@ static gint draw_char_event( GdkEventKey *event, wDraw_p bd ) { + GdkModifierType modifiers; guint key = event->keyval; wAccelKey_e extKey = wAccelKey_None; switch (key) { case GDK_KEY_Escape: key = 0x1B; break; - case GDK_KEY_Return: key = 0x0D; break; + case GDK_KEY_Return: + modifiers = gtk_accelerator_get_default_mod_mask(); + if (((event->state & modifiers)==GDK_CONTROL_MASK) || ((event->state & modifiers)==GDK_MOD1_MASK)) + extKey = wAccelKey_LineFeed; //If Return plus Control or Alt send in LineFeed + key = 0x0D; + break; case GDK_KEY_Linefeed: key = 0x0A; break; case GDK_KEY_Tab: key = 0x09; break; case GDK_KEY_BackSpace: key = 0x08; break; @@ -1141,7 +1156,9 @@ int xw, xh, cw, ch; (GtkSignalFunc) draw_char_event, bd); gtk_signal_connect (GTK_OBJECT (bd->widget), "leave_notify_event", (GtkSignalFunc) draw_leave_event, bd); - GTK_WIDGET_SET_FLAGS(GTK_WIDGET(bd->widget), GTK_CAN_FOCUS); + gtk_widget_set_can_focus(bd->widget,!(option & BD_NOFOCUS)); + //if (!(option & BD_NOFOCUS)) + // GTK_WIDGET_SET_FLAGS(GTK_WIDGET(bd->widget), GTK_CAN_FOCUS); gtk_widget_set_events (bd->widget, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK |