PageRenderTime 46ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/dashdesigner/events.c

https://gitlab.com/libreems-suite/megatunix
C | 1062 lines | 881 code | 137 blank | 44 comment | 120 complexity | f6df6639126ef2905a9d09d4cfa060fb MD5 | raw file
Possible License(s): GPL-2.0
  1. /*
  2. * Copyright (C) 2002-2012 by Dave J. Andruczyk <djandruczyk at yahoo dot com>
  3. *
  4. * Linux Electronic Fuel Injection tuning software
  5. *
  6. *
  7. * This software comes under the GPL (GNU Public License)
  8. * You may freely copy,distribute etc. this as long as the source code
  9. * is made available for FREE.
  10. *
  11. * No warranty is made or implied. You use this program at your own risk.
  12. */
  13. #include <getfiles.h>
  14. #include <events.h>
  15. #include <gauge.h>
  16. #include <loadsave.h>
  17. #include <rtv_parser.h>
  18. #include <xml.h>
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #ifndef M_PI
  22. #define M_PI 3.1415926535897932384626433832795
  23. #endif
  24. gboolean changed = FALSE;
  25. static gboolean grabbed = FALSE;
  26. static gboolean resizing = FALSE;
  27. static gboolean moving = FALSE;
  28. static gint corner = -1;
  29. static GtkBuilder *properties = NULL;
  30. static GtkBuilder *previews = NULL;
  31. static GtkWidget *grabbed_widget = NULL;
  32. static GdkColor white = { 0, 65535, 65535, 65535};
  33. static GdkColor home_color = {0, 62000, 59000, 65535};
  34. static GdkColor title_color = {0, 58000, 58000, 58000};
  35. extern GtkBuilder *toplevel;
  36. static struct
  37. {
  38. gint child_x_origin;
  39. gint child_y_origin;
  40. gint child_width;
  41. gint child_height;
  42. gint rel_grab_x;
  43. gint rel_grab_y;
  44. }tt = {0,0,0,0,0,0};
  45. typedef enum
  46. {
  47. LL = 10,
  48. LR,
  49. UL,
  50. UR
  51. }CornerType;
  52. G_MODULE_EXPORT gboolean dashdesigner_about(GtkWidget * UNUSED(widget), gpointer UNUSED(data))
  53. {
  54. extern GtkWidget *main_window;
  55. #if GTK_MINOR_VERSION >= 8
  56. if (gtk_minor_version >= 8)
  57. {
  58. const gchar *authors[] = {"David Andruczyk",NULL};
  59. const gchar *artists[] = {"Dale Anderson",NULL};
  60. gtk_show_about_dialog(GTK_WINDOW(main_window),
  61. "name","MegaTunix Dashboard Designer",
  62. "version",VERSION,
  63. "copyright","David J. Andruczyk(2012)",
  64. "comments","Dashboard Designer is a tool to design custom Dash gauge layouts for the MegaTunix Tuning Software",
  65. "license","GNU GPL v2",
  66. "website","http://megatunix.sourceforge.net",
  67. "authors",authors,
  68. "artists",artists,
  69. "documenters",authors,
  70. NULL);
  71. }
  72. #endif
  73. return TRUE;
  74. }
  75. G_MODULE_EXPORT gboolean create_preview_list(GtkWidget *UNUSED(widget), gpointer UNUSED(data))
  76. {
  77. static gboolean created = FALSE;
  78. static gboolean prop_created = FALSE;
  79. GtkWidget * gauge = NULL;
  80. GtkWidget * table = NULL;
  81. GtkWidget * window = NULL;
  82. GtkWidget * notebook = NULL;
  83. GtkWidget * label = NULL;
  84. GtkWidget * swin = NULL;
  85. GtkWidget * ebox = NULL;
  86. GtkWidget * vbox = NULL;
  87. GtkWidget * sep = NULL;
  88. GArray *classes = NULL;
  89. gchar ** vector = NULL;
  90. gchar ** files = NULL;
  91. gchar * filename = NULL;
  92. gchar * tmpbuf = NULL;
  93. gchar * path = NULL;
  94. GDir *dir = NULL;
  95. gchar *d_name = NULL;
  96. gint t_num = -1;
  97. GList *dir_list = NULL;
  98. GList *p_list = NULL;
  99. GList *s_list = NULL;
  100. guint i = 0;
  101. GError *error = NULL;
  102. gchar *file = NULL;
  103. if (created)
  104. {
  105. window = GTK_WIDGET(gtk_builder_get_object(previews,"preview_window"));
  106. if (GTK_IS_WIDGET(window))
  107. gtk_widget_show_all(window);
  108. }
  109. else
  110. {
  111. file = g_build_filename(DASHDESIGNER_GLADE_DIR,"preview.ui",NULL);
  112. filename = get_file(NULL,file,NULL);
  113. g_free(file);
  114. if (filename)
  115. {
  116. previews = gtk_builder_new();
  117. if(!gtk_builder_add_from_file(previews,filename,&error))
  118. {
  119. g_warning ("Couldn't load builder file: %s", error->message);
  120. g_error_free(error);
  121. }
  122. gtk_builder_connect_signals(previews,NULL);
  123. }
  124. }
  125. if (prop_created)
  126. {
  127. window = GTK_WIDGET(gtk_builder_get_object(properties,"property_editor_window"));
  128. if (GTK_IS_WIDGET(window))
  129. gtk_widget_show_all(window);
  130. }
  131. else
  132. {
  133. file = g_build_filename(DASHDESIGNER_GLADE_DIR,"propeditor.ui",NULL);
  134. filename = get_file(NULL,file,NULL);
  135. g_free(file);
  136. if (filename)
  137. {
  138. properties = gtk_builder_new();
  139. if(!gtk_builder_add_from_file(properties,filename,&error))
  140. {
  141. g_warning ("Couldn't load builder file: %s", error->message);
  142. g_error_free(error);
  143. }
  144. gtk_builder_connect_signals(properties,NULL);
  145. }
  146. }
  147. if (created && prop_created)
  148. return TRUE;
  149. notebook = GTK_WIDGET(gtk_builder_get_object(previews,"preview_notebook"));
  150. if (!notebook)
  151. {
  152. printf("critical error, notbook not found, EXITING!\n");
  153. exit (-1);
  154. }
  155. /* get rid of default empty page from ui... */
  156. gtk_notebook_remove_page(GTK_NOTEBOOK(notebook),0);
  157. #ifdef __WIN32__
  158. path = g_build_path(PSEP,HOME(),"dist",GAUGES_DATA_DIR,NULL);
  159. #else
  160. path = g_build_path(PSEP,DATA_DIR,GAUGES_DATA_DIR,NULL);
  161. #endif
  162. files = get_files(NULL,GAUGES_DATA_DIR,"xml",&classes);
  163. i = 0;
  164. if (files)
  165. {
  166. while (files[i])
  167. {
  168. if (g_array_index(classes,FileClass,i) == PERSONAL)
  169. p_list = g_list_append(p_list,g_strdup(files[i]));
  170. if (g_array_index(classes,FileClass,i) == SYSTEM)
  171. s_list = g_list_append(s_list,g_strdup(files[i]));
  172. i++;
  173. }
  174. p_list = g_list_sort(p_list,list_sort);
  175. s_list = g_list_sort(s_list,list_sort);
  176. gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook),TRUE);
  177. ebox = gtk_event_box_new();
  178. g_signal_connect(G_OBJECT(ebox),
  179. "button_press_event",
  180. G_CALLBACK(gauge_choice_button_event),
  181. NULL);
  182. swin = gtk_scrolled_window_new(NULL,NULL);
  183. gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin),
  184. GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
  185. gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(swin),
  186. ebox);
  187. vbox = gtk_vbox_new(FALSE,0);
  188. gtk_container_add(GTK_CONTAINER(ebox),vbox);
  189. table = gtk_table_new(1,1,FALSE);
  190. OBJ_SET((ebox),"table",table);
  191. gtk_box_pack_start(GTK_BOX(vbox),table,TRUE,TRUE,0);
  192. label = gtk_label_new("Unsorted");
  193. t_num = gtk_notebook_append_page(GTK_NOTEBOOK(notebook),swin,label);
  194. gtk_widget_show_all(notebook);
  195. for (i=0;i<g_list_length(p_list);i++)
  196. {
  197. vbox = gtk_vbox_new(FALSE,1);
  198. gtk_table_attach_defaults(GTK_TABLE(table),vbox,0,1,i,i+1);
  199. ebox = gtk_event_box_new();
  200. gtk_box_pack_start(GTK_BOX(vbox),ebox,FALSE,FALSE,0);
  201. gtk_widget_modify_bg(GTK_WIDGET(ebox),GTK_STATE_NORMAL,&title_color);
  202. vector = g_strsplit((gchar *)g_list_nth_data(p_list,i),PSEP,-1);
  203. tmpbuf = g_strdup_printf("%s",vector[g_strv_length(vector)-1]);
  204. g_strfreev(vector);
  205. label = gtk_label_new(tmpbuf);
  206. g_free(tmpbuf);
  207. gtk_container_add(GTK_CONTAINER(ebox),label);
  208. ebox = gtk_event_box_new();
  209. gtk_box_pack_start(GTK_BOX(vbox),ebox,TRUE,TRUE,0);
  210. gauge = mtx_gauge_face_new();
  211. OBJ_SET(vbox,"gauge",gauge);
  212. gtk_container_add(GTK_CONTAINER(ebox),gauge);
  213. mtx_gauge_face_import_xml(MTX_GAUGE_FACE(gauge),(gchar *)g_list_nth_data(p_list,i));
  214. gtk_widget_set_usize(GTK_WIDGET(gauge),200,200);
  215. gtk_widget_modify_bg(GTK_WIDGET(ebox),GTK_STATE_NORMAL,&home_color);
  216. sep = gtk_hseparator_new();
  217. gtk_box_pack_start(GTK_BOX(vbox),sep,TRUE,FALSE,0);
  218. gtk_widget_show(gauge);
  219. }
  220. for (i=0;i<g_list_length(s_list);i++)
  221. {
  222. vbox = gtk_vbox_new(FALSE,1);
  223. gtk_table_attach_defaults(GTK_TABLE(table),vbox,0,1,i,i+1);
  224. ebox = gtk_event_box_new();
  225. gtk_box_pack_start(GTK_BOX(vbox),ebox,FALSE,FALSE,0);
  226. gtk_widget_modify_bg(GTK_WIDGET(ebox),GTK_STATE_NORMAL,&title_color);
  227. vector = g_strsplit((gchar *)g_list_nth_data(s_list,i),PSEP,-1);
  228. tmpbuf = g_strdup_printf("%s",vector[g_strv_length(vector)-1]);
  229. g_strfreev(vector);
  230. label = gtk_label_new(tmpbuf);
  231. g_free(tmpbuf);
  232. gtk_container_add(GTK_CONTAINER(ebox),label);
  233. ebox = gtk_event_box_new();
  234. gtk_box_pack_start(GTK_BOX(vbox),ebox,TRUE,TRUE,0);
  235. gauge = mtx_gauge_face_new();
  236. OBJ_SET(vbox,"gauge",gauge);
  237. gtk_container_add(GTK_CONTAINER(ebox),gauge);
  238. mtx_gauge_face_import_xml(MTX_GAUGE_FACE(gauge),(gchar *)g_list_nth_data(s_list,i));
  239. gtk_widget_set_usize(GTK_WIDGET(gauge),200,200);
  240. gtk_widget_modify_bg(GTK_WIDGET(ebox),GTK_STATE_NORMAL,&white);
  241. sep = gtk_hseparator_new();
  242. gtk_box_pack_start(GTK_BOX(vbox),sep,TRUE,FALSE,0);
  243. gtk_widget_show(gauge);
  244. }
  245. g_array_free(classes,TRUE);
  246. classes = NULL;
  247. g_strfreev(files);
  248. g_list_foreach(p_list,free_element,NULL);
  249. g_list_foreach(s_list,free_element,NULL);
  250. g_list_free(p_list);
  251. g_list_free(s_list);
  252. p_list = NULL;
  253. s_list = NULL;
  254. }
  255. #ifdef __WIN32__
  256. path = g_build_path(PSEP,HOME(),"dist",GAUGES_DATA_DIR,NULL);
  257. #else
  258. path = g_build_path(PSEP,DATA_DIR,GAUGES_DATA_DIR,NULL);
  259. #endif
  260. dir = g_dir_open(path,0,NULL);
  261. if (dir)
  262. {
  263. d_name = (gchar *)g_dir_read_name(dir);
  264. while (d_name != NULL)
  265. {
  266. dir_list = g_list_prepend(dir_list,g_strdup(d_name)); /* Store this dirname for next run thru */
  267. d_name = (gchar *)g_dir_read_name(dir);
  268. }
  269. g_dir_close(dir);
  270. }
  271. g_free(path);
  272. path = g_build_path(PSEP,HOME(),".MegaTunix",GAUGES_DATA_DIR,NULL);
  273. dir = g_dir_open(path,0,NULL);
  274. if (dir)
  275. {
  276. d_name = (gchar *)g_dir_read_name(dir);
  277. while ((d_name != NULL))
  278. {
  279. if (g_list_find_custom(dir_list,d_name,(GCompareFunc)g_strcmp0) != NULL) /* we already got this dir*/
  280. {
  281. d_name = (gchar *)g_dir_read_name(dir);
  282. continue;
  283. }
  284. d_name = (gchar *)g_dir_read_name(dir);
  285. }
  286. g_dir_close(dir);
  287. }
  288. g_free(path);
  289. dir_list = g_list_sort(dir_list,list_sort);
  290. g_list_foreach(dir_list,scan_for_gauges,notebook);
  291. g_list_foreach(dir_list,(GFunc)g_free,NULL);
  292. g_list_free(dir_list);
  293. created = TRUE;
  294. prop_created = TRUE;
  295. return TRUE;
  296. }
  297. void scan_for_gauges(gpointer data, gpointer user_data)
  298. {
  299. gchar * d_name = NULL;
  300. guint i = 0;
  301. gint t_num = -1;
  302. GtkWidget * notebook = NULL;
  303. GtkWidget * gauge = NULL;
  304. GtkWidget * table = NULL;
  305. GtkWidget * window = NULL;
  306. GtkWidget * label = NULL;
  307. GtkWidget * swin = NULL;
  308. GtkWidget * ebox = NULL;
  309. GtkWidget * vbox = NULL;
  310. GtkWidget * sep = NULL;
  311. GArray *classes = NULL;
  312. gchar * filename = NULL;
  313. gchar * path = NULL;
  314. gchar ** files = NULL;
  315. gchar ** vector = NULL;
  316. gchar *tmpbuf = NULL;
  317. GList *p_list = NULL;
  318. GList *s_list = NULL;
  319. gchar *pathstub = NULL;
  320. d_name = (gchar *)data;
  321. notebook = (GtkWidget *)user_data;
  322. g_return_if_fail(d_name);
  323. g_return_if_fail(notebook);
  324. pathstub = g_strconcat(GAUGES_DATA_DIR,PSEP,d_name,NULL);
  325. files = get_files(NULL,pathstub,"xml",&classes);
  326. g_free(pathstub);
  327. if (files)
  328. {
  329. i = 0;
  330. while (files[i])
  331. {
  332. if (g_array_index(classes,FileClass,i) == PERSONAL)
  333. p_list = g_list_append(p_list,g_strdup(files[i]));
  334. if (g_array_index(classes,FileClass,i) == SYSTEM)
  335. s_list = g_list_append(s_list,g_strdup(files[i]));
  336. i++;
  337. }
  338. p_list = g_list_sort(p_list,list_sort);
  339. s_list = g_list_sort(s_list,list_sort);
  340. ebox = gtk_event_box_new();
  341. g_signal_connect(G_OBJECT(ebox),
  342. "button_press_event",
  343. G_CALLBACK(gauge_choice_button_event),
  344. NULL);
  345. swin = gtk_scrolled_window_new(NULL,NULL);
  346. gtk_scrolled_window_set_policy(
  347. GTK_SCROLLED_WINDOW(swin),
  348. GTK_POLICY_AUTOMATIC,
  349. GTK_POLICY_AUTOMATIC);
  350. gtk_scrolled_window_add_with_viewport(
  351. GTK_SCROLLED_WINDOW(swin),
  352. ebox);
  353. vbox = gtk_vbox_new(FALSE,0);
  354. gtk_container_add(GTK_CONTAINER(ebox),vbox);
  355. table = gtk_table_new(1,1,FALSE);
  356. gtk_box_pack_start(GTK_BOX(vbox),table,TRUE,TRUE,0);
  357. OBJ_SET((ebox),"table",table);
  358. label = gtk_label_new(d_name);
  359. t_num = gtk_notebook_append_page(
  360. GTK_NOTEBOOK(notebook),
  361. swin,label);
  362. i = 0;
  363. gtk_widget_show_all(ebox);
  364. for (i=0;i<g_list_length(p_list);i++)
  365. {
  366. vbox = gtk_vbox_new(FALSE,1);
  367. gtk_table_attach_defaults(GTK_TABLE(table),vbox,0,1,i,i+1);
  368. ebox = gtk_event_box_new();
  369. gtk_box_pack_start(GTK_BOX(vbox),ebox,FALSE,FALSE,0);
  370. gtk_widget_modify_bg(GTK_WIDGET(ebox),GTK_STATE_NORMAL,&title_color);
  371. vector = g_strsplit((gchar *)g_list_nth_data(s_list,i),PSEP,-1);
  372. tmpbuf = g_strdup_printf("%s",vector[g_strv_length(vector)-1]);
  373. g_strfreev(vector);
  374. label = gtk_label_new(tmpbuf);
  375. g_free(tmpbuf);
  376. gtk_container_add(GTK_CONTAINER(ebox),label);
  377. ebox = gtk_event_box_new();
  378. gtk_box_pack_start(GTK_BOX(vbox),ebox,TRUE,TRUE,0);
  379. gauge = mtx_gauge_face_new();
  380. OBJ_SET(vbox,"gauge",gauge);
  381. gtk_container_add(GTK_CONTAINER(ebox),gauge);
  382. mtx_gauge_face_import_xml(MTX_GAUGE_FACE(gauge), (gchar *)g_list_nth_data(p_list,i));
  383. gtk_widget_set_usize(GTK_WIDGET(gauge),200,200);
  384. gtk_widget_modify_bg(GTK_WIDGET(ebox),GTK_STATE_NORMAL,&home_color);
  385. sep = gtk_hseparator_new();
  386. gtk_box_pack_start(GTK_BOX(vbox),sep,TRUE,FALSE,0);
  387. gtk_widget_show(gauge);
  388. }
  389. for (i=0;i<g_list_length(s_list);i++)
  390. {
  391. vbox = gtk_vbox_new(FALSE,1);
  392. gtk_table_attach_defaults(GTK_TABLE(table),vbox,0,1,i,i+1);
  393. ebox = gtk_event_box_new();
  394. gtk_box_pack_start(GTK_BOX(vbox),ebox,FALSE,FALSE,0);
  395. gtk_widget_modify_bg(GTK_WIDGET(ebox),GTK_STATE_NORMAL,&title_color);
  396. vector = g_strsplit((gchar *)g_list_nth_data(s_list,i),PSEP,-1);
  397. tmpbuf = g_strdup_printf("%s",vector[g_strv_length(vector)-1]);
  398. g_strfreev(vector);
  399. label = gtk_label_new(tmpbuf);
  400. g_free(tmpbuf);
  401. gtk_container_add(GTK_CONTAINER(ebox),label);
  402. ebox = gtk_event_box_new();
  403. gtk_box_pack_start(GTK_BOX(vbox),ebox,TRUE,TRUE,0);
  404. gauge = mtx_gauge_face_new();
  405. OBJ_SET(vbox,"gauge",gauge);
  406. gtk_container_add(GTK_CONTAINER(ebox),gauge);
  407. mtx_gauge_face_import_xml(MTX_GAUGE_FACE(gauge), (gchar *)g_list_nth_data(s_list,i));
  408. gtk_widget_set_usize(GTK_WIDGET(gauge),200,200);
  409. gtk_widget_modify_bg(GTK_WIDGET(ebox),GTK_STATE_NORMAL,&white);
  410. sep = gtk_hseparator_new();
  411. gtk_box_pack_start(GTK_BOX(vbox),sep,TRUE,FALSE,0);
  412. gtk_widget_show(gauge);
  413. }
  414. g_array_free(classes,TRUE);
  415. classes = NULL;
  416. g_strfreev(files);
  417. g_list_foreach(p_list,free_element,NULL);
  418. g_list_foreach(s_list,free_element,NULL);
  419. g_list_free(p_list);
  420. g_list_free(s_list);
  421. p_list = NULL;
  422. s_list = NULL;
  423. }
  424. gtk_widget_show_all(table);
  425. gtk_widget_show_all(notebook);
  426. }
  427. G_MODULE_EXPORT gboolean gauge_choice_button_event(GtkWidget *widget, GdkEventButton *event, gpointer UNUSED(data))
  428. {
  429. GtkWidget *table = NULL;
  430. gint i = 0;
  431. gint x_cur = 0;
  432. gint y_cur = 0;
  433. gint width = 0;
  434. gint height = 0;
  435. gint origin_x = 0;
  436. gint origin_y = 0;
  437. gint total_gauges = 0;
  438. GtkWidget * dash = NULL;
  439. GtkWidget * gauge = NULL;
  440. GtkTableChild *child = NULL;
  441. gchar * filename = NULL;
  442. gint row = 0;
  443. gdk_window_get_origin(gtk_widget_get_window(widget),&origin_x,&origin_y);
  444. gdk_drawable_get_size(gtk_widget_get_window(widget),&width,&height);
  445. /* Current cursor location relative to upper left corner */
  446. x_cur = (gint)event->x_root-origin_x;
  447. y_cur = (gint)event->y_root-origin_y;
  448. table = (GtkWidget *)OBJ_GET((widget),"table");
  449. if (GTK_IS_TABLE(table))
  450. total_gauges = g_list_length(GTK_TABLE(table)->children);
  451. else
  452. return FALSE;
  453. row = (gint)(((float)y_cur/(float)height)*(float)total_gauges);
  454. if (event->button == 1)
  455. {
  456. for (i=1;i<total_gauges;i++)
  457. {
  458. child = (GtkTableChild *) g_list_nth_data(GTK_TABLE(table)->children,i);
  459. if (row == child->top_attach)
  460. {
  461. if (GTK_IS_BOX(child->widget))
  462. {
  463. gauge = (GtkWidget *)OBJ_GET(child->widget, "gauge");
  464. filename = mtx_gauge_face_get_xml_filename(MTX_GAUGE_FACE(gauge));
  465. }
  466. }
  467. }
  468. dash = GTK_WIDGET(gtk_builder_get_object(toplevel,"dashboard"));
  469. gauge = mtx_gauge_face_new();
  470. gtk_fixed_put(GTK_FIXED(dash),gauge,130,130);
  471. if (!filename)
  472. printf("DASH PROBLEM, gauge filename is UNDEFINED for a gauge!\n");
  473. mtx_gauge_face_import_xml(MTX_GAUGE_FACE(gauge),filename);
  474. gtk_widget_show_all(dash);
  475. g_free(filename);
  476. update_properties(gauge,GAUGE_ADD);
  477. changed = TRUE;
  478. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"save_dash_menuitem"),TRUE);
  479. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"save_dash_as_menuitem"),TRUE);
  480. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"close_dash_menuitem"),TRUE);
  481. }
  482. /*printf("button event in gauge choice window at %i,%i\n",x_cur,y_cur);*/
  483. return TRUE;
  484. }
  485. G_MODULE_EXPORT gboolean dashdesigner_quit(GtkWidget *UNUSED(widget), gpointer UNUSED(data))
  486. {
  487. extern GtkTreeStore *store;
  488. if (changed)
  489. prompt_to_save();
  490. g_object_unref(store);
  491. gtk_main_quit();
  492. return TRUE;
  493. }
  494. G_MODULE_EXPORT gboolean motion_event(GtkWidget *widget, GdkEventMotion *event, gpointer UNUSED(data))
  495. {
  496. gint x_cur;
  497. gint y_cur;
  498. gint origin_x;
  499. gint origin_y;
  500. gdk_window_get_origin(gtk_widget_get_window(widget),&origin_x,&origin_y);
  501. /* Current cursor locatio nrelatuive to upper left corner */
  502. x_cur = (gint)event->x_root-origin_x;
  503. y_cur = (gint)event->y_root-origin_y;
  504. /*printf("motion event\n");*/
  505. /*printf("rel movement point %i,%i\n",x_cur,y_cur);*/
  506. if (grabbed)
  507. {
  508. if (moving)
  509. {
  510. gtk_fixed_move(GTK_FIXED(gtk_widget_get_parent(grabbed_widget)),grabbed_widget,
  511. x_cur-tt.rel_grab_x+tt.child_x_origin,
  512. y_cur-tt.rel_grab_y+tt.child_y_origin);
  513. }
  514. if (resizing)
  515. {
  516. if (corner == LR)
  517. {
  518. gtk_widget_set_usize(grabbed_widget,MIN(event->x,event->y),MIN(event->x,event->y));
  519. }
  520. else if (corner == UR)
  521. {
  522. gtk_widget_set_usize(grabbed_widget,
  523. MIN(x_cur-tt.child_x_origin,(tt.child_y_origin+tt.child_height)-y_cur),
  524. MIN(x_cur-tt.child_x_origin,(tt.child_y_origin+tt.child_height)-y_cur));
  525. gtk_fixed_move(GTK_FIXED(gtk_widget_get_parent(grabbed_widget)),
  526. grabbed_widget,
  527. tt.child_x_origin,
  528. tt.child_y_origin+tt.child_height-MIN(x_cur-tt.child_x_origin,(tt.child_y_origin+tt.child_height)-y_cur));
  529. }
  530. else if (corner == UL)
  531. {
  532. gtk_widget_set_usize(grabbed_widget,
  533. MIN((tt.child_x_origin+tt.child_width)-x_cur,(tt.child_y_origin+tt.child_height)-y_cur),
  534. MIN((tt.child_x_origin+tt.child_width)-x_cur,(tt.child_y_origin+tt.child_height)-y_cur));
  535. gtk_fixed_move(GTK_FIXED(gtk_widget_get_parent(grabbed_widget)),
  536. grabbed_widget,
  537. tt.child_x_origin+tt.child_width-MIN((tt.child_x_origin+tt.child_width)-x_cur,(tt.child_y_origin+tt.child_height)-y_cur),
  538. tt.child_y_origin+tt.child_height-MIN((tt.child_x_origin+tt.child_width)-x_cur,(tt.child_y_origin+tt.child_height)-y_cur));
  539. }
  540. else if (corner == LL)
  541. {
  542. gtk_widget_set_usize(grabbed_widget,
  543. MIN(abs((tt.child_x_origin+tt.child_width)-x_cur),event->y),MIN(abs((tt.child_x_origin+tt.child_width)-x_cur),event->y));
  544. gtk_fixed_move(GTK_FIXED(gtk_widget_get_parent(grabbed_widget)),
  545. grabbed_widget,
  546. tt.child_x_origin+tt.child_width-MIN((tt.child_x_origin+tt.child_width)-x_cur,event->y),
  547. tt.child_y_origin);
  548. }
  549. }
  550. changed = TRUE;
  551. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"save_dash_menuitem"),TRUE);
  552. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"save_dash_as_menuitem"),TRUE);
  553. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"close_dash_menuitem"),TRUE);
  554. }
  555. return TRUE;
  556. }
  557. G_MODULE_EXPORT gboolean button_event(GtkWidget *widget, GdkEventButton *event, gpointer UNUSED(data))
  558. {
  559. GtkWidget * fixed = gtk_bin_get_child(GTK_BIN(widget));
  560. GList *list = NULL;
  561. gint i = 0;
  562. gint origin_x = 0;
  563. gint origin_y = 0;
  564. gboolean found_one = FALSE;
  565. gint x_cur = 0;
  566. gint y_cur = 0;
  567. GtkFixedChild * fchild = NULL;
  568. GdkWindow *win = NULL;
  569. gint len = g_list_length(GTK_FIXED(fixed)->children);
  570. GtkAllocation allocation;
  571. if (event->state & GDK_BUTTON1_MASK)
  572. {
  573. grabbed = FALSE;
  574. moving = FALSE;
  575. resizing = FALSE;
  576. corner = -1;
  577. /*printf("button1 released, unlocking\n");*/
  578. return TRUE;
  579. }
  580. gdk_window_get_origin(gtk_widget_get_window(widget),&origin_x,&origin_y);
  581. /* Current cursor locatio nrelatuive to upper left corner */
  582. x_cur = (gint)event->x_root-origin_x;
  583. y_cur = (gint)event->y_root-origin_y;
  584. if ((event->button))
  585. {
  586. win = gdk_window_at_pointer(NULL,NULL);
  587. list = g_list_first(GTK_FIXED(fixed)->children);
  588. found_one = FALSE;
  589. for (i=0;i<len;i++)
  590. {
  591. fchild = (GtkFixedChild *)g_list_nth_data(list,i);
  592. if (!fchild)
  593. continue;
  594. if (win == gtk_widget_get_window(fchild->widget))
  595. {
  596. gtk_widget_get_allocation(fchild->widget,&allocation);
  597. tt.child_x_origin = allocation.x;
  598. tt.child_y_origin = allocation.y;
  599. tt.child_width = allocation.width;
  600. tt.child_height = allocation.height;
  601. raise_fixed_child(fchild->widget);
  602. found_one = TRUE;
  603. mtx_gauge_face_set_show_drag_border(MTX_GAUGE_FACE(fchild->widget),TRUE);
  604. grabbed_widget = fchild->widget;
  605. }
  606. else
  607. {
  608. mtx_gauge_face_set_show_drag_border(MTX_GAUGE_FACE(fchild->widget),FALSE);
  609. }
  610. }
  611. if (found_one)
  612. {
  613. if (event->button == 3)
  614. {
  615. update_properties(grabbed_widget,GAUGE_REMOVE);
  616. gtk_widget_destroy(grabbed_widget);
  617. changed = TRUE;
  618. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"save_dash_menuitem"),TRUE);
  619. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"save_dash_as_menuitem"),TRUE);
  620. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"close_dash_menuitem"),TRUE);
  621. }
  622. if (event->button == 1)
  623. {
  624. /*printf("grabbed it \n");*/
  625. grabbed = TRUE;
  626. tt.rel_grab_x=x_cur;
  627. tt.rel_grab_y=y_cur;
  628. if (((x_cur < (tt.child_x_origin+DRAG_BORDER)) && ((y_cur < tt.child_y_origin+DRAG_BORDER) || (y_cur > tt.child_y_origin+tt.child_height-DRAG_BORDER))) || ((x_cur > (tt.child_x_origin+tt.child_width-DRAG_BORDER)) && ((y_cur < tt.child_y_origin+DRAG_BORDER) || (y_cur > tt.child_y_origin+tt.child_height-DRAG_BORDER))))
  629. {
  630. resizing = TRUE;
  631. /* Left border */
  632. if (x_cur < (tt.child_x_origin+7))
  633. {
  634. if (y_cur < (tt.child_y_origin+(0.33*tt.child_height)))
  635. corner = UL;
  636. else if (y_cur > (tt.child_y_origin+(0.66*tt.child_height)))
  637. corner = LL;
  638. else corner = -1;
  639. }
  640. /* Right border */
  641. else if (x_cur > (tt.child_x_origin+tt.child_width-7))
  642. {
  643. if (y_cur < (tt.child_y_origin+(0.33*tt.child_height)))
  644. corner = UR;
  645. else if (y_cur > (tt.child_y_origin+(0.66*tt.child_height)))
  646. corner = LR;
  647. else
  648. corner = -1;
  649. }
  650. /* Top border */
  651. if (y_cur < (tt.child_y_origin+7))
  652. {
  653. if (x_cur < (tt.child_x_origin+(0.33*tt.child_width)))
  654. corner = UL;
  655. else if (x_cur > (tt.child_x_origin+(0.66*tt.child_width)))
  656. corner = UR;
  657. else
  658. corner = -1;
  659. }
  660. /* Bottom border */
  661. else if (y_cur > (tt.child_y_origin+tt.child_height-7))
  662. {
  663. if (x_cur < (tt.child_x_origin+(0.33*tt.child_width)))
  664. corner = LL;
  665. else if (x_cur > (tt.child_x_origin+(0.66*tt.child_width)))
  666. corner = LR;
  667. else
  668. corner = -1;
  669. }
  670. }
  671. else
  672. moving = TRUE;
  673. }
  674. else
  675. {
  676. /*printf("didn't grab squat\n");*/
  677. grabbed = FALSE;
  678. moving = FALSE;
  679. resizing = FALSE;
  680. }
  681. }
  682. }
  683. /*
  684. if (moving)
  685. printf ("MOVING!\n");
  686. if (resizing)
  687. printf ("RESIZING\n");
  688. if (grabbed)
  689. {
  690. printf("grabbed TRUE\n");
  691. printf("child base %i,%i, rel click point %i,%i\n",tt.child_x_origin,tt.child_y_origin,tt.rel_grab_x,tt.rel_grab_y);
  692. }
  693. */
  694. return TRUE;
  695. }
  696. void raise_fixed_child (GtkWidget * widget)
  697. {
  698. GtkFixed *fixed;
  699. g_return_if_fail (GTK_IS_FIXED (gtk_widget_get_parent(widget)));
  700. fixed = GTK_FIXED (gtk_widget_get_parent(widget));
  701. /* If widget hasn't got a window, move it to the back of the parent fixed's
  702. * children. If it has got a window, raise it. */
  703. /* Note: this is slightly naughty as it changes the GtkFixed's GList of
  704. * children, but it's better than removing the widget and adding it again. */
  705. if (gtk_widget_get_has_window (widget))
  706. {
  707. GList *child;
  708. GtkFixedChild *data;
  709. child = fixed->children;
  710. while (child)
  711. {
  712. data = (GtkFixedChild *)child->data;
  713. if (data->widget == widget)
  714. {
  715. fixed->children = g_list_remove (fixed->children, data);
  716. fixed->children = g_list_append (fixed->children, data);
  717. break;
  718. }
  719. child = child->next;
  720. }
  721. }
  722. else
  723. {
  724. gdk_window_raise (gtk_widget_get_window(widget));
  725. }
  726. }
  727. void update_properties(GtkWidget * widget, Choice choice)
  728. {
  729. extern GtkTreeStore *store;
  730. GtkWidget * combo_box = NULL;
  731. GtkWidget *vbox = NULL;
  732. GtkWidget *table = NULL;
  733. gchar *tmpbuf = NULL;
  734. gchar **vector = NULL;
  735. GtkWidget *entry = NULL;
  736. GtkWidget *sep = NULL;
  737. GtkEntryCompletion *completion = NULL;
  738. gint len = 0;
  739. g_return_if_fail(store);
  740. g_return_if_fail(GTK_IS_WIDGET(widget));
  741. if (choice == GAUGE_ADD)
  742. {
  743. changed = TRUE;
  744. table = gtk_table_new(3,2,FALSE);
  745. gtk_container_set_border_width(GTK_CONTAINER(table),5);
  746. entry = gtk_entry_new();
  747. tmpbuf = mtx_gauge_face_get_xml_filename(MTX_GAUGE_FACE(widget));
  748. if (!tmpbuf)
  749. printf("ERROR, gauge has no associated filename!!\n");
  750. g_assert(tmpbuf);
  751. vector = g_strsplit(tmpbuf,PSEP,-1);
  752. len = g_strv_length(vector);
  753. g_free(tmpbuf);
  754. tmpbuf = g_strdelimit(g_strdup(vector[len-1]),"_",' ');
  755. g_strfreev(vector);
  756. vector = g_strsplit(tmpbuf,".",-1);
  757. g_free(tmpbuf);
  758. gtk_entry_set_text(GTK_ENTRY(entry),vector[0]);
  759. gtk_entry_set_editable(GTK_ENTRY(entry),FALSE);
  760. g_strfreev(vector);
  761. gtk_table_attach(GTK_TABLE(table),entry,0,1,0,1,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),(GtkAttachOptions)GTK_FILL,0,0);
  762. combo_box = gtk_combo_box_entry_new_with_model(GTK_TREE_MODEL(store),VARNAME_COL);
  763. completion = gtk_entry_completion_new();
  764. gtk_entry_set_completion(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(combo_box))),completion);
  765. gtk_entry_completion_set_model(completion,GTK_TREE_MODEL(store));
  766. gtk_entry_completion_set_text_column(completion,VARNAME_COL);
  767. gtk_entry_completion_set_popup_single_match(completion,TRUE);
  768. gtk_entry_completion_set_inline_completion(completion,TRUE);
  769. gtk_entry_completion_set_inline_selection(completion,TRUE);
  770. OBJ_SET(combo_box,"arrow-size",GINT_TO_POINTER(1));
  771. gtk_table_attach(GTK_TABLE(table),combo_box,0,2,1,2,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),(GtkAttachOptions)GTK_FILL,0,0);
  772. OBJ_SET((widget),"combo",combo_box);
  773. OBJ_SET((combo_box),"model",store);
  774. sep = gtk_hseparator_new();
  775. gtk_table_attach(GTK_TABLE(table),sep,0,2,1,2,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),(GtkAttachOptions)GTK_FILL,0,5);
  776. if (OBJ_GET((widget),"datasource"))
  777. set_combo_to_source(combo_box,(gchar *)OBJ_GET((widget),"datasource"));
  778. vbox = GTK_WIDGET(gtk_builder_get_object(properties,"prop_top_vbox"));
  779. OBJ_SET((widget),"prop_table",table);
  780. gtk_box_pack_start(GTK_BOX(vbox),table,FALSE,TRUE,0);
  781. gtk_widget_show_all(vbox);
  782. }
  783. else if (choice == GAUGE_REMOVE)
  784. {
  785. /*printf ("gauge removal\n");*/
  786. changed = TRUE;
  787. table = (GtkWidget *)OBJ_GET((widget),"prop_table");
  788. gtk_widget_destroy(table);
  789. }
  790. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"save_dash_menuitem"),TRUE);
  791. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"save_dash_as_menuitem"),TRUE);
  792. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"close_dash_menuitem"),TRUE);
  793. /*printf("update_properties\n");*/
  794. }
  795. void set_combo_to_source(GtkWidget *combo, gchar * source)
  796. {
  797. GtkTreeModel *model = NULL;
  798. GtkTreeIter iter;
  799. GtkTreeIter parent;
  800. gboolean valid = FALSE;
  801. gboolean found = FALSE;
  802. gchar * potential;
  803. g_return_if_fail(combo);
  804. model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
  805. g_return_if_fail(model);
  806. valid = gtk_tree_model_get_iter_first (model, &parent);
  807. while ((valid) && (!found))
  808. {
  809. if (gtk_tree_model_iter_has_child(model,&parent))
  810. valid = gtk_tree_model_iter_children(model,&iter,&parent);
  811. while ((valid) && (!found))
  812. {
  813. gtk_tree_model_get(model,&iter,DATASOURCE_COL,&potential,-1);
  814. if (!potential)
  815. goto again;
  816. /*if (g_ascii_strcasecmp(potential,source) == 0)*/
  817. if (g_strcmp0(potential,source) == 0)
  818. {
  819. gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo),&iter);
  820. found = TRUE;
  821. }
  822. again:
  823. valid = gtk_tree_model_iter_next (model, &iter);
  824. }
  825. valid = gtk_tree_model_iter_next (model, &parent);
  826. }
  827. changed = TRUE;
  828. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"save_dash_menuitem"),TRUE);
  829. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"save_dash_as_menuitem"),TRUE);
  830. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"close_dash_menuitem"),TRUE);
  831. }
  832. G_MODULE_EXPORT gboolean close_current_dash(GtkWidget *UNUSED(widget), gchar * UNUSED(source))
  833. {
  834. GtkWidget *dash = NULL;
  835. GtkWidget *topwidget = NULL;
  836. GList *children = NULL;
  837. GtkWidget * dialog = NULL;
  838. gint result = 0;
  839. dash = GTK_WIDGET(gtk_builder_get_object(toplevel,"dashboard"));
  840. children = GTK_FIXED(dash)->children;
  841. if ((changed) && (g_list_length(children) > 0))
  842. prompt_to_save();
  843. clear_dashboard(dash);
  844. topwidget = gtk_widget_get_toplevel(GTK_WIDGET(dash));
  845. gtk_window_resize(GTK_WINDOW(topwidget),320,200);
  846. changed = FALSE;
  847. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"save_dash_menuitem"),FALSE);
  848. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"save_dash_as_menuitem"),FALSE);
  849. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"close_dash_menuitem"),FALSE);
  850. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"load_dash_menuitem"),TRUE);
  851. return TRUE;
  852. }
  853. G_MODULE_EXPORT gboolean dummy(GtkWidget *UNUSED(widget), gpointer UNUSED(data))
  854. {
  855. return TRUE;
  856. }
  857. gint list_sort(gconstpointer a, gconstpointer b)
  858. {
  859. gchar *a1 = (gchar *)a;
  860. gchar *b1 = (gchar *)b;
  861. return g_ascii_strcasecmp(a1,b1);
  862. }
  863. void free_element(gpointer data, gpointer UNUSED(user_data))
  864. {
  865. gchar *a = (gchar *)data;
  866. if (a)
  867. g_free(a);
  868. }
  869. G_MODULE_EXPORT gboolean optimize_dash_size(GtkWidget *UNUSED(widget), gpointer UNUSED(data))
  870. {
  871. GtkWidget *dash = NULL;
  872. GtkWidget *g = NULL;
  873. GtkWidget *topwidget = NULL;
  874. GList *children = NULL;
  875. gint w = 0;
  876. gint h = 0;
  877. guint i = 0;
  878. gint left = 0;
  879. gint right = 0;
  880. gint top = 0;
  881. gint bottom = 0;
  882. gint x_shrink = 0;
  883. gint y_shrink = 0;
  884. GtkFixedChild *child = NULL;
  885. GtkAllocation allocation;
  886. dash = GTK_WIDGET(gtk_builder_get_object(toplevel,"dashboard"));
  887. gtk_widget_get_allocation(dash,&allocation);
  888. w = allocation.width;
  889. h = allocation.height;
  890. left = w;
  891. right = 0;
  892. top = h;
  893. bottom = 0;
  894. children = GTK_FIXED(dash)->children;
  895. for (i=0;i<g_list_length(children);i++)
  896. {
  897. child = (GtkFixedChild *)g_list_nth_data(children,i);
  898. g = child->widget;
  899. gtk_widget_get_allocation(g,&allocation);
  900. left = MIN(left,allocation.x);
  901. right = MAX(right,allocation.x+allocation.width);
  902. top = MIN(top,allocation.y);
  903. bottom = MAX(bottom,allocation.y+allocation.height);
  904. }
  905. for (i=0;i<g_list_length(children);i++)
  906. {
  907. child = (GtkFixedChild *)g_list_nth_data(children,i);
  908. g = child->widget;
  909. gtk_widget_get_allocation(g,&allocation);
  910. gtk_fixed_move(GTK_FIXED(gtk_widget_get_parent(g)),g,
  911. allocation.x-left,
  912. allocation.y-top);
  913. }
  914. x_shrink = w-(right-left);
  915. y_shrink = h-(bottom-top);
  916. gtk_widget_set_size_request(GTK_WIDGET(dash),right-left,bottom-top);
  917. topwidget = gtk_widget_get_toplevel(GTK_WIDGET(dash));
  918. gtk_widget_get_allocation(topwidget,&allocation);
  919. gtk_window_resize(GTK_WINDOW(topwidget),allocation.width-x_shrink,allocation.height-y_shrink);
  920. changed = TRUE;
  921. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"save_dash_menuitem"),TRUE);
  922. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"save_dash_as_menuitem"),TRUE);
  923. gtk_widget_set_sensitive((GtkWidget *)OBJ_GET(toplevel,"close_dash_menuitem"),TRUE);
  924. return TRUE;
  925. }