32#define BORDER_THIKNESS 4
33#define HANDLE_THIKNESS 4
34#define HANDLE_SHRINK 3
37#define GEANY_TYPE_PONG (geany_pong_get_type())
38#define GEANY_PONG(o) (G_TYPE_CHECK_INSTANCE_CAST((o), GEANY_TYPE_PONG, GeanyPong))
39#define GEANY_IS_PONG(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), GEANY_TYPE_PONG))
78G_DEFINE_TYPE(
GeanyPong, geany_pong, GTK_TYPE_DIALOG)
81static void geany_pong_set_cairo_source_color(cairo_t *cr, GdkRGBA *c, gdouble a)
83 cairo_set_source_rgba(cr, c->red, c->green, c->blue, MIN(c->alpha, a));
91 GtkStyleContext *ctx = gtk_widget_get_style_context(GTK_WIDGET(self));
92 GtkStateFlags state = gtk_style_context_get_state(ctx);
95 gtk_style_context_get_color(ctx, state, &fg);
96 gtk_style_context_get_background_color(ctx, state, &bg);
98 self->
area_width = gtk_widget_get_allocated_width(area);
99 self->
area_height = gtk_widget_get_allocated_height(area);
106 geany_pong_set_cairo_source_color(cr, &fg, 1.0);
124 PangoFontDescription *font =
NULL;
126 geany_pong_set_cairo_source_color(cr, &bg, 0.8);
130 geany_pong_set_cairo_source_color(cr, &fg, 1.0);
131 layout = pango_cairo_create_layout(cr);
133 gtk_style_context_get(ctx, state, GTK_STYLE_PROPERTY_FONT, &font,
NULL);
136 pango_layout_set_font_description(layout, font);
137 pango_font_description_free(font);
141 pango_layout_set_markup(layout,
"<b>You won!</b>\n<small>OK, go back to work now.</small>", -1);
143 pango_layout_set_text(layout,
"Click to Play", -1);
144 pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER);
145 pango_layout_get_pixel_size(layout, &pw, &ph);
149 cairo_scale(cr, scale, scale);
150 pango_cairo_show_layout(cr, layout);
152 g_object_unref(layout);
164 self->
ball_vec[0] = g_random_double_range(.2, .8);
166 if (g_random_boolean())
175 g_snprintf(buf,
sizeof buf,
"%u", self->
score);
176 gtk_label_set_text(GTK_LABEL(self->
score_label), buf);
192 if (self->
ball_pos[0] + step[0] >= w ||
196 if (self->
ball_pos[1] + step[1] <= y)
199 if (self->
ball_pos[1] + step[1] >= h)
236 gtk_widget_queue_draw(self->
area);
248 gtk_widget_queue_draw_area(self->
area, bb[0], bb[1], bb[2] - bb[0], bb[3] - bb[1]);
250 gtk_widget_queue_draw_area(self->
area,
261 if (event->type == GDK_BUTTON_PRESS &&
271 gtk_widget_queue_draw(area);
294 GObjectClass *object_class = G_OBJECT_CLASS(klass);
295 GtkDialogClass *dialog_class = GTK_DIALOG_CLASS(klass);
316 gtk_window_set_title(GTK_WINDOW(self),
"Happy Easter!");
317 gtk_window_set_position(GTK_WINDOW(self), GTK_WIN_POS_CENTER_ON_PARENT);
318 gtk_window_set_destroy_with_parent(GTK_WINDOW(self), TRUE);
319 gtk_window_set_modal(GTK_WINDOW(self), TRUE);
320 gtk_window_set_skip_pager_hint(GTK_WINDOW(self), TRUE);
321 gtk_window_set_resizable(GTK_WINDOW(self), FALSE);
323 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
324 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
325 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(self))), vbox, TRUE, TRUE, 0);
327 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
328 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
330 label = gtk_label_new(
"Score:");
331 gtk_misc_set_alignment(GTK_MISC(
label), 1.0, 0.5);
332 gtk_box_pack_start(GTK_BOX(hbox),
label, TRUE, TRUE, 0);
335 gtk_box_pack_start(GTK_BOX(hbox), self->
score_label, FALSE, FALSE, 0);
337 self->
area = gtk_drawing_area_new();
338 gtk_widget_add_events(self->
area, GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK);
343 gtk_box_pack_start(GTK_BOX(vbox), self->
area, TRUE, TRUE, 0);
345 gtk_dialog_add_buttons(GTK_DIALOG(self),
346 GTK_STOCK_HELP, GTK_RESPONSE_HELP,
347 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
349 gtk_dialog_set_default_response(GTK_DIALOG(self), GTK_RESPONSE_HELP);
350 gtk_widget_grab_focus(gtk_dialog_get_widget_for_response(GTK_DIALOG(self), GTK_RESPONSE_HELP));
363 G_OBJECT_CLASS(geany_pong_parent_class)->finalize(obj);
371 GtkWidget *scrolledwindow;
373 GtkTextBuffer *buffer;
375 dialog = gtk_dialog_new_with_buttons(
"Help", GTK_WINDOW(self),
376 GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
377 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
NULL);
378 gtk_dialog_set_default_response(GTK_DIALOG(
dialog), GTK_RESPONSE_CLOSE);
379 gtk_container_set_border_width(GTK_CONTAINER(
dialog), 1);
380 gtk_window_set_type_hint(GTK_WINDOW(
dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
382 vbox = gtk_dialog_get_content_area(GTK_DIALOG(
dialog));
384 scrolledwindow = gtk_scrolled_window_new(
NULL,
NULL);
385 gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0);
386 gtk_container_set_border_width(GTK_CONTAINER(scrolledwindow), 5);
387 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_NEVER);
388 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_IN);
390 textview = gtk_text_view_new();
392 gtk_widget_set_size_request(textview, 450, -1);
393 gtk_text_view_set_editable(GTK_TEXT_VIEW(textview), FALSE);
394 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_WORD);
395 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(textview), FALSE);
396 gtk_text_view_set_left_margin(GTK_TEXT_VIEW(textview), 2);
397 gtk_text_view_set_right_margin(GTK_TEXT_VIEW(textview), 2);
399 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
400 gtk_text_buffer_set_text(buffer,
401 "A small Pong-like\n"
403 "Click to start, and then bounce the ball off the walls without it "
404 "falling down the bottom edge. You control the bottom handle with "
405 "the mouse, but beware! the ball goes faster and faster and the "
406 "handle grows smaller and smaller!", -1);
409 gtk_dialog_run(GTK_DIALOG(
dialog));
410 gtk_widget_destroy(
dialog);
420 case GTK_RESPONSE_HELP:
425 gtk_widget_destroy(GTK_WIDGET(self));
438 static gchar
text[] =
"geany";
440 if (event->keyval < 0x80)
443 text[G_N_ELEMENTS(
text) - 2] = (gchar) event->keyval;
448 gtk_widget_show(pong);
static void geany_pong_reset_ball(GeanyPong *self)
static void geany_pong_init(GeanyPong *self)
static void geany_pong_help(GeanyPong *self)
static gboolean geany_pong_area_button_press(GtkWidget *area, GdkEventButton *event, GeanyPong *self)
static GType geany_pong_get_type(void)
static gboolean geany_pong_area_motion_notify(GtkWidget *area, GdkEventMotion *event, GeanyPong *self)
static void geany_pong_class_init(GeanyPongClass *klass)
static GtkWidget * geany_pong_new(GtkWindow *parent)
static void geany_pong_finalize(GObject *obj)
static gboolean gb_on_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
static void geany_pong_update_score(GeanyPong *self)
static void geany_pong_response(GtkDialog *self, gint response)
static gboolean geany_pong_area_timeout(gpointer data)
static gboolean geany_pong_area_draw(GtkWidget *area, cairo_t *cr, GeanyPong *self)
if(!stash_group_load_from_file(group, filename)) g_warning(_("Could not load keyfile %s!")
gtk_container_add(GTK_CONTAINER(dialog->vbox), check_button)
gtk_widget_show_all(dialog)
GtkDialogClass parent_class
gboolean utils_str_equal(const gchar *a, const gchar *b)
NULL-safe string comparison.
General utility functions, non-GTK related.