Advertisement
Guest User

Untitled

a guest
Oct 19th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.93 KB | None | 0 0
  1. #define DEBUG_MODE FALSE
  2.  
  3. #define PROGRAM_NAME "Puzzle Launcher"
  4. #define PROGRAM_VERSION "1.0"
  5.  
  6. #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"
  7.  
  8. #define RU_VER "вер."
  9. #define RU_PUZZLE "Головоломка"
  10. #define RU_LAUNCH_SELECTED "Запуск"
  11. #define RU_LAUNCH_RANDOM "Случайный"
  12.  
  13. #define RU_DBG_PUZZLE_FULL_STRING_GET "Получена полная строка головоломок"
  14. #define RU_DBG_PUZZLE_COUNT_GET "Количество головоломок"
  15. #define RU_DBG_PUZZLE_INFO_GET "Информация о головоломках собрана"
  16. #define RU_DBG_PUZZLE_NAME "Название"
  17. #define RU_DBG_PUZZLE_EXEC "Команда"
  18.  
  19. #define _GNU_SOURCE
  20.  
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23. #include <stdbool.h>
  24. #include <inttypes.h>
  25. #include <gtk/gtk.h>
  26. #include <time.h>
  27.  
  28. struct puzzle_info
  29. {
  30. char* name;
  31. char* exec;
  32. };
  33.  
  34. struct puzzle_info_statistic
  35. {
  36. uint8_t name_length;
  37. uint8_t exec_length;
  38. };
  39.  
  40. bool main(uint8_t arguments_count, char* arguments_value[]);
  41. void debug_test(void);
  42. void set_puzzle_data(void);
  43. void configure_ui(void);
  44. void puzzle_list_view_cursor_changed(void);
  45. void launch_selected_button_clicked(void);
  46. void launch_random_button_clicked(void);
  47.  
  48. struct puzzle_info* puzzle_info_array;
  49. uint8_t puzzle_count, current_list_position;
  50. int16_t launch_code;
  51.  
  52. uint16_t iter_0, iter_1, iter_2;
  53.  
  54. GtkWidget* main_window,* vertical_box,* puzzle_list_container,* puzzle_list_view,* launch_selected_button,* launch_random_button;
  55. GtkListStore* puzzle_list_store;
  56. GtkTreeIter iter;
  57.  
  58. bool main(uint8_t arguments_count, char* arguments_value[])
  59. {
  60. printf("%s %s %s\n", PROGRAM_NAME, RU_VER, PROGRAM_VERSION);
  61. if(DEBUG_MODE)
  62. {
  63. debug_test();
  64. }
  65. launch_code=-1;
  66. set_puzzle_data();
  67. gtk_init((int*)&arguments_count, &arguments_value);
  68. configure_ui();
  69. gtk_main();
  70. if(launch_code>=0)
  71. {
  72. system(puzzle_info_array[launch_code].exec);
  73. }
  74. exit(EXIT_SUCCESS);
  75. return FALSE;
  76. }
  77.  
  78. void debug_test(void)
  79. {
  80. return;
  81. }
  82.  
  83. void set_puzzle_data(void)
  84. {
  85. char* puzzle_full_string;
  86. struct puzzle_info_statistic* puzzle_info_statistic_array;
  87. asprintf(&puzzle_full_string, "%s\0", PUZZLES);
  88. if(DEBUG_MODE)
  89. {
  90. printf("\n\n\n%s:\n%s\n\n\n", RU_DBG_PUZZLE_FULL_STRING_GET, puzzle_full_string);
  91. }
  92. for(iter_0=0, puzzle_count=1; puzzle_full_string[iter_0]!='\0'; iter_0++)
  93. {
  94. if(puzzle_full_string[iter_0]=='|')
  95. {
  96. puzzle_count++;
  97. }
  98. }
  99. if(DEBUG_MODE)
  100. {
  101. printf("\n\n\n%s: %u\n\n\n", RU_DBG_PUZZLE_COUNT_GET, puzzle_count);
  102. }
  103. puzzle_info_statistic_array=malloc(sizeof(struct puzzle_info_statistic)*puzzle_count);
  104. iter_1=0;
  105. for(iter_0=0; iter_0<puzzle_count; iter_0++)
  106. {
  107. puzzle_info_statistic_array[iter_0].name_length=0;
  108. puzzle_info_statistic_array[iter_0].exec_length=0;
  109. for(; puzzle_full_string[iter_1]!=':'; iter_1++)
  110. {
  111. puzzle_info_statistic_array[iter_0].name_length++;
  112. }
  113. for(iter_1++; puzzle_full_string[iter_1]!='|'; iter_1++)
  114. {
  115. puzzle_info_statistic_array[iter_0].exec_length++;
  116. }
  117. iter_1++;
  118. }
  119. puzzle_info_array=malloc(sizeof(struct puzzle_info)*puzzle_count);
  120. iter_2=0;
  121. for(iter_0=0; iter_0<puzzle_count; iter_0++)
  122. {
  123. puzzle_info_array[iter_0].name=malloc(sizeof(char)*puzzle_info_statistic_array[iter_0].name_length+1);
  124. puzzle_info_array[iter_0].exec=malloc(sizeof(char)*puzzle_info_statistic_array[iter_0].exec_length+1);
  125. for(iter_1=0; iter_1<puzzle_info_statistic_array[iter_0].name_length; iter_1++)
  126. {
  127. puzzle_info_array[iter_0].name[iter_1]=puzzle_full_string[iter_2++];
  128. }
  129. iter_2++;
  130. puzzle_info_array[iter_0].name[iter_1]='\0';
  131. for(iter_1=0; iter_1<puzzle_info_statistic_array[iter_0].exec_length; iter_1++)
  132. {
  133. puzzle_info_array[iter_0].exec[iter_1]=puzzle_full_string[iter_2++];
  134. }
  135. iter_2++;
  136. puzzle_info_array[iter_0].exec[iter_1]='\0';
  137. }
  138. if(DEBUG_MODE)
  139. {
  140. printf("\n\n\n%s:\n", RU_DBG_PUZZLE_INFO_GET);
  141. for(iter_0=0; iter_0<puzzle_count; iter_0++)
  142. {
  143. 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);
  144. }
  145. printf("\n\n\n");
  146. }
  147. free(puzzle_info_statistic_array);
  148. free(puzzle_full_string);
  149. }
  150.  
  151. void configure_ui(void)
  152. {
  153. puzzle_list_store=gtk_list_store_new(1, G_TYPE_STRING);
  154. for(iter_0=0; iter_0<puzzle_count; iter_0++)
  155. {
  156. gtk_list_store_append (puzzle_list_store, &iter);
  157. gtk_list_store_set(puzzle_list_store, &iter, 0, puzzle_info_array[iter_0].name, -1);
  158. }
  159. main_window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  160. vertical_box=gtk_vbox_new(FALSE,0);
  161. puzzle_list_container=gtk_scrolled_window_new(NULL, NULL);
  162. puzzle_list_view=gtk_tree_view_new_with_model((GtkTreeModel*)puzzle_list_store);
  163. launch_selected_button=gtk_button_new_with_label(RU_LAUNCH_SELECTED);
  164. launch_random_button=gtk_button_new_with_label(RU_LAUNCH_RANDOM);
  165. gtk_window_set_default_size((GtkWindow*)main_window, 240, 320);
  166. gtk_window_set_title((GtkWindow*)main_window, PROGRAM_NAME);
  167. gtk_window_set_position((GtkWindow*)main_window, GTK_WIN_POS_CENTER);
  168. gtk_scrolled_window_set_policy((GtkScrolledWindow*)puzzle_list_container, GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
  169. 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));
  170. gtk_tree_view_set_grid_lines((GtkTreeView*)puzzle_list_view, GTK_TREE_VIEW_GRID_LINES_HORIZONTAL);
  171. gtk_box_pack_start((GtkBox*)vertical_box, puzzle_list_container, TRUE, TRUE, 0);
  172. gtk_box_pack_start((GtkBox*)vertical_box, launch_selected_button, FALSE, TRUE, 0);
  173. gtk_box_pack_start((GtkBox*)vertical_box, launch_random_button, FALSE, TRUE, 0);
  174. gtk_container_add(GTK_CONTAINER(main_window), vertical_box);
  175. gtk_container_add(GTK_CONTAINER(puzzle_list_container), puzzle_list_view);
  176. gtk_signal_connect(GTK_OBJECT(main_window), "delete-event", GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
  177. gtk_signal_connect(GTK_OBJECT(puzzle_list_view), "cursor-changed", GTK_SIGNAL_FUNC(puzzle_list_view_cursor_changed), NULL);
  178. gtk_signal_connect(GTK_OBJECT(launch_selected_button), "clicked", GTK_SIGNAL_FUNC(launch_selected_button_clicked), NULL);
  179. gtk_signal_connect(GTK_OBJECT(launch_random_button), "clicked", GTK_SIGNAL_FUNC(launch_random_button_clicked), NULL);
  180. gtk_widget_set_sensitive(launch_selected_button, FALSE);
  181. gtk_widget_show(main_window);
  182. gtk_widget_show(vertical_box);
  183. gtk_widget_show(puzzle_list_container);
  184. gtk_widget_show(puzzle_list_view);
  185. gtk_widget_show(launch_selected_button);
  186. gtk_widget_show(launch_random_button);
  187. return;
  188. }
  189.  
  190. void puzzle_list_view_cursor_changed(void)
  191. {
  192. GtkTreePath* current_list_position_path;
  193. current_list_position_path=gtk_tree_path_new();
  194. gtk_tree_view_get_cursor((GtkTreeView*)puzzle_list_view, &current_list_position_path, NULL);
  195. current_list_position=atoi(gtk_tree_path_to_string(current_list_position_path));
  196. gtk_widget_set_sensitive(launch_selected_button, TRUE);
  197. gtk_tree_path_free(current_list_position_path);
  198. return;
  199. }
  200.  
  201. void launch_selected_button_clicked(void)
  202. {
  203. launch_code=current_list_position;
  204. gtk_widget_hide(main_window);
  205. gtk_main_quit();
  206. return;
  207. }
  208.  
  209. void launch_random_button_clicked(void)
  210. {
  211. srand(time(NULL));
  212. launch_code=rand()%puzzle_count;
  213. gtk_widget_hide(main_window);
  214. gtk_main_quit();
  215. return;
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement