📄 main.c
字号:
/*************************************************************************** * main.c * * Fri Sep 23 08:46:05 2005 * Copyright 2005 Alpher * Email: alpher_zmx@yahoo.com.cn ****************************************************************************//* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#include "../config.h"#include "main.h"/* creat menus*/voidget_main_menu( GtkWidget *window, GtkWidget **menubar){ GtkAccelGroup *accel_group; GtkWidget *menu1,*menu2,*menu3,*menuitem,*rootmenu; accel_group = gtk_accel_group_new(); gtk_window_add_accel_group (GTK_WINDOW (window), accel_group); *menubar = gtk_menu_bar_new(); menu1 = gtk_menu_new(); /*Game*/ menu2 = gtk_menu_new(); /*Single*/ menuitem = gtk_menu_item_new_with_mnemonic(_("_Easy")); gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem); gtk_widget_add_accelerator (menuitem, "activate", accel_group,GDK_F1, 0, GTK_ACCEL_VISIBLE); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(ui_game_begin),(gpointer)1); menuitem = gtk_menu_item_new_with_mnemonic(_("_Normal")); gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem); gtk_widget_add_accelerator (menuitem, "activate", accel_group,GDK_F2, 0, GTK_ACCEL_VISIBLE); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(ui_game_begin),(gpointer)2); menuitem = gtk_menu_item_new_with_mnemonic(_("_Hard")); gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem); gtk_widget_add_accelerator (menuitem, "activate", accel_group,GDK_F3, 0, GTK_ACCEL_VISIBLE); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(ui_game_begin),(gpointer)3); menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem); menuitem = gtk_menu_item_new_with_mnemonic(_("_Resume")); gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem); gtk_widget_add_accelerator (menuitem, "activate", accel_group,GDK_F4, 0, GTK_ACCEL_VISIBLE); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(ui_game_begin),(gpointer)4); menuitem = gtk_menu_item_new_with_mnemonic(_("_Single")); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem),menu2); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); menu2 = gtk_menu_new(); menuitem = gtk_menu_item_new_with_mnemonic(_("_Easy")); gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(print_hello),(gpointer)1); menuitem = gtk_menu_item_new_with_mnemonic(_("_Normal")); gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(print_hello),(gpointer)2); menuitem = gtk_menu_item_new_with_mnemonic(_("_Hard")); gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(print_hello),(gpointer)3); menuitem = gtk_menu_item_new_with_mnemonic(_("_Two")); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem),menu2); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); /* Two not available*/ gtk_widget_set_sensitive (GTK_WIDGET (menuitem), FALSE); menu2 = gtk_menu_new(); menu3 = gtk_menu_new(); menuitem = gtk_menu_item_new_with_mnemonic(_("_Easy")); gtk_menu_shell_append(GTK_MENU_SHELL(menu3),menuitem); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(print_hello),(gpointer)1); menuitem = gtk_menu_item_new_with_mnemonic(_("_Normal")); gtk_menu_shell_append(GTK_MENU_SHELL(menu3),menuitem); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(print_hello),(gpointer)2); menuitem = gtk_menu_item_new_with_mnemonic(_("_Hard")); gtk_menu_shell_append(GTK_MENU_SHELL(menu3),menuitem); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(print_hello),(gpointer)3); menuitem = gtk_menu_item_new_with_mnemonic(_("_Server")); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem),menu3); gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem); menuitem = gtk_menu_item_new_with_mnemonic(_("_Client")); gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(print_hello),(gpointer)0); menuitem = gtk_menu_item_new_with_mnemonic(_("_Network")); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem),menu2); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); /* Network not available */ gtk_widget_set_sensitive (GTK_WIDGET (menuitem), FALSE); menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); menuitem = gtk_menu_item_new_with_mnemonic(_("_Giveup")); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); gtk_widget_add_accelerator (menuitem, "activate", accel_group,GDK_F12, 0, GTK_ACCEL_VISIBLE); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(ui_game_giveup),(gpointer)0); menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT,accel_group); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(gtk_main_quit),(gpointer)0); rootmenu = gtk_menu_item_new_with_mnemonic(_("_Game")); gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),menu1); gtk_menu_shell_append(GTK_MENU_SHELL(*menubar),rootmenu); g_signal_connect (G_OBJECT (menu1), "show", G_CALLBACK (ui_game_on_show), NULL); /*============================================================*/ menu1 = gtk_menu_new(); menuitem = gtk_menu_item_new_with_mnemonic(_("_Hint")); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); gtk_widget_add_accelerator (menuitem, "activate", accel_group,GDK_F5, 0, GTK_ACCEL_VISIBLE); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(ui_game_hint),(gpointer)0); menuitem = gtk_menu_item_new_with_mnemonic(_("_Shuffle")); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); gtk_widget_add_accelerator (menuitem, "activate", accel_group,GDK_F6, 0, GTK_ACCEL_VISIBLE); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(ui_game_shuffle),(gpointer)0); menuitem = gtk_menu_item_new_with_mnemonic(_("_Pause/Proceed")); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); gtk_widget_add_accelerator (menuitem, "activate", accel_group,GDK_F7, 0, GTK_ACCEL_VISIBLE); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(ui_game_pause),(gpointer)0); menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); menuitem = gtk_menu_item_new_with_mnemonic(_("H_ide")); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); gtk_widget_add_accelerator (menuitem, "activate", accel_group,GDK_Escape, 0, GTK_ACCEL_VISIBLE); /* Hide menuitem's activeate event is connected in the main function, not here. g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(ui_game_giveup),(gpointer)0); */ menuitem = gtk_menu_item_new_with_mnemonic(_("_Theme Edit Tools")); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(ui_theme_editor),(gpointer)0); rootmenu = gtk_menu_item_new_with_mnemonic(_("_Functions")); gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),menu1); gtk_menu_shell_append(GTK_MENU_SHELL(*menubar),rootmenu); g_signal_connect (G_OBJECT (menu1), "show", G_CALLBACK (ui_functions_on_show), NULL); /*============================================================*/ menu1 = gtk_menu_new(); menuitem = gtk_menu_item_new_with_mnemonic(_("_Themes")); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); ui_menu_item.themes = GTK_MENU_ITEM (menuitem); ui_menu_item.background_music = GTK_CHECK_MENU_ITEM (gtk_check_menu_item_new_with_mnemonic(_("_Music"))); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),GTK_WIDGET (ui_menu_item.background_music)); g_signal_connect(G_OBJECT(ui_menu_item.background_music),"activate",G_CALLBACK(ui_use_m_s_bg),(gpointer)0); ui_menu_item.sound_effect = GTK_CHECK_MENU_ITEM (gtk_check_menu_item_new_with_mnemonic(_("_Sound"))); gtk_menu_shell_append(GTK_MENU_SHELL(menu1), GTK_WIDGET (ui_menu_item.sound_effect)); g_signal_connect(G_OBJECT(ui_menu_item.sound_effect),"activate",G_CALLBACK(ui_use_m_s_bg),(gpointer)1); ui_menu_item.background_picture = GTK_CHECK_MENU_ITEM (gtk_check_menu_item_new_with_mnemonic(_("_Background Picture"))); gtk_menu_shell_append(GTK_MENU_SHELL(menu1), GTK_WIDGET (ui_menu_item.background_picture)); g_signal_connect(G_OBJECT(ui_menu_item.background_picture),"activate",G_CALLBACK(ui_use_m_s_bg),(gpointer)2); menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); menuitem = gtk_menu_item_new_with_mnemonic(_("_Cheat")); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); gtk_widget_add_accelerator (menuitem, "activate", accel_group,GDK_F8, 0, GTK_ACCEL_VISIBLE); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(ui_game_cheat),(gpointer)0); rootmenu = gtk_menu_item_new_with_mnemonic(_("_Setting")); gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),menu1); gtk_menu_shell_append(GTK_MENU_SHELL(*menubar),rootmenu); g_signal_connect (G_OBJECT (menu1), "show", G_CALLBACK (ui_setting_on_show), NULL); /*============================================================*/ menu1 = gtk_menu_new(); menuitem = gtk_menu_item_new_with_mnemonic(_("_View Scores")); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); gtk_widget_add_accelerator (menuitem, "activate", accel_group,GDK_F9, 0, GTK_ACCEL_VISIBLE); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(ui_view_score),(gpointer)0); menuitem = gtk_menu_item_new_with_mnemonic(_("_Internet Scores")); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); /* Internet score not available */ gtk_widget_set_sensitive (GTK_WIDGET (menuitem), FALSE); rootmenu = gtk_menu_item_new_with_mnemonic(_("S_core")); gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),menu1); gtk_menu_shell_append(GTK_MENU_SHELL(*menubar),rootmenu); /*============================================================*/ menu1 = gtk_menu_new(); menuitem = gtk_menu_item_new_with_mnemonic(_("_Rules")); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(ui_rule),(gpointer)0); menuitem = gtk_menu_item_new_with_mnemonic(_("_Author")); gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem); g_signal_connect(G_OBJECT(menuitem),"activate",G_CALLBACK(ui_about),(gpointer)0); rootmenu = gtk_menu_item_new_with_mnemonic(_("_About")); gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),menu1); gtk_menu_shell_append(GTK_MENU_SHELL(*menubar),rootmenu); /*============================================================*/ gtk_widget_show_all(*menubar);}/* empty call back funtion, use for testing no need to translate these strings*/static voidprint_hello( GtkWidget *w, gpointer data ){ g_print ("data returned %d \n",GPOINTER_TO_INT(data));}void ui_hide_window (GtkWidget *w, gpointer data){ LlkTray *tray = (LlkTray *)data; /* show/hidden man window */ if (tray->status == SHOW) { tray->status = HIDDEN; gtk_widget_hide_all (GTK_WIDGET (tray->window_main)); } else { tray->status = SHOW; gtk_widget_show_all (GTK_WIDGET (tray->window_main)); }}/* * set sensitive of the Game menu */voidui_game_on_show (GtkWidget *w, gpointer data){ gtk_widget_set_sensitive (g_list_nth_data (GTK_MENU(w)->menu_shell.children,0), algorithm_game.status == ALGORITHM_GAME_STOP); gtk_widget_set_sensitive (g_list_nth_data (GTK_MENU(w)->menu_shell.children,4), algorithm_game.status != ALGORITHM_GAME_STOP);}/* * set sensitive of the Functions menu */void ui_functions_on_show (GtkWidget *w, gpointer data){ gtk_widget_set_sensitive (g_list_nth_data (GTK_MENU(w)->menu_shell.children,0), algorithm_game.status == ALGORITHM_GAME_RUN); gtk_widget_set_sensitive (g_list_nth_data (GTK_MENU(w)->menu_shell.children,1), algorithm_game.status == ALGORITHM_GAME_RUN); gtk_widget_set_sensitive (g_list_nth_data (GTK_MENU(w)->menu_shell.children,2), algorithm_game.status != ALGORITHM_GAME_STOP);}/* * set sensitive of the Setting menu */voidui_setting_on_show (GtkWidget *w, gpointer data){ //g_print ("menu setting on show.\n");}/* replace with new image at (i,j)*/gboolean ui_replace_image(struct AlgorithmPoint p1,struct AlgorithmPoint p2){ GdkRectangle update_rect; /*according to data in algorithm_game and the selected position, redraw the image at (i,j) this function is modified from ui_game_begin function //(algorithm_game.data[p1.x][p1.y] - 1) */ /* Draw card back image */ gdk_pixbuf_render_to_drawable_alpha(ui_pixbuf.cardbacks,ui_double_pixmap, 0,(ui_pixbuf.cardback_choice>=5?1:ui_pixbuf.cardback_choice+1)*UI_BACK_HEIGHT, UI_FIXED_START_DRAW_LEFT + (p1.y - algorithm_game.difficulty)*(UI_BACK_WIDTH-UI_BACK_BORDER_1), UI_FIXED_START_DRAW_TOP + p1.x*(UI_BACK_HEIGHT - UI_BACK_BORDER_2), UI_BACK_WIDTH-UI_BACK_BORDER_1,UI_BACK_HEIGHT-UI_BACK_BORDER_2, GDK_PIXBUF_ALPHA_BILEVEL,128, GDK_RGB_DITHER_NORMAL, 0, 0); /*gdk_draw_rectangle (ui_double_pixmap, ui_drawingarea->style->black_gc, TRUE, UI_FIXED_START_DRAW_LEFT + (p1.y - algorithm_game.difficulty)*(UI_BACK_WIDTH-UI_BACK_BORDER_1), UI_FIXED_START_DRAW_TOP + p1.x*(UI_BACK_HEIGHT - UI_BACK_BORDER_2), UI_BACK_WIDTH-UI_BACK_BORDER_1,UI_BACK_HEIGHT-UI_BACK_BORDER_2);*/ /* Draw card's front image */ gdk_pixbuf_render_to_drawable_alpha(ui_pixbuf.cardimages,ui_double_pixmap, (algorithm_game.data[p1.x][p1.y] - 1)*UI_IMAGE_SIZE,0, UI_FIXED_START_DRAW_LEFT + (p1.y - algorithm_game.difficulty)*(UI_BACK_WIDTH-UI_BACK_BORDER_1) + (UI_BACK_WIDTH-UI_BACK_BORDER_1-UI_IMAGE_SIZE)/2, UI_FIXED_START_DRAW_TOP + p1.x*(UI_BACK_HEIGHT - UI_BACK_BORDER_2)+ (UI_BACK_HEIGHT-UI_BACK_BORDER_2-UI_IMAGE_SIZE)/2, UI_IMAGE_SIZE,UI_IMAGE_SIZE, GDK_PIXBUF_ALPHA_BILEVEL,128, GDK_RGB_DITHER_NORMAL, 0, 0); update_rect.x = UI_FIXED_START_DRAW_LEFT + (p1.y - algorithm_game.difficulty)*(UI_BACK_WIDTH - UI_BACK_BORDER_1); update_rect.y = UI_FIXED_START_DRAW_TOP + p1.x*(UI_BACK_HEIGHT - UI_BACK_BORDER_2); update_rect.width = UI_BACK_WIDTH-UI_BACK_BORDER_1; update_rect.height = UI_BACK_HEIGHT-UI_BACK_BORDER_2; gtk_widget_draw (ui_drawingarea, &update_rect); if(p2.x != -1 && p2.y != -1) { /* Draw card back image */ gdk_pixbuf_render_to_drawable_alpha(ui_pixbuf.cardbacks,ui_double_pixmap, 0,(ui_pixbuf.cardback_choice>=5?1:ui_pixbuf.cardback_choice+1)*UI_BACK_HEIGHT, UI_FIXED_START_DRAW_LEFT + (p2.y - algorithm_game.difficulty)*(UI_BACK_WIDTH-UI_BACK_BORDER_1), UI_FIXED_START_DRAW_TOP + p2.x*(UI_BACK_HEIGHT - UI_BACK_BORDER_2), UI_BACK_WIDTH-UI_BACK_BORDER_1,UI_BACK_HEIGHT-UI_BACK_BORDER_2, GDK_PIXBUF_ALPHA_BILEVEL,128, GDK_RGB_DITHER_NORMAL, 0, 0); /*gdk_draw_rectangle (ui_double_pixmap, ui_drawingarea->style->black_gc, TRUE, UI_FIXED_START_DRAW_LEFT + (p2.y - algorithm_game.difficulty)*(UI_BACK_WIDTH-UI_BACK_BORDER_1), UI_FIXED_START_DRAW_TOP + p2.x*(UI_BACK_HEIGHT - UI_BACK_BORDER_2), UI_BACK_WIDTH-UI_BACK_BORDER_1,UI_BACK_HEIGHT-UI_BACK_BORDER_2);*/ /* Draw card's front image */ gdk_pixbuf_render_to_drawable_alpha(ui_pixbuf.cardimages,ui_double_pixmap, (algorithm_game.data[p2.x][p2.y] - 1)*UI_IMAGE_SIZE,0, UI_FIXED_START_DRAW_LEFT + (p2.y - algorithm_game.difficulty)*(UI_BACK_WIDTH-UI_BACK_BORDER_1) + (UI_BACK_WIDTH-UI_BACK_BORDER_1-UI_IMAGE_SIZE)/2, UI_FIXED_START_DRAW_TOP + p2.x*(UI_BACK_HEIGHT - UI_BACK_BORDER_2)+ (UI_BACK_HEIGHT-UI_BACK_BORDER_2-UI_IMAGE_SIZE)/2, UI_IMAGE_SIZE,UI_IMAGE_SIZE, GDK_PIXBUF_ALPHA_BILEVEL,128, GDK_RGB_DITHER_NORMAL, 0, 0); update_rect.x = UI_FIXED_START_DRAW_LEFT + (p2.y - algorithm_game.difficulty)*(UI_BACK_WIDTH - UI_BACK_BORDER_1); update_rect.y = UI_FIXED_START_DRAW_TOP + p2.x*(UI_BACK_HEIGHT - UI_BACK_BORDER_2); update_rect.width = UI_BACK_WIDTH-UI_BACK_BORDER_1; update_rect.height = UI_BACK_HEIGHT-UI_BACK_BORDER_2; gtk_widget_draw (ui_drawingarea, &update_rect); } return TRUE;}/* redraw all card images according to datas in algorithm_game*/gboolean ui_redraw_images(void){ GdkRectangle update_rect; gint i,j; /*redraw background picture*/ ui_drawingarea_draw_bg(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -