diff --git a/xwords4/android/XWords4/res/values/common_rsrc.xml b/xwords4/android/XWords4/res/values/common_rsrc.xml index 0d9e4b96a..529248ac1 100644 --- a/xwords4/android/XWords4/res/values/common_rsrc.xml +++ b/xwords4/android/XWords4/res/values/common_rsrc.xml @@ -25,6 +25,7 @@ key_clr_tile_back key_clr_empty key_clr_crosshairs + key_board_theme key_relay_host key_relay_port2 key_proxy_port @@ -54,6 +55,7 @@ key_notagain_conndfirst key_notagain_conndmid key_notagain_dicts + key_notagain_arrow org.eehouse.android.xw4.relayids_extra @@ -80,6 +82,11 @@ @string/robot_smart + + @string/black_on_white + @string/white_on_black + + @string/connect_thirty_seconds @string/connect_five_mins diff --git a/xwords4/android/XWords4/res/values/strings.xml b/xwords4/android/XWords4/res/values/strings.xml index 527465e6a..968388803 100644 --- a/xwords4/android/XWords4/res/values/strings.xml +++ b/xwords4/android/XWords4/res/values/strings.xml @@ -268,7 +268,7 @@ Choose - Colors + Individual colors Edit colors used on the board First player Second player @@ -287,6 +287,10 @@ Tile background Empty cell/background Crosshairs color + Board color schemes + Dark background + Light background + Advanced You may never need these... Relay address @@ -488,6 +492,14 @@ here. Email me at eehouse@eehouse.org for information on building and installing your own dictionaries. + Moving tiles to the board:\nYou can + drag tiles between the rack and the board, or you can tap an + empty square to place the board arrow. Rack tiles you tap will + replace the arrow (moving it one square in the direction it + points.) Tap the arrow once to change its orientation; a second + time, to hide it. A checkbox in the Appearance section of + Settings will hide it permanently. + To start a basic networked two-player game in %s: diff --git a/xwords4/android/XWords4/res/xml/xwprefs.xml b/xwords4/android/XWords4/res/xml/xwprefs.xml index fbe8b2f64..d0872209d 100644 --- a/xwords4/android/XWords4/res/xml/xwprefs.xml +++ b/xwords4/android/XWords4/res/xml/xwprefs.xml @@ -49,11 +49,11 @@ - + + + + + + + @@ -112,16 +119,17 @@ android:title="@string/bonus_w3x" android:defaultValue="0xAFAFAF" /> - + + >= 8; + } + m_darkOnLight = sum > (127*3); + } + return m_darkOnLight; + } + + private Drawable loadAndRecolor( int resID, boolean useDark ) + { + Resources res = getResources(); + Drawable arrow = res.getDrawable( resID ); + + if ( !useDark ) { + Bitmap src = ((BitmapDrawable)arrow).getBitmap(); + Bitmap bitmap = src.copy( Bitmap.Config.ARGB_8888, true ); + for ( int xx = 0; xx < bitmap.getWidth(); ++xx ) { + for( int yy = 0; yy < bitmap.getHeight(); ++yy ) { + if ( BLACK == bitmap.getPixel( xx, yy ) ) { + bitmap.setPixel( xx, yy, WHITE ); + } + } + } + + arrow = new BitmapDrawable(bitmap); + } + return arrow; + } +} diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBUtils.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBUtils.java index a5b2aaaaf..d191b835a 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBUtils.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DBUtils.java @@ -27,6 +27,7 @@ import android.database.Cursor; import java.util.StringTokenizer; import android.content.ContentValues; import java.util.ArrayList; +import java.util.Date; import junit.framework.Assert; import org.eehouse.android.xw4.jni.*; @@ -356,7 +357,8 @@ public class DBUtils { } } - public static void saveGame( Context context, String path, byte[] bytes ) + public static void saveGame( Context context, String path, byte[] bytes, + boolean setCreate ) { initDB( context ); synchronized( s_dbHelper ) { @@ -366,6 +368,12 @@ public class DBUtils { ContentValues values = new ContentValues(); values.put( DBHelper.SNAPSHOT, bytes ); + long timestamp = new Date().getTime(); + if ( setCreate ) { + values.put( DBHelper.CREATE_TIME, timestamp ); + } + values.put( DBHelper.LASTPLAY_TIME, timestamp ); + int result = db.update( DBHelper.TABLE_NAME_SUM, values, selection, null ); if ( 0 == result ) { diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConverter.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConverter.java index e522de498..09513218c 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConverter.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameConverter.java @@ -37,7 +37,7 @@ public class GameConverter { Utils.logf( "GameConverter::convert() converting %s", game ); byte[] bytes = savedGame( context, game ); - DBUtils.saveGame( context, game, bytes ); + DBUtils.saveGame( context, game, bytes, true ); context.deleteFile( game ); } } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java index 0216bdda0..90f31f2f5 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameUtils.java @@ -79,7 +79,7 @@ public class GameUtils { if ( null != addr ) { XwJNI.comms_setAddr( gamePtr, addr ); } - saveGame( context, gamePtr, gi, pathOut ); + saveGame( context, gamePtr, gi, pathOut, true ); GameSummary summary = new GameSummary( gi ); XwJNI.game_summarize( gamePtr, summary ); @@ -142,27 +142,29 @@ public class GameUtils { } public static void saveGame( Context context, int gamePtr, - CurGameInfo gi, String path ) + CurGameInfo gi, String path, + boolean setCreate ) { byte[] stream = XwJNI.game_saveToStream( gamePtr, gi ); - saveGame( context, stream, path ); + saveGame( context, stream, path, setCreate ); } public static void saveGame( Context context, int gamePtr, CurGameInfo gi ) { - saveGame( context, gamePtr, gi, newName( context ) ); + saveGame( context, gamePtr, gi, newName( context ), false ); } - public static void saveGame( Context context, byte[] bytes, String path ) + public static void saveGame( Context context, byte[] bytes, + String path, boolean setCreate ) { - DBUtils.saveGame( context, path, bytes ); + DBUtils.saveGame( context, path, bytes, setCreate ); } public static String saveGame( Context context, byte[] bytes ) { String name = newName( context ); - saveGame( context, bytes, name ); + saveGame( context, bytes, name, false ); return name; } @@ -372,7 +374,7 @@ public class GameUtils { CommonPrefs.get( context ) ); gi.dictName = dict; - saveGame( context, gamePtr, gi, path ); + saveGame( context, gamePtr, gi, path, false ); GameSummary summary = new GameSummary( gi ); XwJNI.game_summarize( gamePtr, summary ); @@ -415,7 +417,7 @@ public class GameUtils { XwJNI.comms_setAddr( gamePtr, car ); } - GameUtils.saveGame( context, gamePtr, gi, path ); + saveGame( context, gamePtr, gi, path, false ); GameSummary summary = new GameSummary( gi ); XwJNI.game_summarize( gamePtr, summary ); diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesList.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesList.java index a12a0caf2..824009508 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesList.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesList.java @@ -134,7 +134,7 @@ public class GamesList extends XWListActivity }); break; default: - Assert.fail(); + // just drop it; super.onCreateDialog likely failed break; } } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/PrefsActivity.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/PrefsActivity.java index ab6965b2b..f3c1d9b5b 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/PrefsActivity.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/PrefsActivity.java @@ -31,6 +31,7 @@ import android.preference.PreferenceManager; import android.view.Menu; import android.view.MenuItem; import android.view.MenuInflater; +import java.util.HashSet; public class PrefsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { @@ -38,7 +39,11 @@ public class PrefsActivity extends PreferenceActivity private static final int REVERT_COLORS = 1; private static final int REVERT_ALL = 2; - private String[] m_keys; + private HashSet m_keys; + private String m_boardThemeKey; + private String m_keyEmpty; + private String m_whiteOnBlack; + private String m_blackOnWhite; @Override protected Dialog onCreateDialog( int id ) @@ -118,17 +123,22 @@ public class PrefsActivity extends PreferenceActivity R.string.key_initial_player_minutes, R.string.key_default_dict, R.string.key_default_phonies, + R.string.key_board_theme, }; SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences( this ); - m_keys = new String[ textKeyIds.length ]; + m_keys = new HashSet( textKeyIds.length ); for ( int ii = 0; ii < textKeyIds.length; ++ii ) { int id = textKeyIds[ii]; String key = getString( id ); setSummary( sp, key ); - m_keys[ii] = key; + m_keys.add( key ); } + m_boardThemeKey = getString( R.string.key_board_theme ); + m_keyEmpty = getString( R.string.key_empty ); + m_whiteOnBlack = getString( R.string.white_on_black ); + m_blackOnWhite = getString( R.string.black_on_white ); } @Override @@ -149,11 +159,28 @@ public class PrefsActivity extends PreferenceActivity public void onSharedPreferenceChanged( SharedPreferences sp, String key ) { - for ( String akey : m_keys ) { - if ( akey.equals( key ) ) { - setSummary( sp, key ); + if ( m_keys.contains( key ) ) { + setSummary( sp, key ); + } + + // Change those color elements that follow the "themes" -- + // currently only key_empty + while ( m_boardThemeKey.equals( key ) ) { // while allows break + String newValue = sp.getString( key, "" ); + + int color; + if ( m_whiteOnBlack.equals( newValue ) ) { + color = 0xFF000000; + } else if ( m_blackOnWhite.equals( newValue ) ) { + color = 0xFFFFFFFF; + } else { break; } + + SharedPreferences.Editor editor = sp.edit(); + editor.putInt( m_keyEmpty, color ); + editor.commit(); + break; } } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/BoardHandler.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/BoardHandler.java index b803e2ff8..bdadcdecd 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/BoardHandler.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/BoardHandler.java @@ -1,3 +1,4 @@ +/* -*- compile-command: "cd ../../../../../../; ant install"; -*- */ /* * Copyright 2009-2010 by Eric House (xwords@eehouse.org). All * rights reserved. @@ -19,8 +20,11 @@ package org.eehouse.android.xw4.jni; +import org.eehouse.android.xw4.XWActivity; + public interface BoardHandler { - void startHandling( JNIThread thread, int gamePtr, CurGameInfo gi ); + void startHandling( XWActivity parent, JNIThread thread, + int gamePtr, CurGameInfo gi ); } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/JNIThread.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/JNIThread.java index ec2e4d6f6..446081617 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/JNIThread.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/JNIThread.java @@ -262,7 +262,7 @@ public class JNIThread extends Thread { GameSummary summary = new GameSummary( m_gi ); XwJNI.game_summarize( m_jniGamePtr, summary ); byte[] state = XwJNI.game_saveToStream( m_jniGamePtr, null ); - GameUtils.saveGame( m_context, state, m_path ); + GameUtils.saveGame( m_context, state, m_path, false ); DBUtils.saveSummary( m_context, m_path, summary ); break; diff --git a/xwords4/common/server.c b/xwords4/common/server.c index 8313960ab..517ec69ed 100644 --- a/xwords4/common/server.c +++ b/xwords4/common/server.c @@ -1689,7 +1689,7 @@ server_setGameOverListener( ServerCtxt* server, GameOverListener gol, { server->vol.gameOverListener = gol; server->vol.gameOverData = data; -} /* server_setTurnChangeListener */ +} /* server_setGameOverListener */ static XP_Bool storeBadWords( XP_UCHAR* word, void* closure ) diff --git a/xwords4/linux/Makefile b/xwords4/linux/Makefile index c74d8ca54..d44af2488 100644 --- a/xwords4/linux/Makefile +++ b/xwords4/linux/Makefile @@ -37,6 +37,7 @@ ifdef CURSES_SMALL_SCREEN DO_CURSES += -DCURSES_SMALL_SCREEN endif DO_GTK = -DPLATFORM_GTK +# DO_GTK += -DUSE_CAIRO # uncomment for standalone build # STANDALONE = -DXWFEATURE_STANDALONE_ONLY @@ -178,8 +179,8 @@ endif ifneq (,$(findstring DPLATFORM_GTK,$(DEFINES))) LIBS += `pkg-config --libs gtk+-2.0` - CFLAGS += `pkg-config --cflags gtk+-2.0` \ - -DGDK_DISABLE_DEPRECATED + CFLAGS += `pkg-config --cflags gtk+-2.0` +# CFLAGS += -DGDK_DISABLE_DEPRECATED POINTER_SUPPORT = -DPOINTER_SUPPORT endif diff --git a/xwords4/linux/gtkdraw.c b/xwords4/linux/gtkdraw.c index 5876ca725..31d0c0df4 100644 --- a/xwords4/linux/gtkdraw.c +++ b/xwords4/linux/gtkdraw.c @@ -22,8 +22,6 @@ #include #include -#undef GDK_DISABLE_DEPRECATED - #include #include "gtkmain.h" @@ -64,31 +62,75 @@ gtkInsetRect( XP_Rect* r, short i ) #define GTKMIN_W_HT 12 +#ifdef USE_CAIRO +# define XP_UNUSED_CAIRO(var) UNUSED__ ## var __attribute__((unused)) +#else +# define XP_UNUSED_CAIRO(var) var +#endif + +static void +draw_rectangle( const GtkDrawCtx* dctx, + GdkDrawable* XP_UNUSED_CAIRO(drawable), + GdkGC* XP_UNUSED_CAIRO(gc), + gboolean fill, gint left, gint top, gint width, + gint height ) +{ +#ifdef USE_CAIRO + cairo_rectangle( dctx->cr, left, top, width, height ); + cairo_stroke_preserve( dctx->cr ); + cairo_set_source_rgb( dctx->cr, 1, 1, 1 ); + /* if ( fill ) { */ + cairo_fill( dctx->cr ); + /* } else { */ + cairo_stroke( dctx->cr ); + /* } */ + fill = fill; +#else + dctx = dctx; + gdk_draw_rectangle( drawable, gc, fill, left, top, width, height ); +#endif +} + static void gtkFillRect( GtkDrawCtx* dctx, const XP_Rect* rect, const GdkColor* color ) { +#ifdef USE_CAIRO + color = color; + //gdk_cairo_set_source_color( dctx->cr, color ); +#else gdk_gc_set_foreground( dctx->drawGC, color ); - gdk_draw_rectangle( DRAW_WHAT(dctx), dctx->drawGC, - TRUE, - rect->left, rect->top, rect->width, - rect->height ); +#endif + draw_rectangle( dctx, DRAW_WHAT(dctx), dctx->drawGC, TRUE, + rect->left, rect->top, rect->width, + rect->height ); +} + +static void +set_color_cairo( const GtkDrawCtx* dctx, unsigned short red, + unsigned short green, unsigned short blue ) +{ + GdkColor color = { red, green, blue }; + color = color; + dctx = dctx; + //gdk_cairo_set_source_color( dctx->cr, &color ); } static void gtkEraseRect( const GtkDrawCtx* dctx, const XP_Rect* rect ) { - gdk_draw_rectangle( DRAW_WHAT(dctx), - dctx->drawing_area->style->white_gc, - TRUE, rect->left, rect->top, - rect->width, rect->height ); + set_color_cairo( dctx, 0xFFFF, 0xFFFF, 0xFFFF ); + draw_rectangle( dctx, DRAW_WHAT(dctx), + dctx->drawing_area->style->white_gc, + TRUE, rect->left, rect->top, + rect->width, rect->height ); } /* gtkEraseRect */ static void frameRect( GtkDrawCtx* dctx, const XP_Rect* rect ) { - gdk_draw_rectangle( DRAW_WHAT(dctx), - dctx->drawGC, FALSE, rect->left, rect->top, - rect->width, rect->height ); + draw_rectangle( dctx, DRAW_WHAT(dctx), dctx->drawGC, + FALSE, rect->left, rect->top, + rect->width, rect->height ); } /* frameRect */ #ifdef DRAW_WITH_PRIMITIVES @@ -225,9 +267,14 @@ draw_string_at( GtkDrawCtx* dctx, PangoLayout* layout, } } +#ifdef USE_CAIRO + frground = frground; + bkgrnd = bkgrnd; +#else gdk_draw_layout_with_colors( DRAW_WHAT(dctx), dctx->drawGC, xx, yy, layout, frground, bkgrnd ); +#endif } /* draw_string_at */ static void @@ -248,8 +295,8 @@ drawBitmapFromLBS( GtkDrawCtx* dctx, const XP_Bitmap bm, const XP_Rect* rect ) pm = gdk_pixmap_new( DRAW_WHAT(dctx), nCols, nRows, -1 ); - gdk_draw_rectangle( pm, dctx->drawing_area->style->white_gc, TRUE, - 0, 0, nCols, nRows ); + draw_rectangle( dctx, pm, dctx->drawing_area->style->white_gc, TRUE, + 0, 0, nCols, nRows ); x = 0; y = 0; @@ -259,7 +306,10 @@ drawBitmapFromLBS( GtkDrawCtx* dctx, const XP_Bitmap bm, const XP_Rect* rect ) for ( i = 0; i < 8; ++i ) { XP_Bool draw = ((byte & 0x80) != 0); if ( draw ) { +#ifdef USE_CAIRO +#else gdk_draw_point( pm, dctx->drawing_area->style->black_gc, x, y ); +#endif } byte <<= 1; if ( ++x == nCols ) { @@ -273,6 +323,9 @@ drawBitmapFromLBS( GtkDrawCtx* dctx, const XP_Bitmap bm, const XP_Rect* rect ) XP_ASSERT( nBytes == -1 ); /* else we're out of sync */ +#ifdef USE_CAIRO + rect = rect; +#else gdk_draw_drawable( DRAW_WHAT(dctx), dctx->drawGC, (GdkDrawable*)pm, 0, 0, @@ -280,7 +333,7 @@ drawBitmapFromLBS( GtkDrawCtx* dctx, const XP_Bitmap bm, const XP_Rect* rect ) rect->top+2, lbs->nCols, lbs->nRows ); - +#endif g_object_unref( pm ); } /* drawBitmapFromLBS */ @@ -299,10 +352,10 @@ gtk_draw_destroyCtxt( DrawCtx* p_dctx ) GtkDrawCtx* dctx = (GtkDrawCtx*)p_dctx; GtkAllocation* alloc = &dctx->drawing_area->allocation; - gdk_draw_rectangle( DRAW_WHAT(dctx), - dctx->drawing_area->style->white_gc, - TRUE, - 0, 0, alloc->width, alloc->height ); + draw_rectangle( dctx, DRAW_WHAT(dctx), + dctx->drawing_area->style->white_gc, + TRUE, + 0, 0, alloc->width, alloc->height ); g_list_foreach( dctx->fontsPerSize, freer, NULL ); g_list_free( dctx->fontsPerSize ); @@ -328,7 +381,11 @@ gtk_draw_boardBegin( DrawCtx* p_dctx, const XP_Rect* rect, dctx->cellWidth = width; dctx->cellHeight = height; +#ifdef USE_CAIRO + //gdk_cairo_set_source_color( dctx->cr, &dctx->black ); +#else gdk_gc_set_foreground( dctx->drawGC, &dctx->black ); +#endif gdkrect = *(GdkRectangle*)rect; ++gdkrect.width; @@ -364,6 +421,9 @@ gtk_draw_vertScrollBoard( DrawCtx* p_dctx, XP_Rect* rect, ysrc = ydest + dist; } +#ifdef USE_CAIRO + dctx = dctx; +#else gdk_draw_drawable( DRAW_WHAT(dctx), dctx->drawGC, DRAW_WHAT(dctx), @@ -373,7 +433,7 @@ gtk_draw_vertScrollBoard( DrawCtx* p_dctx, XP_Rect* rect, ydest, rect->width, rect->height - dist ); - +#endif if ( !down ) { rect->top += rect->height - dist; } @@ -391,33 +451,37 @@ drawHintBorders( GtkDrawCtx* dctx, const XP_Rect* rect, HintAtts hintAtts) XP_Rect lrect = *rect; gtkInsetRect( &lrect, 1 ); +#ifdef USE_CAIRO + //gdk_cairo_set_source_color( dctx->cr, &dctx->black ); +#else gdk_gc_set_foreground( dctx->drawGC, &dctx->black ); +#endif if ( (hintAtts & HINT_BORDER_LEFT) != 0 ) { - gdk_draw_rectangle( DRAW_WHAT(dctx), - dctx->drawGC, - FALSE, lrect.left, lrect.top, - 0, lrect.height); + draw_rectangle( dctx, DRAW_WHAT(dctx), + dctx->drawGC, + FALSE, lrect.left, lrect.top, + 0, lrect.height); } if ( (hintAtts & HINT_BORDER_TOP) != 0 ) { - gdk_draw_rectangle( DRAW_WHAT(dctx), - dctx->drawGC, - FALSE, lrect.left, lrect.top, - lrect.width, 0/*rectInset.height*/); + draw_rectangle( dctx, DRAW_WHAT(dctx), + dctx->drawGC, + FALSE, lrect.left, lrect.top, + lrect.width, 0/*rectInset.height*/); } if ( (hintAtts & HINT_BORDER_RIGHT) != 0 ) { - gdk_draw_rectangle( DRAW_WHAT(dctx), - dctx->drawGC, - FALSE, lrect.left+lrect.width, - lrect.top, - 0, lrect.height); + draw_rectangle( dctx, DRAW_WHAT(dctx), + dctx->drawGC, + FALSE, lrect.left+lrect.width, + lrect.top, + 0, lrect.height); } if ( (hintAtts & HINT_BORDER_BOTTOM) != 0 ) { - gdk_draw_rectangle( DRAW_WHAT(dctx), - dctx->drawGC, - FALSE, lrect.left, - lrect.top+lrect.height, - lrect.width, 0 ); + draw_rectangle( dctx, DRAW_WHAT(dctx), + dctx->drawGC, + FALSE, lrect.left, + lrect.top+lrect.height, + lrect.width, 0 ); } } } @@ -462,12 +526,16 @@ gtk_draw_drawCell( DrawCtx* p_dctx, const XP_Rect* rect, const XP_UCHAR* letter, gtkInsetRect( &rectInset, 1 ); if ( showGrid ) { +#ifdef USE_CAIRO + //gdk_cairo_set_source_color( dctx->cr, &dctx->black ); +#else gdk_gc_set_foreground( dctx->drawGC, &dctx->black ); - gdk_draw_rectangle( DRAW_WHAT(dctx), - dctx->drawGC, - FALSE, - rect->left, rect->top, rect->width, - rect->height ); +#endif + draw_rectangle( dctx, DRAW_WHAT(dctx), + dctx->drawGC, + FALSE, + rect->left, rect->top, rect->width, + rect->height ); } /* We draw just an empty, potentially colored, square IFF there's nothing @@ -483,10 +551,14 @@ gtk_draw_drawCell( DrawCtx* p_dctx, const XP_Rect* rect, const XP_UCHAR* letter, foreground = NULL; } if ( !!foreground ) { +#ifdef USE_CAIRO + //gdk_cairo_set_source_color( dctx->cr, foreground ); +#else gdk_gc_set_foreground( dctx->drawGC, foreground ); - gdk_draw_rectangle( DRAW_WHAT(dctx), dctx->drawGC, TRUE, - rectInset.left, rectInset.top, - rectInset.width+1, rectInset.height+1 ); +#endif + draw_rectangle( dctx, DRAW_WHAT(dctx), dctx->drawGC, TRUE, + rectInset.left, rectInset.top, + rectInset.width+1, rectInset.height+1 ); } } if ( (flags & CELL_ISSTAR) != 0 ) { @@ -499,13 +571,21 @@ gtk_draw_drawCell( DrawCtx* p_dctx, const XP_Rect* rect, const XP_UCHAR* letter, XP_Bool isBlank = (flags & CELL_ISBLANK) != 0; GdkColor* foreground; if ( cursor ) { +#ifdef USE_CAIRO + //gdk_cairo_set_source_color( dctx->cr, cursor ); +#else gdk_gc_set_foreground( dctx->drawGC, cursor ); +#endif } else if ( !highlight ) { +#ifdef USE_CAIRO + //gdk_cairo_set_source_color( dctx->cr, &dctx->tileBack ); +#else gdk_gc_set_foreground( dctx->drawGC, &dctx->tileBack ); +#endif } - gdk_draw_rectangle( DRAW_WHAT(dctx), dctx->drawGC, TRUE, - rectInset.left, rectInset.top, - rectInset.width+1, rectInset.height+1 ); + draw_rectangle( dctx, DRAW_WHAT(dctx), dctx->drawGC, TRUE, + rectInset.left, rectInset.top, + rectInset.width+1, rectInset.height+1 ); if ( isBlank && 0 == strcmp("_",letter ) ) { letter = "?"; @@ -517,6 +597,8 @@ gtk_draw_drawCell( DrawCtx* p_dctx, const XP_Rect* rect, const XP_UCHAR* letter, XP_GTK_JUST_CENTER, foreground, cursor ); if ( isBlank ) { +#ifdef USE_CAIRO +#else gdk_draw_arc( DRAW_WHAT(dctx), dctx->drawGC, 0, /* filled */ rect->left, /* x */ @@ -524,6 +606,7 @@ gtk_draw_drawCell( DrawCtx* p_dctx, const XP_Rect* rect, const XP_UCHAR* letter, rect->width,/*width, */ rect->height,/*width, */ 0, 360*64 ); +#endif } } @@ -547,7 +630,7 @@ gtk_draw_invertCell( DrawCtx* XP_UNUSED(p_dctx), /* gdk_gc_set_function( dctx->drawGC, GDK_INVERT ); */ /* gdk_gc_set_clip_rectangle( dctx->drawGC, (GdkRectangle*)rect ); */ -/* gdk_draw_rectangle( DRAW_WHAT(dctx), dctx->drawGC, */ +/* draw_rectangle( DRAW_WHAT(dctx), dctx->drawGC, */ /* TRUE, rect->left, rect->top, */ /* rect->width, rect->height ); */ @@ -617,19 +700,23 @@ gtkDrawTileImpl( DrawCtx* p_dctx, const XP_Rect* rect, const XP_UCHAR* textP, } /* frame the tile */ +#ifdef USE_CAIRO + //gdk_cairo_set_source_color( dctx->cr, &dctx->black ); +#else gdk_gc_set_foreground( dctx->drawGC, &dctx->black ); - gdk_draw_rectangle( DRAW_WHAT(dctx), - dctx->drawGC, - FALSE, - insetR.left, insetR.top, insetR.width, - insetR.height ); +#endif + draw_rectangle( dctx, DRAW_WHAT(dctx), + dctx->drawGC, + FALSE, + insetR.left, insetR.top, insetR.width, + insetR.height ); if ( (flags & CELL_HIGHLIGHT) != 0 ) { gtkInsetRect( &insetR, 1 ); - gdk_draw_rectangle( DRAW_WHAT(dctx), - dctx->drawGC, - FALSE, insetR.left, insetR.top, - insetR.width, insetR.height); + draw_rectangle( dctx, DRAW_WHAT(dctx), + dctx->drawGC, + FALSE, insetR.left, insetR.top, + insetR.width, insetR.height); } } } /* gtkDrawTileImpl */ @@ -693,11 +780,15 @@ gtk_draw_drawTrayDivider( DrawCtx* p_dctx, const XP_Rect* rect, --r.height; } +#ifdef USE_CAIRO + //gdk_cairo_set_source_color( dctx->cr, &dctx->black ); +#else gdk_gc_set_foreground( dctx->drawGC, &dctx->black ); - gdk_draw_rectangle( DRAW_WHAT(dctx), - dctx->drawGC, - !selected, - r.left, r.top, r.width, r.height); +#endif + draw_rectangle( dctx, DRAW_WHAT(dctx), + dctx->drawGC, + !selected, + r.left, r.top, r.width, r.height); } /* gtk_draw_drawTrayDivider */ @@ -940,7 +1031,11 @@ gtk_draw_score_drawPlayer( DrawCtx* p_dctx, const XP_Rect* rInner, gtkFillRect( dctx, rOuter, cursor ); } +#ifdef USE_CAIRO + //gdk_cairo_set_source_color( dctx->cr, &dctx->playerColors[playerNum] ); +#else gdk_gc_set_foreground( dctx->drawGC, &dctx->playerColors[playerNum] ); +#endif if ( dsi->selected ) { XP_Rect selRect = *rOuter; @@ -960,9 +1055,9 @@ gtk_draw_score_drawPlayer( DrawCtx* p_dctx, const XP_Rect* rInner, } } - gdk_draw_rectangle( DRAW_WHAT(dctx), dctx->drawGC, - TRUE, selRect.left, selRect.top, - selRect.width, selRect.height ); + draw_rectangle( dctx, DRAW_WHAT(dctx), dctx->drawGC, + TRUE, selRect.left, selRect.top, + selRect.width, selRect.height ); if ( hasCursor ) { gtkFillRect( dctx, rInner, cursor ); } @@ -1099,8 +1194,11 @@ gtk_draw_drawMiniWindow( DrawCtx* p_dctx, const XP_UCHAR* text, GtkDrawCtx* dctx = (GtkDrawCtx*)p_dctx; XP_Rect localR = *rect; +#ifdef USE_CAIRO + //gdk_cairo_set_source_color( dctx->cr, &dctx->black ); +#else gdk_gc_set_foreground( dctx->drawGC, &dctx->black ); -/* gdk_gc_set_clip_rectangle( dctx->drawGC, (GdkRectangle*)&localR ); */ +#endif /* play some skanky games to get the shadow drawn under and to the right... */ @@ -1227,7 +1325,16 @@ gtkDrawCtxtMake( GtkWidget* drawing_area, GtkAppGlobals* globals ) } else { window = GTK_WIDGET(drawing_area)->window; } + window = GTK_WIDGET(drawing_area)->window; +#ifdef USE_CAIRO + dctx->cr = gdk_cairo_create( window ); + XP_LOGF( "dctx->cr=%p", dctx->cr ); + cairo_set_line_width( dctx->cr, 1.0 ); + cairo_set_line_cap( dctx->cr, CAIRO_LINE_CAP_SQUARE ); + cairo_set_source_rgb( dctx->cr, 0, 0, 0 ); +#else dctx->drawGC = gdk_gc_new( window ); +#endif } map = gdk_colormap_get_system(); diff --git a/xwords4/linux/gtkmain.h b/xwords4/linux/gtkmain.h index 949894247..cfb02563a 100644 --- a/xwords4/linux/gtkmain.h +++ b/xwords4/linux/gtkmain.h @@ -47,7 +47,11 @@ typedef struct GtkDrawCtx { GtkWidget* drawing_area; struct GtkAppGlobals* globals; +#ifdef USE_CAIRO + cairo_t* cr; +#else GdkGC* drawGC; +#endif GdkColor black; GdkColor white;