121
121
/* Pre-rendering image data prepared from file. */
122
122
static GamesPreimage *ball_preimage = NULL;
123
123
/* The tile images with balls rendered on them. */
124
static GdkPixmap *ball_pixmap = NULL;
124
static cairo_surface_t *ball_surface = NULL;
125
125
/* The balls rendered to a size appropriate for the preview. */
126
static GdkPixmap *preview_pixmaps[7] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL };
126
static cairo_surface_t *preview_surfaces[7] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL };
128
/* A pixmap of a blank tile. */
129
static GdkPixmap *blank_pixmap = NULL;
130
static GdkPixmap *blank_preview_pixmap = NULL;
128
/* A cairo_surface_t of a blank tile. */
129
static cairo_surface_t *blank_surface = NULL;
130
static cairo_surface_t *blank_preview_surface = NULL;
132
132
static GtkWidget *fast_moves_toggle_button = NULL;
298
298
g_free (warning_message);
299
299
warning_message = NULL;
301
cr = gdk_cairo_create (ball_pixmap);
301
cr = cairo_create (ball_surface);
302
302
gdk_cairo_set_source_color (cr, &backgnd.color);
304
304
cairo_rectangle (cr, 0, 0, boxsize * 4, boxsize * 7);
307
307
gdk_cairo_set_source_pixbuf (cr, ball_pixbuf, 0, 0);
308
308
cairo_mask (cr, cairo_get_source (cr));
310
cr_blank = gdk_cairo_create (blank_pixmap);
310
cr_blank = cairo_create (blank_surface);
311
311
gdk_cairo_set_source_color (cr_blank, &backgnd.color);
313
313
cairo_rectangle (cr_blank, 0, 0, boxsize, boxsize);
342
342
* This code assumes that each preview window is identical. */
344
344
for (i = 0; i < 7; i++)
345
if (preview_pixmaps[i])
346
g_object_unref (preview_pixmaps[i]);
345
if (preview_surfaces[i])
346
cairo_surface_destroy (preview_surfaces[i]);
348
348
if (ball_preimage)
349
349
scaled = games_preimage_render (ball_preimage, 4 * preview_width,
358
358
for (i = 0; i < 7; i++) {
359
preview_pixmaps[i] = gdk_pixmap_new (gtk_widget_get_window (widget),
360
preview_width, preview_height, -1);
361
cr = gdk_cairo_create (preview_pixmaps[i]);
359
preview_surfaces[i] = gdk_window_create_similar_surface (gtk_widget_get_window (widget),
360
CAIRO_CONTENT_COLOR_ALPHA,
361
preview_width, preview_height);
362
cr = cairo_create (preview_surfaces[i]);
362
363
gdk_cairo_set_source_color (cr, >k_widget_get_style (widget)->bg[GTK_STATE_NORMAL]);
363
364
gdk_cairo_rectangle (cr, &preview_rect);
369
370
cairo_destroy (cr);
372
if (blank_preview_pixmap)
373
g_object_unref (blank_preview_pixmap);
373
if (blank_preview_surface)
374
cairo_surface_destroy (blank_preview_surface);
375
blank_preview_pixmap = gdk_pixmap_new (gtk_widget_get_window (widget),
376
preview_width, preview_height, -1);
377
cr = gdk_cairo_create (blank_preview_pixmap);
376
blank_preview_surface = gdk_window_create_similar_surface (gtk_widget_get_window (widget),
377
CAIRO_CONTENT_COLOR_ALPHA,
378
preview_width, preview_height);
379
cr = cairo_create (blank_preview_surface);
378
380
gdk_cairo_set_source_color (cr, >k_widget_get_style (widget)->bg[GTK_STATE_NORMAL]);
379
381
gdk_cairo_rectangle (cr, &preview_rect);
473
475
draw_preview (void)
478
cairo_pattern_t *pattern;
477
480
for (i = 0; i < MAXNPIECES; i++) {
480
gdk_window_set_back_pixmap (gtk_widget_get_window (preview_widgets[i]),
481
preview_pixmaps[preview[i] - 1], FALSE);
483
pattern = cairo_pattern_create_for_surface (preview_surfaces[preview[i] - 1]);
483
gdk_window_set_back_pixmap (gtk_widget_get_window (preview_widgets[i]),
484
blank_preview_pixmap, FALSE);
485
pattern = cairo_pattern_create_for_surface (blank_preview_surface);
486
gdk_window_clear (gtk_widget_get_window (preview_widgets[i]));
487
gdk_window_set_background_pattern (gtk_widget_get_window (preview_widgets[i]),
489
cairo_pattern_destroy (pattern);
490
gtk_widget_queue_draw (preview_widgets[i]);
832
draw_grid (cairo_t *cr)
837
GtkAllocation allocation;
839
gtk_widget_get_allocation (draw_area, &allocation);
840
w = allocation.width;
841
h = allocation.height;
843
cr = gdk_cairo_create (gtk_widget_get_window (draw_area));
838
w = gtk_widget_get_allocated_width(draw_area);
839
h = gtk_widget_get_allocated_height(draw_area);
844
841
gdk_color_parse ("#525F6C", &color);
845
842
gdk_cairo_set_source_color (cr, &color);
846
843
cairo_set_line_width (cr, 1.0);
860
857
cairo_rectangle (cr, 0.5, 0.5, w - 0.5, h - 0.5);
861
858
cairo_stroke (cr);
866
/* Redraw a part of the field */
868
field_expose_event (GtkWidget * widget, GdkEventExpose * event, gpointer gp)
862
field_draw_callback (GtkWidget * widget, cairo_t *cr)
870
GdkWindow *window = gtk_widget_get_window (widget);
872
guint x_start, x_end, y_start, y_end, i, j, idx;
874
x_start = event->area.x / boxsize;
875
x_end = (event->area.x + event->area.width - 1) / boxsize + 1;
877
y_start = event->area.y / boxsize;
878
y_end = (event->area.y + event->area.height - 1) / boxsize + 1;
880
cr = gdk_cairo_create (window);
882
for (i = y_start; i < y_end; i++) {
883
for (j = x_start; j < x_end; j++) {
865
GdkColor cursorColor;
867
for (i = 0; i < vfieldsize; i++) {
868
for (j = 0; j < hfieldsize; j++) {
884
869
int phase, color;
886
871
idx = j + i * hfieldsize;
894
879
phase = ABS (ABS (3 - phase) - 3);
896
gdk_cairo_set_source_pixmap (cr, ball_pixmap,
897
(1.0 * j - phase) * boxsize,
898
(1.0 * i - color) * boxsize);
881
cairo_set_source_surface (cr, ball_surface,
882
(1.0 * j - phase) * boxsize,
883
(1.0 * i - color) * boxsize);
900
gdk_cairo_set_source_pixmap (cr, blank_pixmap, 0, 0);
885
cairo_set_source_surface (cr, blank_surface, 1.0 * j * boxsize, 1.0 * i * boxsize);
907
if (show_cursor && cursor_x >= x_start && cursor_x <= x_end
908
&& cursor_y >= y_start && cursor_y <= y_end) {
911
if (((backgnd.color.red + backgnd.color.green + backgnd.color.blue) / 3) >
913
gdk_color_parse ("#000000", &color);
915
gdk_color_parse ("#FFFFFF", &color);
917
gdk_cairo_set_source_color (cr, &color);
918
cairo_set_line_width (cr, 1.0);
920
cursor_x * boxsize + 1.5, cursor_y * boxsize + 1.5,
921
boxsize - 2.5, boxsize - 2.5);
893
if (((backgnd.color.red + backgnd.color.green + backgnd.color.blue) / 3) >
895
gdk_color_parse ("#000000", &cursorColor);
897
gdk_color_parse ("#FFFFFF", &cursorColor);
899
gdk_cairo_set_source_color (cr, &cursorColor);
900
cairo_set_line_width (cr, 1.0);
902
cursor_x * boxsize + 1.5, cursor_y * boxsize + 1.5,
903
boxsize - 2.5, boxsize - 2.5);
1226
1205
gchar *license = games_get_license (_("Five or More"));
1228
1207
gtk_show_about_dialog (GTK_WINDOW (app),
1229
#if GTK_CHECK_VERSION (2, 11, 0)
1230
1208
"program-name", _("Five or More"),
1232
"name", _("Five or More"),
1234
1209
"version", VERSION,
1235
1210
"comments", _("GNOME port of the once-popular Color Lines game.\n\nFive or More is a part of GNOME Games."),
1263
1235
if (!gdk_color_parse (backgnd.name, &backgnd.color)) {
1264
1236
gdk_color_parse ("#000000", &backgnd.color);
1267
colormap = gtk_widget_get_colormap (draw_area);
1268
gdk_colormap_alloc_color (colormap, &backgnd.color, FALSE, TRUE);
1269
widget_style = gtk_widget_get_style (draw_area);
1270
temp_style = gtk_style_copy (widget_style);
1271
temp_style->bg[0] = backgnd.color;
1272
temp_style->bg[1] = backgnd.color;
1273
temp_style->bg[2] = backgnd.color;
1274
temp_style->bg[3] = backgnd.color;
1275
temp_style->bg[4] = backgnd.color;
1276
gtk_widget_set_style (draw_area, temp_style);
1438
1399
GTK_DIALOG_DESTROY_WITH_PARENT,
1439
1400
GTK_STOCK_CLOSE,
1440
1401
GTK_RESPONSE_CLOSE, NULL);
1441
gtk_dialog_set_has_separator (GTK_DIALOG (pref_dialog), FALSE);
1442
1402
g_signal_connect (pref_dialog, "response",
1443
1403
G_CALLBACK (pref_dialog_response), NULL);
1444
1404
g_signal_connect (pref_dialog, "delete-event",
1562
1522
configure_event_callback (GtkWidget * widget, GdkEventConfigure * event)
1565
g_object_unref (ball_pixmap);
1525
cairo_surface_destroy(ball_surface);
1568
g_object_unref (blank_pixmap);
1528
cairo_surface_destroy (blank_surface);
1570
1530
boxsize = (event->width - 1) / hfieldsize;
1571
ball_pixmap = gdk_pixmap_new (gtk_widget_get_window (draw_area), boxsize * 4,
1573
blank_pixmap = gdk_pixmap_new (gtk_widget_get_window (draw_area), boxsize,
1531
ball_surface = gdk_window_create_similar_surface (gtk_widget_get_window (draw_area),
1532
CAIRO_CONTENT_COLOR_ALPHA,
1533
boxsize * 4, boxsize * 7);
1534
blank_surface = gdk_window_create_similar_surface (gtk_widget_get_window (draw_area),
1535
CAIRO_CONTENT_COLOR_ALPHA,
1575
1537
refresh_pixmaps ();
1577
1539
refresh_screen ();
1626
#endif /* WITH_SMCLIENT */
1629
load_properties (void)
1633
ball_filename = games_conf_get_string_with_default (KEY_PREFERENCES_GROUP, KEY_BALL_THEME, DEFAULT_BALL_THEME);
1635
move_timeout = games_conf_get_integer (KEY_PREFERENCES_GROUP, KEY_MOVE_TIMEOUT, NULL);
1636
if (move_timeout <= 0)
1639
buf = games_conf_get_string_with_default (KEY_PREFERENCES_GROUP, KEY_BACKGROUND_COLOR, "#000000"); /* FIXMEchpe? */
1640
set_backgnd_color (buf);
1619
#endif /* WITH_SMCLIENT */
1622
load_properties (void)
1626
ball_filename = games_conf_get_string_with_default (KEY_PREFERENCES_GROUP, KEY_BALL_THEME, DEFAULT_BALL_THEME);
1628
move_timeout = games_conf_get_integer (KEY_PREFERENCES_GROUP, KEY_MOVE_TIMEOUT, NULL);
1629
if (move_timeout <= 0)
1632
buf = games_conf_get_string_with_default (KEY_PREFERENCES_GROUP, KEY_BACKGROUND_COLOR, "#000000"); /* FIXMEchpe? */
1633
set_backgnd_color (buf);
1677
1639
static const GtkActionEntry actions[] = {
1678
1640
{"GameMenu", NULL, N_("_Game")},
1679
1641
{"SettingsMenu", NULL, N_("_Settings")},
1773
1735
rgen = g_rand_new ();
1775
1737
context = g_option_context_new (NULL);
1776
#if GLIB_CHECK_VERSION (2, 12, 0)
1777
1738
g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);
1780
1739
g_option_context_add_group (context, gtk_get_option_group (TRUE));
1781
1740
#ifdef WITH_SMCLIENT
1782
1741
g_option_context_add_group (context, egg_sm_client_get_option_group ());
1833
1792
ui_manager = gtk_ui_manager_new ();
1835
1794
games_stock_prepare_for_statusbar_tooltips (ui_manager, statusbar);
1836
gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (statusbar), FALSE);
1795
gtk_window_set_has_resize_grip (GTK_WINDOW (app), TRUE);
1838
1797
vbox = gtk_vbox_new (FALSE, 0);
1839
1798
gtk_container_add (GTK_CONTAINER (app), vbox);
1892
1851
G_CALLBACK (key_press_event), NULL);
1893
1852
g_signal_connect (draw_area, "configure-event",
1894
1853
G_CALLBACK (configure_event_callback), NULL);
1895
g_signal_connect (draw_area, "expose-event",
1896
G_CALLBACK (field_expose_event), NULL);
1854
g_signal_connect (draw_area, "draw",
1855
G_CALLBACK (field_draw_callback), NULL);
1897
1856
gridframe = games_grid_frame_new (hfieldsize, vfieldsize);
1898
1857
games_grid_frame_set_padding (GAMES_GRID_FRAME (gridframe), 1, 1);
1899
1858
gtk_container_add (GTK_CONTAINER (gridframe), draw_area);