Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define DEBUG_MODE FALSE
- #define PROGRAM_NAME "Puzzle Launcher"
- #define PROGRAM_VERSION "1.0"
- #define PUZZLES "Blackbox:blackbox.puzzle|Bridges:bridges|Cube:cube|Dominosa:dominosa|Fifteen:fifteen|Filling:filling|Flip:flip|Galaxies:galaxies|Guess:guess|Inertia:inertia|Keen:keen|Lightup:lightup|Loopy:loopy|Magnets:magnets|Map:map|Mines:mines|Net:net.puzzle|Netslide:netslide|Pattern:pattern|Pearl:pearl|Pegs:pegs|Range:range|Rect:rect|Samegame:samegame|Signpost:signpost|Singles:singles|Sixteen:sixteen|Slant:slant|Solo:solo|Tents:tents|Towers:towers|Twiddle:twiddle|Undead:undead|Unequal:unequal|Unruly:unruly|Untangle:untangle.puzzle"
- #define RU_VER "вер."
- #define RU_PUZZLE "Головоломка"
- #define RU_LAUNCH_SELECTED "Запуск"
- #define RU_LAUNCH_RANDOM "Случайный"
- #define RU_DBG_PUZZLE_FULL_STRING_GET "Получена полная строка головоломок"
- #define RU_DBG_PUZZLE_COUNT_GET "Количество головоломок"
- #define RU_DBG_PUZZLE_INFO_GET "Информация о головоломках собрана"
- #define RU_DBG_PUZZLE_NAME "Название"
- #define RU_DBG_PUZZLE_EXEC "Команда"
- #define _GNU_SOURCE
- #include <stdlib.h>
- #include <stdio.h>
- #include <stdbool.h>
- #include <inttypes.h>
- #include <gtk/gtk.h>
- #include <time.h>
- struct puzzle_info
- {
- char* name;
- char* exec;
- };
- struct puzzle_info_statistic
- {
- uint8_t name_length;
- uint8_t exec_length;
- };
- bool main(uint8_t arguments_count, char* arguments_value[]);
- void debug_test(void);
- void set_puzzle_data(void);
- void configure_ui(void);
- void puzzle_list_view_cursor_changed(void);
- void launch_selected_button_clicked(void);
- void launch_random_button_clicked(void);
- struct puzzle_info* puzzle_info_array;
- uint8_t puzzle_count, current_list_position;
- int16_t launch_code;
- uint16_t iter_0, iter_1, iter_2;
- GtkWidget* main_window,* vertical_box,* puzzle_list_container,* puzzle_list_view,* launch_selected_button,* launch_random_button;
- GtkListStore* puzzle_list_store;
- GtkTreeIter iter;
- bool main(uint8_t arguments_count, char* arguments_value[])
- {
- printf("%s %s %s\n", PROGRAM_NAME, RU_VER, PROGRAM_VERSION);
- if(DEBUG_MODE)
- {
- debug_test();
- }
- launch_code=-1;
- set_puzzle_data();
- gtk_init((int*)&arguments_count, &arguments_value);
- configure_ui();
- gtk_main();
- if(launch_code>=0)
- {
- system(puzzle_info_array[launch_code].exec);
- }
- exit(EXIT_SUCCESS);
- return FALSE;
- }
- void debug_test(void)
- {
- return;
- }
- void set_puzzle_data(void)
- {
- char* puzzle_full_string;
- struct puzzle_info_statistic* puzzle_info_statistic_array;
- asprintf(&puzzle_full_string, "%s\0", PUZZLES);
- if(DEBUG_MODE)
- {
- printf("\n\n\n%s:\n%s\n\n\n", RU_DBG_PUZZLE_FULL_STRING_GET, puzzle_full_string);
- }
- for(iter_0=0, puzzle_count=1; puzzle_full_string[iter_0]!='\0'; iter_0++)
- {
- if(puzzle_full_string[iter_0]=='|')
- {
- puzzle_count++;
- }
- }
- if(DEBUG_MODE)
- {
- printf("\n\n\n%s: %u\n\n\n", RU_DBG_PUZZLE_COUNT_GET, puzzle_count);
- }
- puzzle_info_statistic_array=malloc(sizeof(struct puzzle_info_statistic)*puzzle_count);
- iter_1=0;
- for(iter_0=0; iter_0<puzzle_count; iter_0++)
- {
- puzzle_info_statistic_array[iter_0].name_length=0;
- puzzle_info_statistic_array[iter_0].exec_length=0;
- for(; puzzle_full_string[iter_1]!=':'; iter_1++)
- {
- puzzle_info_statistic_array[iter_0].name_length++;
- }
- for(iter_1++; puzzle_full_string[iter_1]!='|'; iter_1++)
- {
- puzzle_info_statistic_array[iter_0].exec_length++;
- }
- iter_1++;
- }
- puzzle_info_array=malloc(sizeof(struct puzzle_info)*puzzle_count);
- iter_2=0;
- for(iter_0=0; iter_0<puzzle_count; iter_0++)
- {
- puzzle_info_array[iter_0].name=malloc(sizeof(char)*puzzle_info_statistic_array[iter_0].name_length+1);
- puzzle_info_array[iter_0].exec=malloc(sizeof(char)*puzzle_info_statistic_array[iter_0].exec_length+1);
- for(iter_1=0; iter_1<puzzle_info_statistic_array[iter_0].name_length; iter_1++)
- {
- puzzle_info_array[iter_0].name[iter_1]=puzzle_full_string[iter_2++];
- }
- iter_2++;
- puzzle_info_array[iter_0].name[iter_1]='\0';
- for(iter_1=0; iter_1<puzzle_info_statistic_array[iter_0].exec_length; iter_1++)
- {
- puzzle_info_array[iter_0].exec[iter_1]=puzzle_full_string[iter_2++];
- }
- iter_2++;
- puzzle_info_array[iter_0].exec[iter_1]='\0';
- }
- if(DEBUG_MODE)
- {
- printf("\n\n\n%s:\n", RU_DBG_PUZZLE_INFO_GET);
- for(iter_0=0; iter_0<puzzle_count; iter_0++)
- {
- printf("\n%s: %s\n%s: %s\n", RU_DBG_PUZZLE_NAME, puzzle_info_array[iter_0].name, RU_DBG_PUZZLE_EXEC, puzzle_info_array[iter_0].exec);
- }
- printf("\n\n\n");
- }
- free(puzzle_info_statistic_array);
- free(puzzle_full_string);
- }
- void configure_ui(void)
- {
- puzzle_list_store=gtk_list_store_new(1, G_TYPE_STRING);
- for(iter_0=0; iter_0<puzzle_count; iter_0++)
- {
- gtk_list_store_append (puzzle_list_store, &iter);
- gtk_list_store_set(puzzle_list_store, &iter, 0, puzzle_info_array[iter_0].name, -1);
- }
- main_window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- vertical_box=gtk_vbox_new(FALSE,0);
- puzzle_list_container=gtk_scrolled_window_new(NULL, NULL);
- puzzle_list_view=gtk_tree_view_new_with_model((GtkTreeModel*)puzzle_list_store);
- launch_selected_button=gtk_button_new_with_label(RU_LAUNCH_SELECTED);
- launch_random_button=gtk_button_new_with_label(RU_LAUNCH_RANDOM);
- gtk_window_set_default_size((GtkWindow*)main_window, 240, 320);
- gtk_window_set_title((GtkWindow*)main_window, PROGRAM_NAME);
- gtk_window_set_position((GtkWindow*)main_window, GTK_WIN_POS_CENTER);
- gtk_scrolled_window_set_policy((GtkScrolledWindow*)puzzle_list_container, GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
- gtk_tree_view_append_column((GtkTreeView*)puzzle_list_view, gtk_tree_view_column_new_with_attributes(RU_PUZZLE, gtk_cell_renderer_text_new(), "text", 0, NULL));
- gtk_tree_view_set_grid_lines((GtkTreeView*)puzzle_list_view, GTK_TREE_VIEW_GRID_LINES_HORIZONTAL);
- gtk_box_pack_start((GtkBox*)vertical_box, puzzle_list_container, TRUE, TRUE, 0);
- gtk_box_pack_start((GtkBox*)vertical_box, launch_selected_button, FALSE, TRUE, 0);
- gtk_box_pack_start((GtkBox*)vertical_box, launch_random_button, FALSE, TRUE, 0);
- gtk_container_add(GTK_CONTAINER(main_window), vertical_box);
- gtk_container_add(GTK_CONTAINER(puzzle_list_container), puzzle_list_view);
- gtk_signal_connect(GTK_OBJECT(main_window), "delete-event", GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
- gtk_signal_connect(GTK_OBJECT(puzzle_list_view), "cursor-changed", GTK_SIGNAL_FUNC(puzzle_list_view_cursor_changed), NULL);
- gtk_signal_connect(GTK_OBJECT(launch_selected_button), "clicked", GTK_SIGNAL_FUNC(launch_selected_button_clicked), NULL);
- gtk_signal_connect(GTK_OBJECT(launch_random_button), "clicked", GTK_SIGNAL_FUNC(launch_random_button_clicked), NULL);
- gtk_widget_set_sensitive(launch_selected_button, FALSE);
- gtk_widget_show(main_window);
- gtk_widget_show(vertical_box);
- gtk_widget_show(puzzle_list_container);
- gtk_widget_show(puzzle_list_view);
- gtk_widget_show(launch_selected_button);
- gtk_widget_show(launch_random_button);
- return;
- }
- void puzzle_list_view_cursor_changed(void)
- {
- GtkTreePath* current_list_position_path;
- current_list_position_path=gtk_tree_path_new();
- gtk_tree_view_get_cursor((GtkTreeView*)puzzle_list_view, ¤t_list_position_path, NULL);
- current_list_position=atoi(gtk_tree_path_to_string(current_list_position_path));
- gtk_widget_set_sensitive(launch_selected_button, TRUE);
- gtk_tree_path_free(current_list_position_path);
- return;
- }
- void launch_selected_button_clicked(void)
- {
- launch_code=current_list_position;
- gtk_widget_hide(main_window);
- gtk_main_quit();
- return;
- }
- void launch_random_button_clicked(void)
- {
- srand(time(NULL));
- launch_code=rand()%puzzle_count;
- gtk_widget_hide(main_window);
- gtk_main_quit();
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement