diff --git a/Gtkmm3_Mac/CMakeLists.txt b/Gtkmm3_Mac/CMakeLists.txt index 0418885..3c6df2c 100644 --- a/Gtkmm3_Mac/CMakeLists.txt +++ b/Gtkmm3_Mac/CMakeLists.txt @@ -15,7 +15,7 @@ set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) include(CPack) include_directories(.) include_directories(..) -include_directories(src/core src/ui src/apps src/panels src/image_app) +include_directories(src/core src/ui src/apps src/panels src/image_app src/game24_app) find_package (PkgConfig REQUIRED) pkg_check_modules (GTKMM3 REQUIRED gtkmm-3.0) @@ -25,6 +25,7 @@ link_directories (${GTKMM3_LIBRARY_DIRS}) set(SOURCES src/core/main.cc src/core/MyWin.cc src/core/MyStack.cc src/cfgfile/cfgfile.cc src/ui/MyFinder.cc src/ui/MyPrefs.cc src/ui/MyDock.cc src/draw_app/drawing.cc src/file_app/FileWindow.cc src/game_app/Game.cc + src/game24_app/Game24.cc src/game24_app/Game24Win.cc src/image_app/ImageApp.cc src/image_app/MyImage.cc src/run_app/Runner.cc src/text_app/TextEditor.cc) @@ -38,6 +39,7 @@ set(RESOURCE_LIST STRIPBLANKS prefs_stack.ui STRIPBLANKS mydock.ui STRIPBLANKS game1.ui + STRIPBLANKS game24.ui style.css reset.css dock_style.css @@ -58,6 +60,8 @@ set(RESOURCE_LIST icons/48x48/actions/game_running.png icons/48x48/actions/btnabout.png icons/48x48/actions/My_GtkUI.png + icons/scalable/status/24game.svg + icons/scalable/status/24game_running.svg icons/scalable/status/audacious_whitesur.svg icons/scalable/status/my_prefs.svg icons/scalable/status/my_prefs_running.svg diff --git a/Gtkmm3_Mac/res/game24.ui b/Gtkmm3_Mac/res/game24.ui new file mode 100644 index 0000000..5d19930 --- /dev/null +++ b/Gtkmm3_Mac/res/game24.ui @@ -0,0 +1,389 @@ + + + + + + False + 440 + 260 + + + True + False + 5 + 5 + 5 + 5 + True + True + vertical + 10 + + + True + False + center + + + True + False + The Numbers: + + + False + True + 0 + + + + + True + False + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + Input answer, for example, ((6+6)+6)+6 is an answer, +"None" for no answer + center + + + False + True + 2 + + + + + True + True + True + + + False + True + 3 + + + + + + True + False + True + True + True + True + + + 7 + True + True + True + True + True + none + + + 0 + 0 + + + + + 8 + True + True + True + none + + + 1 + 0 + + + + + 9 + True + True + True + none + + + 2 + 0 + + + + + + + True + True + True + none + + + 3 + 0 + + + + + 4 + True + True + True + none + + + 0 + 1 + + + + + 5 + True + True + True + none + + + 1 + 1 + + + + + 6 + True + True + True + none + + + 2 + 1 + + + + + - + True + True + True + none + + + 3 + 1 + + + + + 1 + True + True + True + none + + + 0 + 2 + + + + + 2 + True + True + True + none + + + 1 + 2 + + + + + 3 + True + True + True + none + + + 2 + 2 + + + + + * + True + True + True + none + + + 3 + 2 + + + + + ( + True + True + True + none + + + 0 + 3 + + + + + 0 + True + True + True + none + + + 1 + 3 + + + + + ) + True + True + True + none + + + 2 + 3 + + + + + / + True + True + True + none + + + 3 + 3 + + + + + False + True + 4 + + + + + True + False + center + 10 + + + Start + True + True + True + + + False + True + 0 + + + + + Next + True + True + True + + + False + True + 1 + + + + + Check + True + True + True + + + False + True + 2 + + + + + Clear + True + True + True + + + False + True + 3 + + + + + Exit + True + True + True + + + False + True + 4 + + + + + False + True + 5 + + + + + + diff --git a/Gtkmm3_Mac/res/icons/scalable/status/24game.svg b/Gtkmm3_Mac/res/icons/scalable/status/24game.svg new file mode 100644 index 0000000..1e0f28f --- /dev/null +++ b/Gtkmm3_Mac/res/icons/scalable/status/24game.svg @@ -0,0 +1,58 @@ + + + + + + + + + 24 + + diff --git a/Gtkmm3_Mac/res/icons/scalable/status/24game_running.svg b/Gtkmm3_Mac/res/icons/scalable/status/24game_running.svg new file mode 100644 index 0000000..92acdb5 --- /dev/null +++ b/Gtkmm3_Mac/res/icons/scalable/status/24game_running.svg @@ -0,0 +1,65 @@ + + + + + + + + + 24 + + + diff --git a/Gtkmm3_Mac/res/mydock.ui b/Gtkmm3_Mac/res/mydock.ui index 0f1e8bd..51a5264 100644 --- a/Gtkmm3_Mac/res/mydock.ui +++ b/Gtkmm3_Mac/res/mydock.ui @@ -89,6 +89,20 @@ 48 my_trash + + True + False + 48 + 24game + 6 + + + True + False + 48 + 24game + 6 + True False @@ -294,6 +308,21 @@ 8 + + + True + True + True + image23 + none + True + + + False + True + 9 + + True @@ -302,7 +331,7 @@ False True - 9 + 10 @@ -317,7 +346,7 @@ False True - 10 + 11 @@ -332,9 +361,12 @@ False True - 11 + 12 + + + False @@ -613,7 +645,20 @@ - + + 24Game + True + True + True + image22 + none + top + True + + + 6 + 1 + diff --git a/Gtkmm3_Mac/src/apps/Game24Win.hh b/Gtkmm3_Mac/src/apps/Game24Win.hh new file mode 100644 index 0000000..da2daf0 --- /dev/null +++ b/Gtkmm3_Mac/src/apps/Game24Win.hh @@ -0,0 +1,34 @@ +#pragma once + +#include +#include "Game24.hh" + +class Game24Win : public Gtk::Window +{ +public: + static Game24Win *create(); + Game24Win(BaseObjectType *cobject, const Glib::RefPtr &ref_Glade); + +private: + // Main GtkBuilder + Glib::RefPtr ref_builder; + + // 24-Game Class + Game24 main_game; + int pos; + bool focused, winned; + Glib::ustring tmp; + + // Child widgets + Gtk::Entry *entry_ans; + Gtk::Label *label_numbers; + Gtk::Button *btns[16], *btnstart, *btnnext, *btncheck, *btnclear, *btnexit; + + // Signal Handlers + void btns_clicked(Gtk::Button *button); + void btnstart_clicked(); + void btnnext_clicked(); + void btncheck_clicked(); + void btnclear_clicked(); + void entry_ans_focus(); +}; \ No newline at end of file diff --git a/Gtkmm3_Mac/src/game24_app/Game24.cc b/Gtkmm3_Mac/src/game24_app/Game24.cc new file mode 100644 index 0000000..8bfc7d8 --- /dev/null +++ b/Gtkmm3_Mac/src/game24_app/Game24.cc @@ -0,0 +1,173 @@ +// Reference code: https://www.jb51.net/article/182079.htm +#include "Game24.hh" + +// Generate a number in [begin,end] +static double randnum(int begin = 0, int end = 1) +{ + return rand() % (end - begin + 1) + begin; +} + +// The Game Class +bool Game24::startgame(string user_result) +{ + bool winned = false; + + // Format result number + if (user_result != "") + { + if (user_result.length() < (*(result_strings.begin())).length()) + { + user_result = '(' + user_result + ')'; + } + } + + std::cout << user_result << std::endl; + + // Check user input and the results + if (count > 0) + { + for (std::vector::iterator it = result_strings.begin(); it != result_strings.end(); it++) + { + if (*it == user_result) + { + std::cout << "Winned!" << std::endl; + winned = true; + break; + } + else + { + continue; + } + } + } + else + { + if (user_result == "(None)") + { + winned = true; + } + } + + // If lost, output information + if (!winned) + { + std::cout << "Lost" << std::endl; + } + + return winned; +} + +void Game24::getnumbers() +{ + srand(time(NULL)); + for (int i = 0; i < n; i++) + { + // Get Number and output + number[i] = randnum(1, 13); + // std::cout << number[i] << " "; + + // Process number to string for display + switch ((int)number[i]) + { + case 10: + result[i] = "10"; + break; + case 11: + result[i] = "11"; + break; + case 12: + result[i] = "12"; + break; + case 13: + result[i] = "13"; + break; + default: + result[i] = '0' + number[i]; + } + } + // std::cout << std::endl; + + // Get the algorithm that can get the result + F(n); + // std::cout << "Has" << count << "Results" << std::endl; + sprintf(numbers_char, "%d %d %d %d", (int)number[0], (int)number[1], (int)number[2], (int)number[3]); +} + +void Game24::F(int n) +{ + // Calculate for three times + if (n == 1) + { + if (number[0] == 24) + { + // std::cout << result[0] << std::endl; + result_strings.push_back(result[0]); + count++; + } + } + + for (int i = 0; i < n; i++) + { + for (int j = i + 1; j < n; j++) + { + double a, b; + string x, y; + + // Save number + a = number[i]; + b = number[j]; + number[j] = number[n - 1]; + + // Save Result String + x = result[i]; + y = result[j]; + result[j] = result[n - 1]; + + // Add + number[i] = a + b; + result[i] = '(' + x + '+' + y + ')'; + F(n - 1); + + // Minus + number[i] = a - b; + result[i] = '(' + x + '-' + y + ')'; + F(n - 1); + number[i] = b - a; + result[i] = '(' + y + '-' + x + ')'; + F(n - 1); + + // multiply + number[i] = a * b; + result[i] = '(' + x + '*' + y + ')'; + F(n - 1); + + // divide + if (b != 0) + { + number[i] = a / b; + result[i] = '(' + x + '/' + y + ')'; + F(n - 1); + } + + if (a != 0) + { + number[i] = b / a; + result[i] = '(' + y + '/' + x + ')'; + F(n - 1); + } + + // if the result is not 24, make the numbers back + number[i] = a; + number[j] = b; + result[i] = x; + result[j] = y; + } + } +} + +// int main(int argc, char **argv) +// { +// Game24 game1; +// game1.startgame(); +// return 0; +// } diff --git a/Gtkmm3_Mac/src/game24_app/Game24.hh b/Gtkmm3_Mac/src/game24_app/Game24.hh new file mode 100644 index 0000000..4a8220a --- /dev/null +++ b/Gtkmm3_Mac/src/game24_app/Game24.hh @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include +#include + +typedef std::string string; + +class Game24 +{ +public: + bool startgame(string user_result); + void getnumbers(); + char numbers_char[20]; + +private: + const int n = 4; // Flag of third calculate + double number[4] = {0}; // Numbers + char oper[4] = {'+', '-', '*', '/'}; // operators + string result[4]; + int count = 0; + + std::vector result_strings; + + // Handlers + void F(int n); +}; diff --git a/Gtkmm3_Mac/src/game24_app/Game24Win.cc b/Gtkmm3_Mac/src/game24_app/Game24Win.cc new file mode 100644 index 0000000..f545923 --- /dev/null +++ b/Gtkmm3_Mac/src/game24_app/Game24Win.cc @@ -0,0 +1,124 @@ +#include "Game24Win.hh" + +Game24Win::Game24Win(BaseObjectType *cobject, const Glib::RefPtr &ref_Glade) + : Gtk::Window(cobject), + ref_builder(ref_Glade), + winned(true) +{ + set_icon_name("24game"); + + // Get Widgets + ref_builder->get_widget("label_numbers", label_numbers); + ref_builder->get_widget("entry_ans", entry_ans); + ref_builder->get_widget("btnstart", btnstart); + ref_builder->get_widget("btnnext",btnnext); + ref_builder->get_widget("btncheck", btncheck); + ref_builder->get_widget("btnclear",btnclear); + ref_builder->get_widget("btnexit", btnexit); + ref_builder->get_widget("btn0", btns[0]); + ref_builder->get_widget("btn1", btns[1]); + ref_builder->get_widget("btn2", btns[2]); + ref_builder->get_widget("btn3", btns[3]); + ref_builder->get_widget("btn4", btns[4]); + ref_builder->get_widget("btn5", btns[5]); + ref_builder->get_widget("btn6", btns[6]); + ref_builder->get_widget("btn7", btns[7]); + ref_builder->get_widget("btn8", btns[8]); + ref_builder->get_widget("btn9", btns[9]); + ref_builder->get_widget("btnadd", btns[10]); + ref_builder->get_widget("btnsubb", btns[11]); + ref_builder->get_widget("btnmul", btns[12]); + ref_builder->get_widget("btndiv", btns[13]); + ref_builder->get_widget("btnleft", btns[14]); + ref_builder->get_widget("btnright", btns[15]); + + // Link Signals + btnstart->signal_clicked().connect(sigc::mem_fun(*this, &Game24Win::btnstart_clicked)); + btnexit->signal_clicked().connect(sigc::mem_fun(*this, &Game24Win::hide)); + btnnext->signal_clicked().connect(sigc::mem_fun(*this, &Game24Win::btnnext_clicked)); + btncheck->signal_clicked().connect(sigc::mem_fun(*this, &Game24Win::btncheck_clicked)); + btnclear->signal_clicked().connect(sigc::mem_fun(*this,&Game24Win::btnclear_clicked)); + for (int i = 0; i < 16; i++) + { + btns[i]->signal_clicked().connect(sigc::bind(sigc::mem_fun(*this, &Game24Win::btns_clicked), btns[i])); + } + entry_ans->signal_grab_focus().connect(sigc::mem_fun(*this, &Game24Win::entry_ans_focus)); +} + +void Game24Win::btns_clicked(Gtk::Button *button) +{ + // Get Original text and add number from button + + // 1.Get text buffer for insert + auto buffer = entry_ans->get_buffer(); + + // 2.Get text to insert + Glib::ustring label = button->get_label(); + + if (focused) + { + pos = entry_ans->get_position(); + } + + // 3.Get Position + buffer->insert_text(pos, label); + pos++; + focused = false; +} + +void Game24Win::entry_ans_focus() +{ + focused = true; +} + +void Game24Win::btnstart_clicked() +{ + // Start Game + if (winned) + { + main_game.getnumbers(); + label_numbers->set_label(main_game.numbers_char); + } + else + { + label_numbers->set_label(tmp); + } + + // Save the numbers + tmp = label_numbers->get_label(); +} + +void Game24Win::btncheck_clicked() +{ + // Check Answer + Glib::ustring answer = entry_ans->get_text(); + winned = main_game.startgame(std::string(answer.c_str())); + if (winned) + { + label_numbers->set_label("You Winned!"); + } + else + { + label_numbers->set_label("You Lost!"); + } +} + +void Game24Win::btnnext_clicked(){ + main_game.getnumbers(); + label_numbers->set_label(main_game.numbers_char); +} + +void Game24Win::btnclear_clicked(){ + // Clear the text + entry_ans->set_text(""); +} + +Game24Win *Game24Win::create() +{ + // Create a new window + Game24Win *window = nullptr; + auto builder = Gtk::Builder::create_from_resource("/org/gtk/daleclack/game24.ui"); + builder->get_widget_derived("window", window); + + return window; +} \ No newline at end of file diff --git a/Gtkmm3_Mac/src/ui/MyDock.cc b/Gtkmm3_Mac/src/ui/MyDock.cc index 3253100..b2c655b 100644 --- a/Gtkmm3_Mac/src/ui/MyDock.cc +++ b/Gtkmm3_Mac/src/ui/MyDock.cc @@ -16,6 +16,7 @@ MyDock::MyDock(BaseObjectType *cobject, const Glib::RefPtr &ref_Gl ref_builder->get_widget("btnedit", btnedit); ref_builder->get_widget("btnimage", btnimage); ref_builder->get_widget("btnset", btnset); + ref_builder->get_widget("btngame24",btngame24); ref_builder->get_widget("separator_start", separator_start); ref_builder->get_widget("separator_end", separator_end); ref_builder->get_widget("launchpad_stack", launchpad_stack); @@ -35,9 +36,11 @@ MyDock::MyDock(BaseObjectType *cobject, const Glib::RefPtr &ref_Gl ref_builder->get_widget("padimage", padimage); ref_builder->get_widget("padedit", padedit); ref_builder->get_widget("padrun", padrun); + ref_builder->get_widget("padgame24",padgame24); // Create window game_win = Game::create(); + game24_win = Game24Win::create(); // Link signals btnlaunch->signal_clicked().connect(sigc::mem_fun(*this, &MyDock::btnlaunch_clicked)); @@ -65,6 +68,11 @@ MyDock::MyDock(BaseObjectType *cobject, const Glib::RefPtr &ref_Gl game_win->signal_delete_event().connect(sigc::mem_fun(*this, &MyDock::game_win_closed)); game_win->signal_hide().connect(sigc::mem_fun(*this, &MyDock::game_win_hide)); + btngame24->signal_clicked().connect(sigc::mem_fun(*this,&MyDock::btngame24_clicked)); + padgame24->signal_clicked().connect(sigc::mem_fun(*this,&MyDock::padgame24_clicked)); + game24_win->signal_delete_event().connect(sigc::mem_fun(*this,&MyDock::game24_win_closed)); + game24_win->signal_hide().connect(sigc::mem_fun(*this,&MyDock::game24_win_hide)); + btnimage->signal_clicked().connect(sigc::mem_fun(*this, &MyDock::btnimage_clicked)); padimage->signal_clicked().connect(sigc::mem_fun(*this, &MyDock::padimage_clicked)); image_win.signal_delete_event().connect(sigc::mem_fun(*this, &MyDock::image_win_closed)); @@ -128,6 +136,7 @@ void MyDock::mydock_init(Gtk::Window *window, Gtk::Image *background1) void MyDock::padaud_clicked() { + // Start audacious app std::thread first(system, "audacious"); first.detach(); btnlaunch_clicked(); @@ -135,6 +144,7 @@ void MyDock::padaud_clicked() void MyDock::padgedit_clicked() { + // Start gedit app std::thread second(system, "gedit"); second.detach(); btnlaunch_clicked(); @@ -142,6 +152,7 @@ void MyDock::padgedit_clicked() void MyDock::padvlc_clicked() { + // Start vlc app std::thread third(system, "vlc"); third.detach(); btnlaunch_clicked(); @@ -149,6 +160,7 @@ void MyDock::padvlc_clicked() void MyDock::padvlc_win32_clicked() { + // Start vlc on windows std::thread fourth(system, "start notepad"); fourth.detach(); btnlaunch_clicked(); @@ -156,6 +168,7 @@ void MyDock::padvlc_win32_clicked() void MyDock::padnote_clicked() { + // Start Notepad on windows std::thread fifth(system, "start ..\\vlc\\vlc.exe"); fifth.detach(); btnlaunch_clicked(); @@ -163,6 +176,7 @@ void MyDock::padnote_clicked() bool MyDock::prefs_win_closed(GdkEventAny *event) { + // Handle the "closed" signal of preference window btnset->set_image_from_icon_name("my_prefs", Gtk::ICON_SIZE_DIALOG); prefs_win.hide(); return true; @@ -170,17 +184,21 @@ bool MyDock::prefs_win_closed(GdkEventAny *event) void MyDock::btnset_clicked() { + // Show settings window (preferences) btnset->set_image_from_icon_name("my_prefs_running", Gtk::ICON_SIZE_DIALOG); window_ctrl(prefs_win); } void MyDock::padset_clicked() { + // Function for button on launchpad btnset->set_image_from_icon_name("my_prefs_running", Gtk::ICON_SIZE_DIALOG); window_ctrl(prefs_win, false); btnlaunch_clicked(); } +//Signal Handlers for drawing app window + bool MyDock::draw_win_closed(GdkEventAny *event) { btndraw->set_image_from_icon_name("drawing_app", Gtk::ICON_SIZE_DIALOG); @@ -201,6 +219,8 @@ void MyDock::paddraw_clicked() btnlaunch_clicked(); } +// Signal Handlers for file window + bool MyDock::file_win_closed(GdkEventAny *event) { btnfiles->set_image_from_icon_name("file-app", Gtk::ICON_SIZE_DIALOG); @@ -213,6 +233,7 @@ void MyDock::btnfile_clicked() btnfiles->set_image_from_icon_name("file-app_running", Gtk::ICON_SIZE_DIALOG); window_ctrl(file_app); } + void MyDock::padfile_clicked() { btnfiles->set_image_from_icon_name("file-app_running", Gtk::ICON_SIZE_DIALOG); @@ -220,6 +241,8 @@ void MyDock::padfile_clicked() btnlaunch_clicked(); } +// Signal Handlers for game window + bool MyDock::game_win_closed(GdkEventAny *event) { btngame->set_image_from_icon_name("game", Gtk::ICON_SIZE_DIALOG); @@ -246,6 +269,32 @@ void MyDock::padgame_clicked() btnlaunch_clicked(); } +// Signal Handlers for game24 window + +bool MyDock::game24_win_closed(GdkEventAny *event){ + btngame24->set_image_from_icon_name("24game",Gtk::ICON_SIZE_DIALOG); + game24_win->hide(); + return true; +} + +void MyDock::btngame24_clicked(){ + btngame24->set_image_from_icon_name("24game_running",Gtk::ICON_SIZE_DIALOG); + window_ctrl(*game24_win); +} + +void MyDock::padgame24_clicked(){ + btngame24->set_image_from_icon_name("24game_running",Gtk::ICON_SIZE_DIALOG); + window_ctrl(*game24_win,false); + btnlaunch_clicked(); +} + +void MyDock::game24_win_hide(){ + btngame24->set_image_from_icon_name("24game",Gtk::ICON_SIZE_DIALOG); + game24_win->hide(); +} + +// Signal Handlers for image app window + bool MyDock::image_win_closed(GdkEventAny *event) { btnimage->set_image_from_icon_name("image_app", Gtk::ICON_SIZE_DIALOG); @@ -258,6 +307,7 @@ void MyDock::btnimage_clicked() btnimage->set_image_from_icon_name("image_app_running", Gtk::ICON_SIZE_DIALOG); window_ctrl(image_win); } + void MyDock::padimage_clicked() { btnimage->set_image_from_icon_name("image_app_running", Gtk::ICON_SIZE_DIALOG); @@ -265,6 +315,8 @@ void MyDock::padimage_clicked() btnlaunch_clicked(); } +// Signal Handlers for editor window + bool MyDock::editor_win_closed(GdkEventAny *event) { btnedit->set_image_from_icon_name("my_textedit", Gtk::ICON_SIZE_DIALOG); @@ -277,6 +329,7 @@ void MyDock::btnedit_clicked() btnedit->set_image_from_icon_name("my_textedit_running", Gtk::ICON_SIZE_DIALOG); window_ctrl(editor_win); } + void MyDock::padedit_clicked() { btnedit->set_image_from_icon_name("my_textedit_running", Gtk::ICON_SIZE_DIALOG); @@ -284,6 +337,8 @@ void MyDock::padedit_clicked() btnlaunch_clicked(); } +// Signal Handler for run window + void MyDock::btnrun_clicked() { runner1.show(); diff --git a/Gtkmm3_Mac/src/ui/MyDock.hh b/Gtkmm3_Mac/src/ui/MyDock.hh index db329a2..d98c414 100644 --- a/Gtkmm3_Mac/src/ui/MyDock.hh +++ b/Gtkmm3_Mac/src/ui/MyDock.hh @@ -9,6 +9,7 @@ #include "ImageApp.hh" #include "Runner.hh" #include "TextEditor.hh" +#include "Game24Win.hh" enum class DockMode{ MODE_DOCK, @@ -28,7 +29,7 @@ private: // Child widgets Gtk::Box *finder_box, *dock_box; Gtk::Button *btnlaunch, *btndraw, *btnfiles, - *btngame, *btnedit, *btnimage, *btnset; + *btngame, *btnedit, *btnimage, *btnset, *btngame24; Gtk::Separator *separator_start, *separator_end; // Finder @@ -39,7 +40,7 @@ private: Gtk::Stack *launchpad_stack; Gtk::Grid *default_page, *launchpad_page, *apps_grid; Gtk::Button *padaud, *paddraw, *padfile, *padgedit, *padgame, *padset, - *padimage, *padnote, *padedit, *padvlc, *padvlc_win32, *padrun; + *padimage, *padnote, *padedit, *padvlc, *padvlc_win32, *padrun, *padgame24; Gtk::Label label1; // Window Preferences @@ -66,6 +67,13 @@ private: void btngame_clicked(); void padgame_clicked(); + // 24-Game + Game24Win *game24_win; + bool game24_win_closed(GdkEventAny *event); + void game24_win_hide(); + void btngame24_clicked(); + void padgame24_clicked(); + // Image Viewer ImageApp image_win; bool image_win_closed(GdkEventAny *event);