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;