/* * return TRUE if the sound is found and the audio is activated * FALSE if the sound was not played */ static gboolean _repeat () { gboolean retval = FALSE; gchar *str1 = NULL; gchar *right_letter_ogg = NULL; GcomprisProperties *properties = gc_prop_get(); if( !properties->fx ) return FALSE; str1 = gc_sound_alphabet(right_letter); right_letter_ogg = g_strdup_printf("voices/$LOCALE/alphabet/%s", str1); g_free(str1); if(right_letter_ogg) { /* Let's check the file exist to be abble to return FALSE */ gchar *absolute_file = gc_file_find_absolute(right_letter_ogg, NULL); if (absolute_file) { gc_sound_play_ogg_cb(right_letter_ogg, sound_played); g_free(absolute_file); retval = TRUE; } } g_free(right_letter_ogg); return retval; }
static void zoom_clicked_cb(GtkToolButton *button, gpointer user_data) { beep(); GcomprisProperties *properties = gc_prop_get(); properties->zoom = (properties->zoom ? 0 : 1); gc_update_canvas_zoom(); }
static void stop_clicked_cb(GtkToolButton *button, gpointer user_data) { // save zoom setting GcomprisProperties *properties = gc_prop_get(); gc_prop_save(properties); gc_exit(); }
/* config par defaut */ void tansetdefconfig (void){ int i; guint backgroung_color_red = 0xe8<<8; guint backgroung_color_green = 0xe7<<8; guint backgroung_color_blue = 0xe2<<8; for (i = PXSTART; i<PXNBR+PXSTART; i++){ tabpxpixmode[i] = FALSE; tanallocname(&tabpxnam[i], "NoConfigFile"); } colortab[GCPETITEFG].red = colortab[GCPETITEFG].green = colortab[GCPETITEFG].blue = 0; colortab[GCPETITEBG].red = backgroung_color_red; colortab[GCPETITEBG].green = backgroung_color_green; colortab[GCPETITEBG].blue = backgroung_color_blue; colortab[GCPIECENOR].red = colortab[GCPIECENOR].green = 32768; colortab[GCPIECENOR].blue = 50000; colortab[GCPIECEHI].red = colortab[GCPIECEHI].green = 40000; colortab[GCPIECEHI].blue = 65535; colortab[GCPIECEBG].red = backgroung_color_red; colortab[GCPIECEBG].green = backgroung_color_green; colortab[GCPIECEBG].blue = backgroung_color_blue; colortab[GCPIECEHLP].blue = colortab[GCPIECEHLP].green = 0; colortab[GCPIECEHLP].red = 65535; colortab[GCPETITECHK].blue = colortab[GCPETITECHK].red = 40000; colortab[GCPETITECHK].green = 60000; colortab[GCPETITEHLP].red = (colortab[GCPETITEFG].red+colortab[GCPETITEBG].red)/2; colortab[GCPETITEHLP].green = (colortab[GCPETITEFG].green+colortab[GCPETITEBG].green)/2; colortab[GCPETITEHLP].blue = (colortab[GCPETITEFG].blue+colortab[GCPETITEBG].blue)/2; /* Gcompris */ GcomprisProperties *properties = gc_prop_get(); gchar *deffigfile = g_strconcat(properties->package_data_dir, "/tangram/default.figures", NULL); tanallocname(&figfilename, deffigfile); g_free(deffigfile); accuracy = 1; rotstepnbr = TOUR/32; figgrande.zoom = 0.125; return; }
static gint window_focus_callback (GtkWidget *widget, GdkEventFocus *event, gpointer user_data) { GcomprisProperties *properties = gc_prop_get (); if (event->in) gtk_im_context_focus_in (properties->context); else gtk_im_context_focus_out (properties->context); return FALSE; }
static guint sounds_are_fine() { char *letter_str; char *str2; GcomprisProperties *properties = gc_prop_get(); gchar *text_mode_str = _("This activity will be played with questions displayed as text" " instead of being spoken"); if(!properties->fx) { gchar *msg = g_strconcat( _("Error: this activity cannot be played with the\n" "sound effects disabled.\nGo to the configuration" " dialog to\nenable the sound"), "\n", text_mode_str, NULL); gc_dialog(msg, click_on_letter_next_level); g_free(msg); return(OK_NO_INIT); } alphabet = get_alphabet(); gchar *letter = g_new0(gchar, 8); g_unichar_to_utf8(g_utf8_get_char(alphabet), letter); letter_str = gc_sound_alphabet(letter); g_free(letter); str2 = gc_file_find_absolute("voices/$LOCALE/alphabet/%s", letter_str); g_free(letter_str); if (!str2) { gchar *msg2 = g_strdup_printf( _("Error: this activity requires that you first install\nthe packages with GCompris voices for the %s locale."), gc_locale_get_name( gc_locale_get() ) ); gchar *msg = g_strconcat(msg2, "\n", text_mode_str, NULL); g_free(msg2); gc_dialog(msg, click_on_letter_next_level); g_free(msg); return (OK_NO_INIT); } return(OK); }
void gc_im_init(GtkWidget *window) { GcomprisProperties *properties = gc_prop_get (); /* set IMContext */ properties->context = gtk_im_multicontext_new (); if(gc_profile_get_current()) { GHashTable *init_im = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); init_im = gc_db_conf_with_table_get (gc_profile_get_current()->profile_id, -1, init_im ); properties->default_context = g_hash_table_lookup ( init_im, "default_im"); if (properties->default_context) g_setenv ("GTK_IM_MODULE", properties->default_context, TRUE); } gtk_im_context_set_client_window (properties->context, window->window); g_signal_connect (G_OBJECT (properties->context), "commit", G_CALLBACK(im_context_commit_callback), NULL); g_signal_connect (G_OBJECT (properties->context), "preedit-changed", G_CALLBACK(im_context_preedit_callback), NULL); g_signal_connect (GTK_WIDGET (window), "focus-in-event", G_CALLBACK(window_focus_callback), NULL); g_signal_connect (GTK_WIDGET (window), "focus-out-event", G_CALLBACK(window_focus_callback), NULL); }
static int display_file_selector(int the_mode, GcomprisBoard *gcomprisBoard, gchar *rootdir, gchar *file_exts, FileSelectorCallBack iscb, void *user_context) { gchar *full_rootdir; mode = the_mode; /* Get the coordinate x y of the control area from the skin */ control_area_x1 = gc_skin_get_number_default("gcompris/fileselectx", 85); control_area_y1 = gc_skin_get_number_default("gcompris/fileselecty", 80); directory_label_y = gc_skin_get_number_default("gcompris/fileselectdiry", 180); if(rootitem) return 0; gc_bar_hide(TRUE); gc_board_pause(TRUE); fileSelectorCallBack=iscb; rootitem = goo_canvas_group_new (goo_canvas_get_root_item(gc_get_canvas()), NULL); goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", "#FILE_SELECTOR", "pointer-events", GOO_CANVAS_EVENTS_NONE, NULL); /* Entry area */ widget_entry = gtk_entry_new (); if(mode==MODE_SAVE) gtk_entry_set_max_length(GTK_ENTRY(widget_entry), 30); goo_canvas_widget_new (rootitem, GTK_WIDGET(widget_entry), control_area_x1, control_area_y1, 230.0, 30.0, NULL); gtk_signal_connect(GTK_OBJECT(widget_entry), "activate", GTK_SIGNAL_FUNC(entry_enter_callback), widget_entry); gtk_widget_show(widget_entry); /* * Create the combo with the file types * ------------------------------------ */ if(mode==MODE_SAVE && file_exts && *file_exts != '\0') { gchar **all_type = g_strsplit(file_exts, " ", 0); guint i = 0; gtk_combo_filetypes = gtk_combo_box_new_text(); /* Extract first string */ while (all_type[i]) gtk_combo_box_append_text(GTK_COMBO_BOX(gtk_combo_filetypes), g_strdup(all_type[i++]) ); g_strfreev(all_type); goo_canvas_widget_new (rootitem, gtk_combo_filetypes, control_area_x1 + 400, control_area_y1, 250.0, 35.0, NULL); gtk_widget_show(gtk_combo_filetypes); gtk_combo_box_set_active(GTK_COMBO_BOX(gtk_combo_filetypes), 0); } /* * Buttons * ------- */ // CANCEL gc_util_button_text_svg(rootitem, BOARDWIDTH * 1/3, BOARDHEIGHT - 32, "#BUTTON_TEXT", _("CANCEL"), (GtkSignalFunc) item_event_file_selector, "/cancel/"); // OK gc_util_button_text_svg(rootitem, BOARDWIDTH * 2/3, BOARDHEIGHT - 32, "#BUTTON_TEXT", (mode==MODE_LOAD ? _("LOAD") : _("SAVE")), (GtkSignalFunc) item_event_file_selector, "/ok/"); file_selector_displayed = TRUE; full_rootdir = g_strconcat(gc_prop_get()->user_dir, "/", rootdir, NULL); gc_util_create_rootdir(full_rootdir); current_rootdir = full_rootdir; current_user_context = user_context; display_files(rootitem, full_rootdir); return 0; }
/* Callback for the bar operations */ static gint item_event_ok(GooCanvasItem *item, GooCanvasItem *target, GdkEventButton *event, gchar *data) { GcomprisProperties *properties = gc_prop_get(); if(data==NULL) return FALSE; if(!strcmp((char *)data, "ok")) { /* Set the new locale in the properties */ if (properties->locale != current_locale) { g_free(properties->locale); properties->locale = strdup(current_locale); } if(current_locale[0] == '\0') { /* Set the locale to the default user's locale */ gc_locale_set(gc_locale_get_user_default()); } else { gc_locale_set(current_locale); } // Font Face g_free(properties->fontface); properties->fontface = g_strdup((char *)g_list_nth_data(fontlist, font_index)); gc_skin_update_font(); if(properties->music || properties->fx) gc_sound_init(); if(!properties->music && !properties->fx) gc_sound_close(); else { if(!properties->music) gc_sound_bg_close(); if(!properties->fx) gc_sound_fx_close(); } gc_prop_save(properties); gc_config_stop(); } else if(!strcmp((char *)data, "rememberlevel")) { properties->rememberlevel = (properties->rememberlevel ? 0 : 1); g_object_set(item, "svg-id", (properties->rememberlevel ? pixmap_checked : pixmap_unchecked), NULL); gc_item_focus_init(item, NULL); } else if(!strcmp((char *)data, "fullscreen")) { properties->fullscreen = (properties->fullscreen ? 0 : 1); gc_fullscreen_set(properties->fullscreen); g_object_set (item, "svg-id", (properties->fullscreen ? pixmap_checked : pixmap_unchecked), NULL); gc_item_focus_init(item, NULL); } else if(!strcmp((char *)data, "music")) { properties->music = (properties->music ? 0 : 1); g_object_set (item, "svg-id", (properties->music ? pixmap_checked : pixmap_unchecked), NULL); if(!properties->music) { gc_sound_bg_close(); } else { gc_sound_init(); gc_sound_bg_reopen(); } gc_item_focus_init(item, NULL); } else if(!strcmp((char *)data, "effect")) { properties->fx = (properties->fx ? 0 : 1); if (properties->fx) gc_sound_init(); g_object_set (item, "svg-id", (properties->fx ? pixmap_checked : pixmap_unchecked), NULL); gc_item_focus_init(item, NULL); } else if(!strcmp((char *)data, "zoom")) { properties->zoom = (properties->zoom ? 0 : 1); gc_update_canvas_zoom(); g_object_set (item, "svg-id", (properties->zoom ? pixmap_checked : pixmap_unchecked), NULL); gc_item_focus_init(item, NULL); } else if(!strcmp((char *)data, "locale_previous")) { current_locale = get_previous_locale(current_locale); g_object_set (item_locale_text, "text", gc_locale_get_name(current_locale), NULL); set_locale_flag(current_locale); } else if(!strcmp((char *)data, "locale_next")) { current_locale = get_next_locale(current_locale); g_object_set (G_OBJECT(item_locale_text), "text", gc_locale_get_name(current_locale), NULL); set_locale_flag(current_locale); } else if(!strcmp((char *)data, "locale_reset")) { current_locale = linguas[0]; g_object_set (G_OBJECT(item_locale_text), "text", gc_locale_get_name(current_locale), NULL); set_locale_flag(current_locale); } else if(!strcmp((char *)data, "timer_previous")) { if(properties->timer>0) properties->timer--; g_object_set (G_OBJECT(item_timer_text), "text", gettext(timername[properties->timer]), NULL); } else if(!strcmp((char *)data, "timer_next")) { if(properties->timer<MAX_TIMER_VALUE) properties->timer++; g_object_set (G_OBJECT(item_timer_text), "text", gettext(timername[properties->timer]), NULL); } else if(!strcmp((char *)data, "font_previous")) { if(font_index-- < 1) font_index = g_list_length(fontlist)-1; _update_font(); } else if(!strcmp((char *)data, "font_next")) { if(font_index++ >= g_list_length(fontlist)-1) font_index = 0; _update_font(); } else if(!strcmp((char *)data, "fontface_reset")) { font_index = current_font_index; _update_font(); } return TRUE; }
/* * Do all the bar display and register the events */ void gc_config_start () { GcomprisProperties *properties = gc_prop_get(); gint y_start = 0; gint x_start = 0; gint x_text_start = 0; gint y = 0; GooCanvasItem *item; /* Pause the board */ gc_board_pause(TRUE); if(rootitem) { gc_config_stop(); return; } gc_bar_hide(TRUE); rootitem = goo_canvas_group_new (goo_canvas_get_root_item(gc_get_canvas()), NULL); item = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", "#DIALOG", "pointer-events", GOO_CANVAS_EVENTS_NONE, NULL); GooCanvasBounds bounds; goo_canvas_item_get_bounds(item, &bounds); x_start = bounds.x1; y_start = bounds.y1; y = bounds.y2 - 26; goo_canvas_text_new (rootitem, _("GCompris Configuration"), (gdouble) BOARDWIDTH/2, (gdouble) y_start + 40, -1, GTK_ANCHOR_CENTER, "font", gc_skin_font_title, "fill-color-rgba", gc_skin_color_title, NULL); pixmap_checked = "#CHECKED"; pixmap_unchecked = "#UNCHECKED"; pixmap_width = 30; x_start += 60; x_text_start = x_start + 80; //-------------------------------------------------- // Locale y_start += 105; display_previous_next(x_start, y_start, "locale_previous", "locale_next"); y_flag_start = y_start - pixmap_width/2; /* A repeat icon to reset the selection */ item = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", "#REPEAT", NULL); goo_canvas_item_get_bounds(item, &bounds); double zoom = 0.50; goo_canvas_item_scale(item, zoom, zoom); goo_canvas_item_translate(item, (-1 * bounds.x1 + x_start - 100) * zoom, (-1 * bounds.y1 + y_start - 145) * zoom); g_signal_connect(item, "button_press_event", (GCallback) item_event_ok, "locale_reset"); gc_item_focus_init(item, NULL); /* * The current locale is the one found in the config file */ current_locale = properties->locale; set_locale_flag(current_locale); item_locale_text = goo_canvas_text_new (rootitem, gc_locale_get_name(current_locale), (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_content, "fill-color-rgba", gc_skin_color_content, NULL); // Fullscreen / Window y_start += Y_GAP; item = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", (properties->fullscreen ? pixmap_checked : pixmap_unchecked), NULL); SET_ITEM_LOCATION(item, x_start, y_start - pixmap_width/2); g_signal_connect(item, "button_press_event", (GCallback) item_event_ok, "fullscreen"); gc_item_focus_init(item, NULL); goo_canvas_text_new (rootitem, _("Fullscreen"), (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_content, "fill-color-rgba", gc_skin_color_content, NULL); // Rememberlevel y_start += Y_GAP; item = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", (properties->rememberlevel ? pixmap_checked : pixmap_unchecked), NULL); SET_ITEM_LOCATION(item, x_start, y_start - pixmap_width/2); g_signal_connect(item, "button_press_event", (GCallback) item_event_ok, "rememberlevel"); gc_item_focus_init(item, NULL); goo_canvas_text_new (rootitem, _("Remember level for default user"), (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_content, "fill-color-rgba", gc_skin_color_content, NULL); // Music y_start += Y_GAP; item = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", (properties->music ? pixmap_checked : pixmap_unchecked), NULL); SET_ITEM_LOCATION(item, x_start, y_start - pixmap_width/2); g_signal_connect(item, "button_press_event", (GCallback) item_event_ok, "music"); gc_item_focus_init(item, NULL); goo_canvas_text_new (rootitem, _("Music"), (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_content, "fill-color-rgba", gc_skin_color_content, NULL); // Effect y_start += Y_GAP; item = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", (properties->fx ? pixmap_checked : pixmap_unchecked), NULL); SET_ITEM_LOCATION(item, x_start, y_start - pixmap_width/2); g_signal_connect(item, "button_press_event", (GCallback) item_event_ok, "effect"); gc_item_focus_init(item, NULL); goo_canvas_text_new (rootitem, _("Effect"), (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_content, "fill-color-rgba", gc_skin_color_content, NULL); // Zoom y_start += Y_GAP; item = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", (properties->zoom ? pixmap_checked : pixmap_unchecked), NULL); SET_ITEM_LOCATION(item, x_start, y_start - pixmap_width/2); g_signal_connect(item, "button_press_event", (GCallback) item_event_ok, "zoom"); gc_item_focus_init(item, NULL); goo_canvas_text_new (rootitem, _("Zoom"), (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_content, "fill-color-rgba", gc_skin_color_content, NULL); // Timer y_start += Y_GAP; display_previous_next(x_start, y_start, "timer_previous", "timer_next"); item_timer_text = goo_canvas_text_new (rootitem, gettext(timername[properties->timer]), (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_content, "fill-color-rgba", gc_skin_color_content, NULL); // Font y_start += Y_GAP; { int i; PangoFontFamily ** families; int n_families; PangoFontMap * fontmap; const gchar *current_familly_name = NULL; fontmap = pango_cairo_font_map_get_default(); pango_font_map_list_families (fontmap, & families, & n_families); for (i = 0; i < n_families; i++) { PangoFontFamily * family = families[i]; const gchar * family_name; family_name = pango_font_family_get_name (family); /* Skip font to exclude */ guint j = 0; gboolean exclude = FALSE; while(excluded_fonts[j] != NULL) { if( !g_ascii_strncasecmp(excluded_fonts[j], family_name, strlen(excluded_fonts[j])) ) { exclude = TRUE; break; } j++; } if(exclude) continue; fontlist = g_list_insert_sorted (fontlist, (gpointer)family_name, (GCompareFunc)strcmp); if(!strcmp(properties->fontface, family_name)) current_familly_name = family_name; } g_free (families); current_font_index = font_index = g_list_index(fontlist, current_familly_name); display_previous_next(x_start, y_start, "font_previous", "font_next"); /* A repeat icon to reset the selection */ item = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", "#REPEAT", NULL); goo_canvas_item_get_bounds(item, &bounds); double zoom = 0.50; goo_canvas_item_scale(item, zoom, zoom); goo_canvas_item_translate(item, (-1 * bounds.x1 + x_start - 100) * zoom, (-1 * bounds.y1 + y_start + 650) * zoom); g_signal_connect(item, "button_press_event", (GCallback) item_event_ok, "fontface_reset"); gc_item_focus_init(item, NULL); gchar *first_font_name = g_strdup_printf(_("Font: %s"), (char *)g_list_nth_data(fontlist, font_index)); item_font_text = goo_canvas_text_new (rootitem, first_font_name, (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_content, "fill-color-rgba", gc_skin_color_content, NULL); } // Difficulty Filter y_start += Y_GAP; stars_group_x = x_start + 45; stars_group_y = y_start - 25; gchar *text = g_strdup_printf("<i>%s</i>", gettext(filtername)); item_filter_text = goo_canvas_text_new (rootitem, text, x_text_start, y_start, 400, GTK_ANCHOR_WEST, "use-markup", TRUE, "font", gc_skin_font_content, "fill-color-rgba", gc_skin_color_content, NULL); g_free(text); // OK gc_util_button_text_svg(rootitem, BOARDWIDTH * 0.5, y, "#BUTTON_TEXT", _("OK"), (GCallback) item_event_ok, "ok"); is_displayed = TRUE; }
static void start_board (GcomprisBoard *agcomprisBoard) { if(agcomprisBoard!=NULL) { gcomprisBoard=agcomprisBoard; gcomprisBoard->level = 1; gcomprisBoard->maxlevel = 9; gc_bar_set(GC_BAR_LEVEL); /* Default mode */ if(!gcomprisBoard->mode){ currentMode=MODE_NORMAL; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_NORMAL; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "tux")==0){ currentMode=MODE_TUX; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_NORMAL; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "sound")==0){ currentMode=MODE_NORMAL; currentUiMode=UIMODE_SOUND; currentBoardMode=BOARDMODE_SOUND; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "sound_tux")==0){ currentMode=MODE_TUX; currentUiMode=UIMODE_SOUND; currentBoardMode=BOARDMODE_SOUND; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "add")==0){ currentMode=MODE_NORMAL; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_ADD; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "add_tux")==0){ currentMode=MODE_TUX; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_ADD; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "minus")==0){ currentMode=MODE_NORMAL; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_MINUS; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "minus_tux")==0){ currentMode=MODE_TUX; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_MINUS; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "mult")==0){ currentMode=MODE_NORMAL; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_MULT; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "mult_tux")==0){ currentMode=MODE_TUX; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_MULT; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "div")==0){ currentMode=MODE_NORMAL; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_DIV; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "div_tux")==0){ currentMode=MODE_TUX; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_DIV; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "add_minus")==0){ currentMode=MODE_NORMAL; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_ADD_MINUS; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "add_minus_tux")==0){ currentMode=MODE_TUX; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_ADD_MINUS; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "mult_div")==0){ currentMode=MODE_NORMAL; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_MULT_DIV; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "mult_div_tux")==0){ currentMode=MODE_TUX; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_MULT_DIV; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "add_minus_mult_div")==0){ currentMode=MODE_NORMAL; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_ADD_MINUS_MULT_DIV; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "add_minus_mult_div_tux")==0){ currentMode=MODE_TUX; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_ADD_MINUS_MULT_DIV; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "enumerate")==0){ currentMode=MODE_NORMAL; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_ENUMERATE; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "enumerate_tux")==0){ currentMode=MODE_TUX; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_ENUMERATE; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "wordnumber")==0){ currentMode=MODE_NORMAL; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_WORDNUMBER; } else { if(g_ascii_strcasecmp(gcomprisBoard->mode, "wordnumber_tux")==0){ currentMode=MODE_TUX; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_WORDNUMBER; } else { currentMode=MODE_NORMAL; currentUiMode=UIMODE_NORMAL; currentBoardMode=BOARDMODE_NORMAL; g_warning("Fallback mode set to images"); } } } } } } } } } } } } } } } } } } } } } } if (currentUiMode == UIMODE_SOUND) { GcomprisProperties *properties = gc_prop_get(); gc_sound_bg_pause(); /* initial state to restore */ sound_policy = gc_sound_policy_get(); // Will set the PLAY_AND_INTERRUPT policy on first // user click so that intro sounds is not gc_set_background(goo_canvas_get_root_item(gcomprisBoard->canvas), "memory/gcompris_band.svg"); base_x1 = BASE_SOUND_X1; base_y1 = BASE_SOUND_Y1; base_x2 = BASE_SOUND_X2; base_y2 = BASE_SOUND_Y2; base_x1_tux = BASE_SOUND_X1_TUX; if(!properties->fx) { gc_dialog(_("Error: this activity cannot be played with the\n" "sound effects disabled.\nGo to the configuration dialog to\n" "enable the sound"), gc_board_stop); return; } } else { if ((currentBoardMode==BOARDMODE_ENUMERATE)||(currentBoardMode==BOARDMODE_WORDNUMBER)) { gcomprisBoard->maxlevel = 6; } gc_set_background(goo_canvas_get_root_item(gcomprisBoard->canvas), "memory/scenery_background.png"); base_x1 = BASE_CARD_X1; base_y1 = BASE_CARD_Y1; base_x2 = BASE_CARD_X2; base_y2 = BASE_CARD_Y2; base_x1_tux = BASE_CARD_X1_TUX; } /* TRANSLATORS: Put here the numbers in your language */ numbers=_("0123456789"); g_assert(g_utf8_validate(numbers,-1,NULL)); // require by all utf8-functions /* TRANSLATORS: Put here the alphabet lowercase in your language */ alphabet_lowercase=_("abcdefghijklmnopqrstuvwxyz"); g_assert(g_utf8_validate(alphabet_lowercase,-1,NULL)); // require by all utf8-functions g_warning("Using lowercase %s", alphabet_lowercase); /* TRANSLATORS: Put here the alphabet uppercase in your language */ alphabet_uppercase=_("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); g_assert(g_utf8_validate(alphabet_uppercase,-1,NULL)); // require by all utf8-functions g_warning("Using uppercase %s", alphabet_uppercase); /* TRANSLATORS: Put here the mathematical operators '+-x/' for your language. */ operators=_("+-×÷"); g_assert(g_utf8_validate(operators,-1,NULL)); // require by all utf8-functions g_warning("Using operators %s", operators); op_add = g_malloc0(2*sizeof(gunichar)); g_utf8_strncpy(op_add, g_utf8_offset_to_pointer (operators,0),1); op_minus = g_malloc0(2*sizeof(gunichar)); g_utf8_strncpy(op_minus, g_utf8_offset_to_pointer (operators,1),1); op_mult = g_malloc0(2*sizeof(gunichar)); g_utf8_strncpy(op_mult, g_utf8_offset_to_pointer (operators,2),1); op_div = g_malloc0(2*sizeof(gunichar)); g_utf8_strncpy(op_div, g_utf8_offset_to_pointer (operators,3),1); g_warning("Using operators %s %s %s %s", op_add, op_minus, op_mult, op_div); if (currentMode == MODE_TUX){ tux_memory_size = tux_memory_sizes[gcomprisBoard->level]; tux_memory = g_queue_new (); } Paused = FALSE; memory_next_level(); } }
/* Callback for the bar operations */ static gboolean item_event_bar (GooCanvasItem *item, GooCanvasItem *target, GdkEventButton *event, GComprisBarFlags flag) { GcomprisBoard *gcomprisBoard = gc_board_get_current(); if(_hidden) return(FALSE); bar_reset_sound_id(); gc_sound_play_ogg ("sounds/bleep.wav", NULL); switch (flag) { case GC_BAR_LEVEL: { current_level++; if(gcomprisBoard && current_level > gcomprisBoard->maxlevel) current_level=1; /* Set the level */ if(gcomprisBoard && gcomprisBoard->plugin->set_level != NULL) gcomprisBoard->plugin->set_level(current_level); gc_bar_play_level_voice(current_level); } break; case GC_BAR_LEVEL_DOWN: { /* Decrease the level */ current_level--; if(current_level < 1) current_level = gcomprisBoard->maxlevel; /* Set the level */ if(gcomprisBoard && gcomprisBoard->plugin->set_level != NULL) gcomprisBoard->plugin->set_level(current_level); gc_bar_play_level_voice(current_level); } break; case GC_BAR_HOME: { bar_hide (TRUE); gc_board_stop(); } break; case GC_BAR_HELP: { gc_help_start(gcomprisBoard); } break; case GC_BAR_REPEAT_ICON: case GC_BAR_REPEAT: { if(gcomprisBoard && gcomprisBoard->plugin->repeat != NULL) { gcomprisBoard->plugin->repeat(); } } break; case GC_BAR_CONFIG: { if(gcomprisBoard && gcomprisBoard->plugin->config_start != NULL) { gcomprisBoard->plugin->config_start(gcomprisBoard, gc_profile_get_current()); } } break; case GC_BAR_ABOUT: { gc_about_start(); } break; case GC_BAR_EXIT: { GcomprisProperties *properties = gc_prop_get(); if(strlen(properties->root_menu) == 1) gc_confirm_box( _("GCompris confirmation"), _("Are you sure you want to quit?"), _("Yes, I am sure!"), _("No, I want to keep going"), (ConfirmCallBack) confirm_quit); else confirm_quit(TRUE); } break; default: break; } return TRUE; }
/* * Do all the bar display and register the events */ static void bar_start (GooCanvas *theCanvas) { GcomprisProperties *properties = gc_prop_get(); RsvgHandle *svg_handle; GooCanvasBounds bounds; _default_y = BOARDHEIGHT - BARHEIGHT; _default_zoom = 1.0; bar_reset_sound_id(); rootitem = goo_canvas_group_new (goo_canvas_get_root_item(theCanvas), NULL); svg_handle = gc_skin_rsvg_get(); bar_item = goo_canvas_svg_new (rootitem, svg_handle, "svg-id", "#BAR_BG", "pointer-events", GOO_CANVAS_EVENTS_NONE, NULL); SET_ITEM_LOCATION(bar_item, 0, 0); /* * The Order in which buttons are created represents * also the order in which they will be displayed */ // EXIT if(properties->disable_quit == 0) buttons = g_slist_append(buttons, new_button(rootitem, svg_handle, GC_BAR_EXIT, "#EXIT")); // ABOUT buttons = g_slist_append(buttons, new_button(rootitem, svg_handle, GC_BAR_ABOUT, "#ABOUT")); // CONFIG if(properties->disable_config == 0) buttons = g_slist_append(buttons, new_button(rootitem, svg_handle, GC_BAR_CONFIG, "#CONFIG")); // HELP buttons = g_slist_append(buttons, new_button(rootitem, svg_handle, GC_BAR_HELP, "#HELP")); // LEVEL (Multiple buttons for this one) GooCanvasItem *rootitem_level = goo_canvas_group_new (rootitem, NULL); g_object_set (rootitem_level, "visibility", GOO_CANVAS_ITEM_VISIBLE, NULL); g_object_set_data (G_OBJECT(rootitem_level), "flag", GUINT_TO_POINTER(GC_BAR_LEVEL)); buttons = g_slist_append(buttons, rootitem_level); GooCanvasItem *item = new_button(rootitem_level, svg_handle, GC_BAR_LEVEL_DOWN, "#LEVEL_DOWN"); g_object_set (item, "visibility", (properties->disable_level ? GOO_CANVAS_ITEM_INVISIBLE : GOO_CANVAS_ITEM_VISIBLE), NULL); item = new_button(rootitem_level, svg_handle, GC_BAR_LEVEL, "#LEVEL_UP"); goo_canvas_item_translate(item, 50, 0); g_object_set (item, "visibility", (properties->disable_level ? GOO_CANVAS_ITEM_INVISIBLE : GOO_CANVAS_ITEM_VISIBLE), NULL); goo_canvas_item_get_bounds(item, &bounds); level_item = goo_canvas_text_new (rootitem_level, "", bounds.x1 - 10, (bounds.y2 - bounds.y1) / 2 + 8, -1, GTK_ANCHOR_CENTER, "font", gc_skin_font_board_title_bold, "fill-color-rgba", gc_skin_color_text_button, NULL); current_level = 1; // REPEAT (Default) buttons = g_slist_append(buttons, new_button(rootitem, svg_handle, GC_BAR_REPEAT, "#REPEAT")); // REPEAT ICON buttons = g_slist_append(buttons, new_button(rootitem, svg_handle, GC_BAR_REPEAT_ICON, "#REPEAT")); // HOME buttons = g_slist_append(buttons, new_button(rootitem, svg_handle, GC_BAR_HOME, "#HOME")); update_exit_button(); bar_set(0); _hidden = FALSE; }
void gc_im_reset() { GcomprisProperties *properties = gc_prop_get (); gtk_im_context_reset (properties->context); }
void gc_timer_display(int ax, int ay, TimerList atype, int second, GcomprisTimerEnd agcomprisTimerEnd) { GdkFont *gdk_font; GdkPixbuf *pixmap = NULL; GcomprisProperties *properties = gc_prop_get(); /* Timer is user disabled */ if(properties->timer==0) return; gdk_font = gdk_font_load (FONT_BOARD_MEDIUM); gc_timer_end(); paused = FALSE; boardRootItem = goo_canvas_group_new (goo_canvas_get_root_item(gc_get_canvas()), NULL); x = ax; y = ay; second = second / properties->timer; timer = second; type = atype; gcomprisTimerEnd = agcomprisTimerEnd; switch(type) { case GCOMPRIS_TIMER_SAND: case GCOMPRIS_TIMER_CLOCK: { gchar *filename = NULL; gint fileid; fileid = (gint)timer; if(type==GCOMPRIS_TIMER_SAND) filename = g_strdup_printf("timers/sablier%d.png", fileid); else filename = g_strdup_printf("timers/clock%d.png", fileid); pixmap = gc_skin_pixmap_load(filename); gc_timer_item = goo_canvas_image_new (boardRootItem, pixmap, x, y, NULL); #if GDK_PIXBUF_MAJOR <= 2 && GDK_PIXBUF_MINOR <= 24 gdk_pixbuf_unref(pixmap); #else g_object_unref(pixmap); #endif g_free(filename); } break; case GCOMPRIS_TIMER_TEXT: { gchar *tmpstr = g_strdup_printf("Remaining Time = %d", timer); /* Display the value for this timer */ gc_timer_item = goo_canvas_text_new (boardRootItem, tmpstr, x, y, -1, GTK_ANCHOR_CENTER, "font_gdk", gdk_font, "fill_color", "white", NULL); g_free(tmpstr); } break; case GCOMPRIS_TIMER_BALLOON: pixmap = gc_skin_pixmap_load("timers/tuxballoon.png"); gc_timer_item = goo_canvas_image_new (boardRootItem, pixmap, x, y, NULL); /* Calc the number of step needed to reach * the sea based on user y and second */ ystep = (BOARDHEIGHT-y-gdk_pixbuf_get_height(pixmap))/second; #if GDK_PIXBUF_MAJOR <= 2 && GDK_PIXBUF_MINOR <= 24 gdk_pixbuf_unref(pixmap); #else g_object_unref(pixmap); #endif pixmap = gc_skin_pixmap_load("timers/sea.png"); goo_canvas_image_new (boardRootItem, pixmap, 0, BOARDHEIGHT - gdk_pixbuf_get_height(pixmap), "width", (double) gdk_pixbuf_get_width(pixmap), "height", (double) gdk_pixbuf_get_height(pixmap), NULL); #if GDK_PIXBUF_MAJOR <= 2 && GDK_PIXBUF_MINOR <= 24 gdk_pixbuf_unref(pixmap); #else g_object_unref(pixmap); #endif break; default: break; } start_animation(); }
static gint key_press(guint keyval, gchar *commit_str, gchar *preedit_str) { gchar *letter; gint i; LettersItem *item; gchar *str; gunichar unichar_letter; gint retval = TRUE; if(!gcomprisBoard) return FALSE; if (keyval){ g_warning("keyval %d", keyval); return TRUE; } if (preedit_str){ g_warning("preedit_str %s", preedit_str); /* show the preedit string on bottom of the window */ GcomprisProperties *properties = gc_prop_get (); gchar *text; PangoAttrList *attrs; gint cursor_pos; gtk_im_context_get_preedit_string (properties->context, &text, &attrs, &cursor_pos); if (!preedit_text) preedit_text = \ goo_canvas_text_new (goo_canvas_get_root_item(gcomprisBoard->canvas), "", BOARDWIDTH/2, BOARDHEIGHT - 100, -1, GTK_ANCHOR_N, "font", gc_skin_font_board_huge_bold, //"fill_color_rgba", 0xba00ffff, NULL); g_object_set (preedit_text, "text", text, "attributes", attrs, NULL); return TRUE; } /* commit str */ g_warning("commit_str %s", commit_str); str = commit_str; #if GLIB_CHECK_VERSION(2, 31, 0) g_mutex_lock (&items_lock); #else g_static_mutex_lock (&items_lock); #endif for (i=0; i < g_utf8_strlen(commit_str,-1); i++){ unichar_letter = g_utf8_get_char(str); str = g_utf8_next_char(str); if(!g_unichar_isalnum (unichar_letter)){ player_loose(); retval = FALSE; break; } letter = g_new0(gchar,6); g_unichar_to_utf8 (unichar_letter, letter); /* Force entered letter to the casing we expect * Children is to small to manage the caps lock key for now */ if (uppercase_only) { gchar *old = letter; letter = g_utf8_strup(old, -1); g_free(old); } else { gchar *old = letter; letter = g_utf8_strdown(old, -1); g_free(old); } if(item_on_focus==NULL) { for (i=0;i<items->len;i++) { item=g_ptr_array_index(items,i); g_assert (item!=NULL); if (strcmp(item->letter,letter)==0) { item_on_focus=item; break; } } } if(item_on_focus!=NULL) { if(strcmp(item_on_focus->letter, letter)==0) { gchar *tmpstr; item_on_focus->count++; g_free(item_on_focus->overword); tmpstr = g_utf8_strndup(item_on_focus->word, item_on_focus->count); /* Add the ZERO WIDTH JOINER to force joined char in Arabic and Hangul * http://en.wikipedia.org/wiki/Zero-width_joiner */ item_on_focus->overword = g_strdup_printf("%s%lc", tmpstr, 0x200D); g_free(tmpstr); g_object_set (item_on_focus->overwriteItem, "text", item_on_focus->overword, NULL); if (item_on_focus->count<g_utf8_strlen(item_on_focus->word,-1)) { g_free(item_on_focus->letter); item_on_focus->letter=g_utf8_strndup(item_on_focus->pos,1); item_on_focus->pos=g_utf8_find_next_char(item_on_focus->pos,NULL); } else { player_win(item_on_focus); item_on_focus=NULL; } } else { /* It is a loose : unselect the word and defocus */ g_free(item_on_focus->overword); item_on_focus->overword=g_strdup(" "); item_on_focus->count=0; g_free(item_on_focus->letter); item_on_focus->letter=g_utf8_strndup(item_on_focus->word,1); item_on_focus->pos=g_utf8_find_next_char(item_on_focus->word,NULL); g_object_set (item_on_focus->overwriteItem, "text", item_on_focus->overword, NULL); item_on_focus=NULL; g_free(letter); player_loose(); break; } } else { /* Anyway kid you clicked on the wrong key */ player_loose(); g_free(letter); break; } g_free(letter); } #if GLIB_CHECK_VERSION(2, 31, 0) g_mutex_unlock (&items_lock); #else g_static_mutex_unlock (&items_lock); #endif return retval; }
static void menu_start (GcomprisBoard *agcomprisBoard) { current_x = 0.0; current_y = 0.0; /* initialisations */ /* in case we will make this parametrable */ panel_x = P_X; panel_y = P_Y; panel_w = P_W; panel_h = P_H; top_x = T_X; top_y = T_Y; top_w = T_W; top_h = T_H; top_int_x = T_INT_X; top_arrow_size = T_ARROW_SIZE; display_x = D_X; display_y = D_Y; display_w = D_W; display_h = D_H; display_int_x = D_INT_X; display_int_y = D_INT_Y; info_x = I_X; info_y = I_Y; info_w = I_W; info_h = I_H; icon_size = ICON_SIZE; icon_size_panel = ICON_SIZE_PANEL; icon_size_top = ICON_SIZE_TOP; if(agcomprisBoard != NULL) { RsvgHandle *svg_handle; gcomprisBoard=agcomprisBoard; /* set initial values for this level */ gcomprisBoard->level = 1; gcomprisBoard->maxlevel=1; /* Set back the bar to it's original location */ gc_bar_set(GC_BAR_CONFIG|GC_BAR_ABOUT|GC_BAR_JOURNAL|GC_BAR_SHARE); menuitems = g_new(MenuItems, 1); svg_handle = gc_skin_rsvg_get(); gc_set_background_by_id (goo_canvas_get_root_item(gcomprisBoard->canvas), svg_handle, "#BACKGROUND"); boardRootItem = \ goo_canvas_group_new (goo_canvas_get_root_item(gcomprisBoard->canvas), NULL); g_object_set_data_full(G_OBJECT (boardRootItem), "menuitems", menuitems, g_free); goo_canvas_svg_new (boardRootItem, svg_handle, "svg-id", "#SELECTOR", "pointer-events", GOO_CANVAS_EVENTS_NONE, NULL); goo_canvas_svg_new (boardRootItem, svg_handle, "svg-id", "#BUTTON_HORIZONTAL", "pointer-events", GOO_CANVAS_EVENTS_NONE, NULL); create_info_area(boardRootItem, menuitems); create_panel(boardRootItem); if (menu_position) display_section(menu_position); else display_welcome(menuitems); { if ( strcmp(gc_prop_get()->profile->name, GC_PROFILE_DEFAULT) != 0 ) { gchar *text = g_strdup_printf(_("Profile: %s"), gc_prop_get()->profile->name); goo_canvas_text_new (boardRootItem, text, BOARDWIDTH - 10, BOARDHEIGHT - 30, -1, GTK_ANCHOR_EAST, "font", gc_skin_font_board_tiny, "fill-color-rgba", gc_skin_get_color("menu/text"), "alignment", PANGO_ALIGN_RIGHT, NULL); g_free(text); } } { gchar *text = g_strdup_printf(_("Number of activities: %d"), gc_board_get_number_of_activity()); goo_canvas_text_new (boardRootItem, text, BOARDWIDTH - 10, BOARDHEIGHT - 10, -1, GTK_ANCHOR_EAST, "font", gc_skin_font_board_tiny, "fill-color-rgba", gc_skin_get_color("menu/text"), "alignment", PANGO_ALIGN_RIGHT, NULL); g_free(text); } menu_pause(FALSE); } }
static void create_panel(GooCanvasItem *parent) { int n_sections; GList *list = NULL; GcomprisBoard *board; GdkPixbuf *pixmap = NULL; GooCanvasItem *item; gdouble x, y; gint int_y; GcomprisProperties *properties = gc_prop_get(); g_assert(properties); /* In normal mode, we show all the sections in panel */ /* in direct submenu access, we show the icon of the submenu */ if (strcmp(properties->root_menu,"/")==0) panelBoards = gc_menu_getlist(properties->root_menu); else panelBoards = g_list_append(list, gcomprisBoard); n_sections = g_list_length(panelBoards); if (n_sections == 0) return; if ( (panel_h/n_sections) <= icon_size_panel) { icon_size_panel = panel_h / n_sections; int_y = 0; } else { int_y = (panel_h - n_sections*icon_size_panel)/n_sections; } x = panel_x + panel_w * 0.25; y = panel_y + int_y / 2.0 - 20; for (list = panelBoards; list != NULL; list = list->next) { board = (GcomprisBoard *) list->data; pixmap = gc_pixmap_load(board->icon_name); item = goo_canvas_image_new (parent, pixmap, x, y, NULL); #if GDK_PIXBUF_MAJOR <= 2 && GDK_PIXBUF_MINOR <= 24 gdk_pixbuf_unref(pixmap); #else g_object_unref(pixmap); #endif y += int_y + icon_size_panel; g_object_set_data (G_OBJECT (item), "board", board); g_signal_connect(item, "button_press_event", (GCallback) item_event, menuitems); g_signal_connect (item, "enter_notify_event", (GCallback) on_enter_notify, menuitems); g_signal_connect (item, "leave_notify_event", (GCallback) on_leave_notify, menuitems); if ( ! gc_board_is_demo_only(board) ) gc_item_focus_init(item, NULL); } }
static void menu_create_item(GooCanvasItem *parent, MenuItems *menuitems, GcomprisBoard *board) { GdkPixbuf *menu_pixmap = NULL; GooCanvasItem *menu_button; int difficulty; gdouble ratio, pixmap_w, pixmap_h; menu_pixmap = gc_pixmap_load(board->icon_name); ratio = get_ratio (menu_pixmap, icon_size); pixmap_w = gdk_pixbuf_get_width(menu_pixmap) * ratio; pixmap_h = gdk_pixbuf_get_height(menu_pixmap) * ratio; next_spot(); menu_button = goo_canvas_image_new (parent, menu_pixmap, current_x - pixmap_w/2, current_y - pixmap_h/2, NULL); goo_canvas_item_scale(menu_button, ratio, ratio); // display board availability due to sound voice not present if(board->mandatory_sound_file) { gchar *soundfile = NULL; /* We search a fixed path sound file */ soundfile = gc_file_find_absolute(board->mandatory_sound_file); if (!soundfile || !gc_prop_get()->fx) { GooCanvasItem *item = \ goo_canvas_svg_new (parent, gc_skin_rsvg_get(), "svg-id", "#SOUND_UNCHECKED", "pointer-events", GOO_CANVAS_EVENTS_NONE, NULL); GooCanvasBounds bounds; goo_canvas_item_get_bounds(item, &bounds); SET_ITEM_LOCATION(item, current_x - pixmap_w/2 - 25 - (bounds.x2 - bounds.x1)/2, current_y - pixmap_h/2 + 28- (bounds.y2 - bounds.y1)/2); } g_free(soundfile); } // display menu icon ========================== BEGIN if(g_ascii_strcasecmp(board->type, "menu") == 0) { GooCanvasItem *item = goo_canvas_svg_new (parent, gc_skin_rsvg_get(), "svg-id", "#MENUICON", "pointer-events", GOO_CANVAS_EVENTS_NONE, NULL); SET_ITEM_LOCATION(item, current_x - pixmap_w/2 - 25, current_y - pixmap_h/2); } else { // display difficulty stars if (board->difficulty != NULL) { difficulty = atoi(board->difficulty); menu_difficulty_display(parent, (double)current_x - pixmap_w/2 - 25, (double)current_y - pixmap_h/2, (double) 0.6, difficulty); } if ( gc_board_is_demo_only(board) ) menu_demo_display(parent, (gdouble)(current_x - pixmap_w/2 - 20), (gdouble)(current_y - pixmap_h/2 + 60) ); } #if GDK_PIXBUF_MAJOR <= 2 && GDK_PIXBUF_MINOR <= 24 gdk_pixbuf_unref(menu_pixmap); #else g_object_unref(menu_pixmap); #endif // display menu icon ========================== END /* * Now everything ready, map the events * ------------------------------------- */ g_object_set_data (G_OBJECT (menu_button), "board", board); g_signal_connect(menu_button, "button_press_event", (GCallback) item_event, menuitems); g_signal_connect (menu_button, "enter_notify_event", (GCallback) on_enter_notify, menuitems); g_signal_connect (menu_button, "leave_notify_event", (GCallback) on_leave_notify, menuitems); gc_item_focus_init(menu_button, NULL); }
static void create_top(GooCanvasItem *parent, gchar *path) { gchar **splitted_section; gint i = 1; GdkPixbuf *pixmap = NULL; gdouble ratio; GcomprisBoard *board; gchar *path1, *path2; GooCanvasItem *item; GcomprisProperties *properties = gc_prop_get(); if (!path) return; splitted_section = g_strsplit (path, "/", 0); path1 = g_strdup(""); /* splitted_section[0] is always "" */ i = 1; while (splitted_section[i] != NULL) { path2 = g_strdup_printf("%s/%s", path1, splitted_section[i]); g_free(path1); path1 = path2; if (strcmp(path1, properties->root_menu)<0) { i++; continue; } if (current_top_x == 0.0) { current_top_x = top_x; current_top_y = top_y; } else { item = \ goo_canvas_svg_new (parent, gc_skin_rsvg_get(), "svg-id", "#MENUICON", "pointer-events", GOO_CANVAS_EVENTS_NONE, NULL); SET_ITEM_LOCATION(item, current_top_x, current_top_y + top_arrow_size); // goo_canvas_item_scale(item, ratio, ratio); current_top_x += top_arrow_size + top_int_x; } board = gc_menu_section_get(path1); pixmap = gc_pixmap_load(board->icon_name); ratio = get_ratio( pixmap, icon_size_top); item = goo_canvas_image_new (parent, pixmap, 0, 0, NULL); goo_canvas_item_translate(item, current_top_x, current_top_y); goo_canvas_item_scale(item, ratio, ratio); #if GDK_PIXBUF_MAJOR <= 2 && GDK_PIXBUF_MINOR <= 24 gdk_pixbuf_unref(pixmap); #else g_object_unref(pixmap); #endif current_top_x += top_int_x + icon_size_top; g_object_set_data (G_OBJECT (item), "board", board); g_signal_connect(item, "button_press_event", (GCallback) item_event, menuitems); gc_item_focus_init(item, NULL); i++; } g_strfreev(splitted_section); g_free(path1); }
gboolean gc_db_init(gboolean disable_database_) { #ifdef USE_SQLITE disable_database = disable_database_; SUPPORT_OR_RETURN(FALSE); gboolean creation = FALSE; char *zErrMsg; char **result; int rc; int nrow; int ncolumn; GcomprisProperties *properties = gc_prop_get(); if (!g_file_test(properties->database, G_FILE_TEST_EXISTS)) creation = TRUE; rc = sqlite3_open(properties->database, &gcompris_db); if( rc ){ g_message("Can't open database %s : %s\n", properties->database, sqlite3_errmsg(gcompris_db)); sqlite3_close(gcompris_db); disable_database = TRUE; return FALSE; } g_message("Database %s opened", properties->database); if (creation){ _create_db(); } else { if ( ! _check_db_integrity() || _gc_boards_count() == 0 ) { // We failed to load the database, let's // backup it and re create it. sqlite3_close(gcompris_db); gchar *backup = g_strdup_printf("%s.broken", properties->database); g_rename(properties->database, backup); g_message("Database is broken, it is copyed in %s", backup); g_free(backup); rc = sqlite3_open(properties->database, &gcompris_db); if( rc ){ g_message("Can't open database %s : %s\n", properties->database, sqlite3_errmsg(gcompris_db)); sqlite3_close(gcompris_db); disable_database = TRUE; return FALSE; } _create_db(); if ( ! _check_db_integrity() ) { disable_database = TRUE; return FALSE; } } g_message("Database Integrity ok"); rc = sqlite3_get_table(gcompris_db, CHECK_VERSION, &result, &nrow, &ncolumn, &zErrMsg ); if( rc!=SQLITE_OK ){ g_error("SQL error: %s\n", zErrMsg); } if (strcmp(result[1],VERSION)!=0) g_message("Running GCompris is %s, but database version is %s", VERSION, result[1]); sqlite3_free_table(result); /* Schema upgrade */ rc = sqlite3_get_table(gcompris_db, PRAGMA_SCHEMA_VERSION, &result, &nrow, &ncolumn, &zErrMsg ); if( rc!=SQLITE_OK ){ g_error("SQL error: %s\n", zErrMsg); } int version = atoi(result[1]); sqlite3_free_table(result); if(version <= 16) { g_message("Upgrading from <16 schema version\n"); rc = sqlite3_exec(gcompris_db,CREATE_TABLE_LOGS, NULL, 0, &zErrMsg); if( rc!=SQLITE_OK ) { g_error("SQL error: %s\n", zErrMsg); } } if ( _get_user_version() == 0) { g_message("Upgrading schema based on user version = 0\n"); rc = sqlite3_exec(gcompris_db,"DROP TABLE boards;", NULL, 0, &zErrMsg); if( rc!=SQLITE_OK ) { g_error("SQL error: %s\n", zErrMsg); } rc = sqlite3_exec(gcompris_db,CREATE_TABLE_BOARDS, NULL, 0, &zErrMsg); if( rc!=SQLITE_OK ) { g_error("SQL error: %s\n", zErrMsg); } // We just dropped the boards table, force a reread properties->reread_menu = TRUE; _set_user_version(1); } } return TRUE; #else return FALSE; #endif }
static void parseImage (xmlDocPtr doc, xmlNodePtr cur) { GcomprisProperties *properties = gc_prop_get(); gchar *imageSetName = NULL; gchar *filename; gchar *pathname = NULL; gchar *absolutepath; GSList *imageList = NULL; /* List of Images */ gboolean havePathName = FALSE; gchar *type = NULL; GDir *imageset_directory; /* get the filename of this ImageSet */ imageSetName = (gchar *)xmlGetProp(cur, BAD_CAST "filename"); if (xmlHasProp(cur, BAD_CAST "PathName")){ pathname = (gchar *)xmlGetProp(cur, BAD_CAST "PathName"); havePathName = TRUE; } if (havePathName && pathname[0] == '~' && g_get_home_dir()) { /* replace '~' by home dir */ pathname = g_strdup_printf("%s%s",g_get_home_dir(), pathname+1); if (!g_file_test ((pathname), G_FILE_TEST_IS_DIR)){ g_warning("In ImageSet %s, the pathname for the home directory '%s' is not found. Skipping the whole ImageSet.", imageSetName, pathname); return; } } if (xmlHasProp(cur, BAD_CAST "type")){ /* lsdir means try all file of directory */ /* list means just keep old behaviour */ /* others are extensions to look for */ type = (gchar *)xmlGetProp(cur, BAD_CAST "type"); } /* Looking for imageSetName */ /* absolute path -> we check it's here */ /* relative path -> we check for pathname/imagesetname */ /* -> and else for PACKAGE_DATA_DIR/imagesetname */ if (havePathName) { if (!g_path_is_absolute (imageSetName)){ absolutepath = gc_file_find_absolute(imageSetName, NULL); } else absolutepath = g_strdup(imageSetName); } else absolutepath = gc_file_find_absolute(imageSetName, NULL); if(!absolutepath) { g_warning("In ImageSet %s, an image is not found. Skipping ImageSet...", imageSetName); return; } if ((type == NULL) || (g_ascii_strcasecmp (type,"list")==0)) { /* old behaviour : we read the filenames from xml files */ cur = cur->xmlChildrenNode; while (cur != NULL) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"Image"))) { /* get the filename of this ImageSet */ filename = (gchar *)xmlGetProp(cur, BAD_CAST "filename"); if (havePathName){ filename = g_strdup_printf("%s/%s",pathname,filename); } imageList = g_slist_prepend (imageList, filename); } cur = cur->next; } } else { /* new behaviour : we read all file of a directory */ /* or all files with a given suffix */ if (!g_file_test ((pathname), G_FILE_TEST_IS_DIR)){ char *tmpdir; tmpdir = g_strdup_printf("%s/%s", properties->package_data_dir, pathname); g_free(pathname); pathname = tmpdir; if (!g_file_test ((pathname), G_FILE_TEST_IS_DIR)){ g_warning("In ImageSet %s, directory %s is not found. Skipping all the ImageSet...", absolutepath, pathname); return; } } imageset_directory = g_dir_open (pathname, 0, NULL); const gchar * onefile; while ((onefile = g_dir_read_name(imageset_directory))) { /* Skip README file */ if(g_ascii_strcasecmp (onefile, "readme") == 0) continue; if ((g_ascii_strcasecmp (type,"lsdir") != 0) && (!g_str_has_suffix (onefile, type))){ continue; } filename = g_strdup_printf("%s/%s", pathname, onefile); if (!g_file_test ((filename), G_FILE_TEST_IS_REGULAR)){ continue; } { /* Add a % before a % to avoid it being used as a format arg */ gchar **tmp; gchar *filename2; if((tmp = g_strsplit(filename, "%", -1))) { filename2 = g_strjoinv("%%", tmp); g_strfreev(tmp); g_free(filename); filename = filename2; } } imageList = g_slist_prepend (imageList, filename); } g_dir_close(imageset_directory); } /* do not display if there is nothing to display */ if (imageList != NULL) /* g_slist is not empty */ display_image_set(imageSetName, imageList); g_free(absolutepath); if(pathname) g_free(pathname); if(type) g_free(type); return; }
/* * Do all the bar display and register the events */ void gc_config_start () { GcomprisProperties *properties = gc_prop_get(); gint y_start = 0; gint x_start = 0; gint x_text_start = 0; gint y = 0; GooCanvasItem *item; /* Pause the board */ gc_board_pause(TRUE); if(rootitem) { gc_config_stop(); return; } gc_bar_hide(TRUE); rootitem = goo_canvas_group_new (goo_canvas_get_root_item(gc_get_canvas()), NULL); item = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", "#DIALOG", "pointer-events", GOO_CANVAS_EVENTS_NONE, NULL); GooCanvasBounds bounds; goo_canvas_item_get_bounds(item, &bounds); x_start = bounds.x1; y_start = bounds.y1; y = bounds.y2 - 26; goo_canvas_text_new (rootitem, _("GCompris Configuration"), (gdouble) BOARDWIDTH/2, (gdouble) y_start + 40, -1, GTK_ANCHOR_CENTER, "font", gc_skin_font_title, "fill-color-rgba", gc_skin_color_title, NULL); pixmap_checked = "#CHECKED"; pixmap_unchecked = "#UNCHECKED"; pixmap_width = 30; x_start += 150; x_flag_start = x_start + 50; x_text_start = x_start + 115; //-------------------------------------------------- // Locale y_start += 105; display_previous_next(x_start, y_start, "locale_previous", "locale_next"); y_flag_start = y_start - pixmap_width/2; /* Display a bad icon if this locale is not available */ item_bad_flag = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", "#UNCHECKED", "pointer-events", GOO_CANVAS_EVENTS_NONE, NULL); SET_ITEM_LOCATION(item_bad_flag, x_flag_start + 5, y_start - pixmap_width/2); /* A repeat icon to reset the selection */ item = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", "#REPEAT", NULL); goo_canvas_item_get_bounds(item, &bounds); double zoom = 0.65; goo_canvas_item_scale(item, zoom, zoom); goo_canvas_item_translate(item, (-1 * bounds.x1 + x_flag_start - 340) * zoom, (-1 * bounds.y1 + y_start - 120) * zoom); g_signal_connect(item, "button_press_event", (GCallback) item_event_ok, "locale_reset"); gc_item_focus_init(item, NULL); /* * The current locale is the one found in the config file */ current_locale = properties->locale; set_locale_flag(current_locale); item_locale_text = goo_canvas_text_new (rootitem, gc_locale_get_name(current_locale), (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_subtitle, "fill-color-rgba", gc_skin_color_content, NULL); // Fullscreen / Window y_start += Y_GAP; item = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", (properties->fullscreen ? pixmap_checked : pixmap_unchecked), NULL); SET_ITEM_LOCATION(item, x_start, y_start - pixmap_width/2); g_signal_connect(item, "button_press_event", (GCallback) item_event_ok, "fullscreen"); gc_item_focus_init(item, NULL); goo_canvas_text_new (rootitem, _("Fullscreen"), (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_subtitle, "fill-color-rgba", gc_skin_color_content, NULL); // Music y_start += Y_GAP; item = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", (properties->music ? pixmap_checked : pixmap_unchecked), NULL); SET_ITEM_LOCATION(item, x_start, y_start - pixmap_width/2); g_signal_connect(item, "button_press_event", (GCallback) item_event_ok, "music"); gc_item_focus_init(item, NULL); goo_canvas_text_new (rootitem, _("Music"), (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_subtitle, "fill-color-rgba", gc_skin_color_content, NULL); // Effect y_start += Y_GAP; item = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", (properties->fx ? pixmap_checked : pixmap_unchecked), NULL); SET_ITEM_LOCATION(item, x_start, y_start - pixmap_width/2); g_signal_connect(item, "button_press_event", (GCallback) item_event_ok, "effect"); gc_item_focus_init(item, NULL); goo_canvas_text_new (rootitem, _("Effect"), (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_subtitle, "fill-color-rgba", gc_skin_color_content, NULL); // Zoom y_start += Y_GAP; item = goo_canvas_svg_new (rootitem, gc_skin_rsvg_get(), "svg-id", (properties->zoom ? pixmap_checked : pixmap_unchecked), NULL); SET_ITEM_LOCATION(item, x_start, y_start - pixmap_width/2); g_signal_connect(item, "button_press_event", (GCallback) item_event_ok, "zoom"); gc_item_focus_init(item, NULL); goo_canvas_text_new (rootitem, _("Zoom"), (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_subtitle, "fill-color-rgba", gc_skin_color_content, NULL); // Timer y_start += Y_GAP; display_previous_next(x_start, y_start, "timer_previous", "timer_next"); item_timer_text = goo_canvas_text_new (rootitem, gettext(timername[properties->timer]), (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_subtitle, "fill-color-rgba", gc_skin_color_content, NULL); // Skin { const gchar *one_dirent; guint i; GDir *dir; gchar *skin_dir; gchar *first_skin_name; /* Load the Pixpmaps directory file names */ skin_dir = g_strconcat(properties->package_data_dir, "/skins", NULL); dir = g_dir_open(skin_dir, 0, NULL); if (!dir) g_warning (_("Couldn't open skin dir: %s"), skin_dir); /* Fill up the skin list */ while((one_dirent = g_dir_read_name(dir)) != NULL) { if (one_dirent[0] != '.') { gchar *filename; /* Only directory here are skins */ filename = g_strdup_printf("%s/%s", properties->package_skin_dir, one_dirent); if (g_file_test ((filename), G_FILE_TEST_IS_DIR)) { gchar *skin_name = g_strdup_printf("%s", one_dirent); skinlist = g_list_append (skinlist, skin_name); } g_free(filename); } } g_dir_close(dir); /* Find the current skin index */ skin_index = 0; for(i=0; i<g_list_length(skinlist); i++) if(!strcmp((char *)g_list_nth_data(skinlist, i), properties->skin)) skin_index = i; y_start += Y_GAP; /* Should not happen. It the user found the config, there should be a skin */ if(g_list_length(skinlist) > 0) { g_warning("No skin found in %s\n", skin_dir); display_previous_next(x_start, y_start, "skin_previous", "skin_next"); first_skin_name = g_strdup_printf(_("Skin : %s"), (char *)g_list_nth_data(skinlist, skin_index)); } else { first_skin_name = g_strdup(_("SKINS NOT FOUND")); } item_skin_text = goo_canvas_text_new (rootitem, first_skin_name, (gdouble) x_text_start, (gdouble) y_start, -1, GTK_ANCHOR_WEST, "font", gc_skin_font_subtitle, "fill-color-rgba", gc_skin_color_content, NULL); g_free(first_skin_name); g_free(skin_dir); } // Difficulty Filter y_start += Y_GAP; stars_group_x = x_start + 45; stars_group_y = y_start - 25; gchar *text = g_strdup_printf("<i>%s</i>", gettext(filtername)); item_filter_text = goo_canvas_text_new (rootitem, text, x_text_start, y_start, 400, GTK_ANCHOR_WEST, "use-markup", TRUE, "font", gc_skin_font_subtitle, "fill-color-rgba", gc_skin_color_content, NULL); g_free(text); // OK gc_util_button_text_svg(rootitem, BOARDWIDTH * 0.5, y, "#BUTTON_TEXT", _("OK"), (GCallback) item_event_ok, "ok"); is_displayed = TRUE; }