diff --git a/xwords4/linux/gtkboard.c b/xwords4/linux/gtkboard.c index 57c33c779..ad96099fb 100644 --- a/xwords4/linux/gtkboard.c +++ b/xwords4/linux/gtkboard.c @@ -812,55 +812,6 @@ configure_event( GtkWidget* widget, GdkEventConfigure* XP_UNUSED(event), return TRUE; } /* configure_event */ -/* Redraw the screen from the backing pixmap */ -static gint -expose_event( GtkWidget* XP_UNUSED(widget), - GdkEventExpose* XP_UNUSED(event), - GtkGameGlobals* globals ) -{ - /* - gdk_draw_rectangle( widget->window,//((GtkDrawCtx*)globals->draw)->pixmap, - widget->style->white_gc, - TRUE, - 0, 0, - widget->allocation.width, - widget->allocation.height+widget->allocation.y ); - */ - /* I want to inval only the area that's exposed, but the rect is always - empty, even when clearly shouldn't be. Need to investigate. Until - fixed, use board_invalAll to ensure board is drawn.*/ -/* board_invalRect( globals->cGlobals.game.board, (XP_Rect*)&event->area ); */ - - board_invalAll( globals->cGlobals.game.board ); - board_draw( globals->cGlobals.game.board ); - draw_gtk_status( globals->draw, globals->stateChar ); - -/* gdk_draw_pixmap( widget->window, */ -/* widget->style->fg_gc[GTK_WIDGET_STATE (widget)], */ -/* ((GtkDrawCtx*)globals->draw)->pixmap, */ -/* event->area.x, event->area.y, */ -/* event->area.x, event->area.y, */ -/* event->area.width, event->area.height ); */ - - return FALSE; -} /* expose_event */ - -#if 0 -static gint -handle_client_event( GtkWidget *widget, GdkEventClient *event, - GtkGameGlobals* globals ) -{ - XP_LOGF( "handle_client_event called: event->type = " ); - if ( event->type == GDK_CLIENT_EVENT ) { - XP_LOGF( "GDK_CLIENT_EVENT" ); - return 1; - } else { - XP_LOGF( "%d", event->type ); - return 0; - } -} /* handle_client_event */ -#endif - void destroy_board_window( GtkWidget* XP_UNUSED(widget), GtkGameGlobals* globals ) { @@ -1260,8 +1211,6 @@ createAddItem( GtkWidget* parent, gchar* label, { GtkWidget* item = gtk_menu_item_new_with_label( label ); -/* g_print( "createAddItem called with label %s\n", label ); */ - if ( handlerFunc != NULL ) { g_signal_connect( item, "activate", G_CALLBACK(handlerFunc), globals ); @@ -2653,11 +2602,19 @@ initGlobalsNoDraw( GtkGameGlobals* globals, LaunchParams* params, setupGtkUtilCallbacks( globals, globals->cGlobals.util ); } +/* This gets called all the time, e.g. when the mouse moves across + drawing-area boundaries. So invalidating is crazy expensive. But this is a + test app....*/ + static gboolean on_draw_event( GtkWidget *widget, cairo_t* cr, gpointer user_data ) { - LOG_FUNC(); - XP_USE(user_data); + // XP_LOGF( "%s(widget=%p)", __func__, widget ); + GtkGameGlobals* globals = (GtkGameGlobals*)user_data; + board_invalAll( globals->cGlobals.game.board ); + board_draw( globals->cGlobals.game.board ); + draw_gtk_status( globals->draw, globals->stateChar ); + XP_USE(widget); XP_USE(cr); return FALSE; @@ -2748,8 +2705,6 @@ initGlobals( GtkGameGlobals* globals, LaunchParams* params, CurGameInfo* gi ) gtk_box_pack_start( GTK_BOX(vbox), hbox/* drawing_area */, TRUE, TRUE, 0); - g_signal_connect( drawing_area, "expose_event", - G_CALLBACK(expose_event), globals ); g_signal_connect( drawing_area,"configure_event", G_CALLBACK(configure_event), globals ); g_signal_connect( drawing_area, "button_press_event", diff --git a/xwords4/linux/gtkdraw.c b/xwords4/linux/gtkdraw.c index f22de74f8..a4800fa77 100644 --- a/xwords4/linux/gtkdraw.c +++ b/xwords4/linux/gtkdraw.c @@ -85,10 +85,10 @@ gtkInsetRect( XP_Rect* r, short i ) static void initCairo( GtkDrawCtx* dctx ) { - XP_LOGF( "%s(dctx=%p)", __func__, dctx ); + /* XP_LOGF( "%s(dctx=%p)", __func__, dctx ); */ XP_ASSERT( !dctx->_cairo ); dctx->_cairo = gdk_cairo_create( gtk_widget_get_window(dctx->drawing_area) ); - XP_LOGF( "dctx->cairo=%p", dctx->_cairo ); + /* XP_LOGF( "dctx->cairo=%p", dctx->_cairo ); */ cairo_set_line_width( dctx->_cairo, 1.0 ); cairo_set_line_cap( dctx->_cairo, CAIRO_LINE_CAP_SQUARE ); } @@ -96,7 +96,7 @@ initCairo( GtkDrawCtx* dctx ) static void destroyCairo( GtkDrawCtx* dctx ) { - XP_LOGF( "%s(dctx=%p)", __func__, dctx ); + /* XP_LOGF( "%s(dctx=%p)", __func__, dctx ); */ XP_ASSERT( !!dctx->_cairo ); cairo_destroy(dctx->_cairo); dctx->_cairo = NULL; @@ -468,9 +468,7 @@ gtk_draw_boardBegin( DrawCtx* p_dctx, const XP_Rect* rect, gdkrect = *(GdkRectangle*)rect; ++gdkrect.width; ++gdkrect.height; -/* gdk_gc_set_clip_rectangle( dctx->drawGC, &gdkrect ); */ - LOG_RETURN_VOID(); return XP_TRUE; } /* gtk_draw_boardBegin */ @@ -947,7 +945,6 @@ gtkDrawDrawRemText( DrawCtx* p_dctx, const XP_Rect* rect, XP_S16 nTilesLeft, } *widthP = width; *heightP = height; - XP_LOGF( "%s(): setting width: %d, height: %d", __func__, width, height ); } else { const GdkRGBA* cursor = NULL; if ( focussed ) { @@ -1485,6 +1482,8 @@ gtkDrawCtxtMake( GtkWidget* drawing_area, GtkGameGlobals* globals ) void draw_gtk_status( GtkDrawCtx* dctx, char ch ) { + initCairo( dctx ); + GtkGameGlobals* globals = dctx->globals; XP_Rect rect = { @@ -1499,6 +1498,8 @@ draw_gtk_status( GtkDrawCtx* dctx, char ch ) draw_string_at( dctx, NULL, str, GTKMIN_W_HT, &rect, XP_GTK_JUST_CENTER, &dctx->black, NULL ); + + destroyCairo( dctx ); } void