8 #include "stlink-gui.h"
10 #define MEM_READ_SIZE 1024
13 #define G_VALUE_INIT {0, {{0}}}
16 G_DEFINE_TYPE (STlinkGUI, stlink_gui, G_TYPE_OBJECT);
19 stlink_gui_dispose (GObject *gobject)
21 G_OBJECT_CLASS (stlink_gui_parent_class)->dispose (gobject);
25 stlink_gui_finalize (GObject *gobject)
27 G_OBJECT_CLASS (stlink_gui_parent_class)->finalize (gobject);
31 stlink_gui_class_init (STlinkGUIClass *klass)
33 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
35 gobject_class->dispose = stlink_gui_dispose;
36 gobject_class->finalize = stlink_gui_finalize;
40 stlink_gui_init (STlinkGUI *self)
43 self->filename = NULL;
45 self->progress.activity_mode = FALSE;
46 self->progress.fraction = 0;
48 self->flash_mem.memory = NULL;
49 self->flash_mem.size = 0;
50 self->flash_mem.base = 0;
52 self->file_mem.memory = NULL;
53 self->file_mem.size = 0;
54 self->file_mem.base = 0;
58 set_info_error_message_idle (STlinkGUI *gui)
60 if (gui->error_message != NULL) {
63 markup = g_markup_printf_escaped ("<b>%s</b>", gui->error_message);
64 gtk_label_set_markup (gui->infolabel, markup);
65 gtk_info_bar_set_message_type (gui->infobar, GTK_MESSAGE_ERROR);
66 gtk_widget_show (GTK_WIDGET (gui->infobar));
69 g_free (gui->error_message);
70 gui->error_message = NULL;
76 stlink_gui_set_info_error_message (STlinkGUI *gui, const gchar *message)
78 gui->error_message = g_strdup (message);
79 g_idle_add ((GSourceFunc) set_info_error_message_idle, gui);
83 stlink_gui_set_sensitivity (STlinkGUI *gui, gboolean sensitivity)
85 gtk_widget_set_sensitive (GTK_WIDGET (gui->open_button), sensitivity);
87 if (sensitivity && gui->sl)
88 gtk_widget_set_sensitive (GTK_WIDGET (gui->disconnect_button), sensitivity);
90 if (sensitivity && !gui->sl)
91 gtk_widget_set_sensitive (GTK_WIDGET (gui->connect_button), sensitivity);
93 if (sensitivity && gui->sl && gui->filename)
94 gtk_widget_set_sensitive (GTK_WIDGET (gui->flash_button), sensitivity);
98 mem_view_init_headers (GtkTreeView *view)
100 GtkCellRenderer *renderer;
103 g_return_if_fail (view != NULL);
105 renderer = gtk_cell_renderer_text_new ();
106 gtk_tree_view_insert_column_with_attributes (view,
113 for (i = 0; i < 4; i++) {
116 label = g_strdup_printf ("%X", i * 4);
117 renderer = gtk_cell_renderer_text_new ();
118 gtk_tree_view_insert_column_with_attributes (view,
123 (i + 1), /* column */
128 for (i = 0; i < 5; i++) {
129 GtkTreeViewColumn *column = gtk_tree_view_get_column (view, i);
130 gtk_tree_view_column_set_expand (column, TRUE);
135 mem_view_add_as_hex (GtkListStore *store,
142 hex_str = g_strdup_printf ("0x%08X", value);
143 gtk_list_store_set (store, iter, column, hex_str, -1);
148 mem_view_add_buffer (GtkListStore *store,
158 step = sizeof (*word);
160 for (i = 0; i < len; i += step) {
161 word = (guint *) &buffer[i];
165 gtk_list_store_append (store, iter);
168 mem_view_add_as_hex (store, iter, column, (address + i));
170 mem_view_add_as_hex (store, iter, (column + 1), *word);
171 column = (column + 1) % step;
176 hexstr_to_guint32 (const gchar *str, GError **err)
181 val = strtoul (str, &end_ptr, 16);
182 if ((errno == ERANGE && val == LONG_MAX) || (errno != 0 && val == 0)) {
184 g_quark_from_string ("hextou32"),
186 "Invalid hexstring");
189 if (end_ptr == str) {
191 g_quark_from_string ("hextou32"),
193 "Invalid hexstring");
201 stlink_gui_update_mem_view (STlinkGUI *gui, struct mem_t *mem, GtkTreeView *view) {
205 store = GTK_LIST_STORE (gtk_tree_view_get_model (view));
207 mem_view_add_buffer (store,
213 gtk_widget_hide (GTK_WIDGET (gui->progress.bar));
214 gtk_progress_bar_set_fraction (gui->progress.bar, 0);
215 stlink_gui_set_sensitivity (gui, TRUE);
219 stlink_gui_update_devmem_view (STlinkGUI *gui)
221 stlink_gui_update_mem_view (gui, &gui->flash_mem, gui->devmem_treeview);
227 stlink_gui_populate_devmem_view (STlinkGUI *gui)
232 g_return_if_fail (gui != NULL);
233 g_return_if_fail (gui->sl != NULL);
235 addr = gui->sl->flash_base;
237 if (gui->flash_mem.memory) {
238 g_free (gui->flash_mem.memory);
240 gui->flash_mem.memory = g_malloc (gui->sl->flash_size);
241 gui->flash_mem.size = gui->sl->flash_size;
242 gui->flash_mem.base = gui->sl->flash_base;
244 for (off = 0; off < gui->sl->flash_size; off += MEM_READ_SIZE) {
245 guint n_read = MEM_READ_SIZE;
247 if (off + MEM_READ_SIZE > gui->sl->flash_size) {
248 n_read = gui->sl->flash_size - off;
250 /* align if needed */
252 n_read = (n_read + 4) & ~(3);
255 /* reads to sl->q_buf */
256 stlink_read_mem32(gui->sl, addr + off, n_read);
257 if (gui->sl->q_len < 0) {
258 stlink_gui_set_info_error_message (gui, "Failed to read memory");
259 g_free (gui->flash_mem.memory);
260 gui->flash_mem.memory = NULL;
263 memcpy (gui->flash_mem.memory + off, gui->sl->q_buf, n_read);
264 gui->progress.fraction = (gdouble) (off + n_read) / gui->sl->flash_size;
266 g_idle_add ((GSourceFunc) stlink_gui_update_devmem_view, gui);
270 stlink_gui_update_filemem_view (STlinkGUI *gui)
274 basename = g_path_get_basename (gui->filename);
275 gtk_notebook_set_tab_label_text (gui->notebook,
276 GTK_WIDGET (gtk_notebook_get_nth_page (gui->notebook, 1)),
280 stlink_gui_update_mem_view (gui, &gui->file_mem, gui->filemem_treeview);
286 stlink_gui_populate_filemem_view (STlinkGUI *gui)
288 guchar buffer[MEM_READ_SIZE];
290 GFileInfo *file_info;
291 GInputStream *input_stream;
295 g_return_val_if_fail (gui != NULL, NULL);
296 g_return_val_if_fail (gui->filename != NULL, NULL);
298 file = g_file_new_for_path (gui->filename);
299 input_stream = G_INPUT_STREAM (g_file_read (file, NULL, &err));
301 stlink_gui_set_info_error_message (gui, err->message);
306 file_info = g_file_input_stream_query_info (G_FILE_INPUT_STREAM (input_stream),
307 G_FILE_ATTRIBUTE_STANDARD_SIZE, NULL, &err);
309 stlink_gui_set_info_error_message (gui, err->message);
313 if (gui->file_mem.memory) {
314 g_free (gui->file_mem.memory);
316 gui->file_mem.size = g_file_info_get_size (file_info);
317 gui->file_mem.memory = g_malloc (gui->file_mem.size);
319 for (off = 0; off < gui->file_mem.size; off += MEM_READ_SIZE) {
320 guint n_read = MEM_READ_SIZE;
322 if (off + MEM_READ_SIZE > gui->file_mem.size) {
323 n_read = gui->file_mem.size - off;
326 if (g_input_stream_read (G_INPUT_STREAM (input_stream),
327 &buffer, n_read, NULL, &err) == -1) {
328 stlink_gui_set_info_error_message (gui, err->message);
332 memcpy (gui->file_mem.memory + off, buffer, n_read);
333 gui->progress.fraction = (gdouble) (off + n_read) / gui->file_mem.size;
335 g_idle_add ((GSourceFunc) stlink_gui_update_filemem_view, gui);
338 g_object_unref (input_stream);
340 g_object_unref (file);
344 static void mem_jmp (GtkTreeView *view,
354 jmp_addr = hexstr_to_guint32 (gtk_entry_get_text (entry), err);
359 if (jmp_addr < base_addr || jmp_addr > base_addr + size) {
361 g_quark_from_string ("mem_jmp"),
367 model = gtk_tree_view_get_model (view);
372 if (gtk_tree_model_get_iter_first (model, &iter)) {
375 GValue value = G_VALUE_INIT;
378 gtk_tree_model_get_value (model, &iter, 0, &value);
379 if (G_VALUE_HOLDS_STRING (&value)) {
380 addr = hexstr_to_guint32 (g_value_get_string (&value), &err);
382 if (addr == (jmp_addr & 0xFFFFFFF0)) {
383 GtkTreeSelection *selection;
386 selection = gtk_tree_view_get_selection (view);
387 path = gtk_tree_model_get_path (model, &iter);
389 gtk_tree_selection_select_iter (selection, &iter);
390 gtk_tree_view_scroll_to_cell (view,
396 gtk_tree_path_free (path);
400 g_value_unset (&value);
401 } while (gtk_tree_model_iter_next (model, &iter));
406 devmem_jmp_cb (GtkWidget *widget, gpointer data)
411 gui = STLINK_GUI (data);
413 mem_jmp (gui->devmem_treeview,
414 gui->devmem_jmp_entry,
420 stlink_gui_set_info_error_message (gui, err->message);
426 filemem_jmp_cb (GtkWidget *widget, gpointer data)
431 gui = STLINK_GUI (data);
433 g_return_if_fail (gui->filename != NULL);
435 mem_jmp (gui->filemem_treeview,
436 gui->filemem_jmp_entry,
442 stlink_gui_set_info_error_message (gui, err->message);
448 dev_format_chip_id (guint32 chip_id)
450 const struct stlink_chipid_params *params;
453 params = stlink_chipid_get_params(chip_id);
455 return g_strdup_printf ("0x%x", chip_id);
457 return g_strdup (params->description);
461 dev_format_mem_size (gsize flash_size)
463 return g_strdup_printf ("%u kB", flash_size / 1024);
468 stlink_gui_set_connected (STlinkGUI *gui)
474 gtk_statusbar_push (gui->statusbar,
475 gtk_statusbar_get_context_id (gui->statusbar, "conn"),
478 gtk_widget_set_sensitive (GTK_WIDGET (gui->device_frame), TRUE);
479 gtk_widget_set_sensitive (GTK_WIDGET (gui->devmem_box), TRUE);
480 gtk_widget_set_sensitive (GTK_WIDGET (gui->connect_button), FALSE);
483 gtk_widget_set_sensitive (GTK_WIDGET (gui->flash_button), TRUE);
486 tmp_str = dev_format_chip_id (gui->sl->chip_id);
487 gtk_label_set_text (gui->chip_id_label, tmp_str);
490 tmp_str = g_strdup_printf ("0x%x", gui->sl->core_id);
491 gtk_label_set_text (gui->core_id_label, tmp_str);
494 tmp_str = dev_format_mem_size (gui->sl->flash_size);
495 gtk_label_set_text (gui->flash_size_label, tmp_str);
498 tmp_str = dev_format_mem_size (gui->sl->sram_size);
499 gtk_label_set_text (gui->ram_size_label, tmp_str);
502 tmp_str = g_strdup_printf ("0x%08X", gui->sl->flash_base);
503 gtk_entry_set_text (gui->devmem_jmp_entry, tmp_str);
504 gtk_editable_set_editable (GTK_EDITABLE (gui->devmem_jmp_entry), TRUE);
507 store = GTK_LIST_STORE (gtk_tree_view_get_model (gui->devmem_treeview));
508 if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) {
509 gtk_list_store_clear (store);
512 stlink_gui_set_sensitivity (gui, FALSE);
513 gtk_notebook_set_current_page (gui->notebook, PAGE_DEVMEM);
514 gtk_widget_show (GTK_WIDGET (gui->progress.bar));
515 gtk_progress_bar_set_text (gui->progress.bar, "Reading memory");
517 g_thread_new ("devmem", (GThreadFunc) stlink_gui_populate_devmem_view, gui);
521 connect_button_cb (GtkWidget *widget, gpointer data)
526 gui = STLINK_GUI (data);
531 /* try version 1 then version 2 */
532 gui->sl = stlink_v1_open(0, 1);
533 if (gui->sl == NULL) {
534 gui->sl = stlink_open_usb(0, 1, NULL);
536 if (gui->sl == NULL) {
537 stlink_gui_set_info_error_message (gui, "Failed to connect to STLink."); return;
540 /* code below taken from flash/main.c, refactoring might be in order */
541 if (stlink_current_mode(gui->sl) == STLINK_DEV_DFU_MODE)
542 stlink_exit_dfu_mode(gui->sl);
544 if (stlink_current_mode(gui->sl) != STLINK_DEV_DEBUG_MODE)
545 stlink_enter_swd_mode(gui->sl);
547 /* Disable DMA - Set All DMA CCR Registers to zero. - AKS 1/7/2013 */
548 if (gui->sl->chip_id == STLINK_CHIPID_STM32_F4) {
549 memset(gui->sl->q_buf, 0, 4);
550 for (i = 0; i < 8; i++) {
551 stlink_write_mem32(gui->sl, 0x40026000 + 0x10 + 0x18 * i, 4);
552 stlink_write_mem32(gui->sl, 0x40026400 + 0x10 + 0x18 * i, 4);
553 stlink_write_mem32(gui->sl, 0x40026000 + 0x24 + 0x18 * i, 4);
554 stlink_write_mem32(gui->sl, 0x40026400 + 0x24 + 0x18 * i, 4);
557 stlink_gui_set_connected (gui);
560 static void stlink_gui_set_disconnected (STlinkGUI *gui)
562 gtk_statusbar_push (gui->statusbar,
563 gtk_statusbar_get_context_id (gui->statusbar, "conn"),
566 gtk_widget_set_sensitive (GTK_WIDGET (gui->device_frame), FALSE);
567 gtk_widget_set_sensitive (GTK_WIDGET (gui->flash_button), FALSE);
568 gtk_widget_set_sensitive (GTK_WIDGET (gui->disconnect_button), FALSE);
569 gtk_widget_set_sensitive (GTK_WIDGET (gui->connect_button), TRUE);
573 disconnect_button_cb (GtkWidget *widget, gpointer data)
577 gui = STLINK_GUI (data);
579 if (gui->sl != NULL) {
580 stlink_exit_debug_mode(gui->sl);
581 stlink_close(gui->sl);
584 stlink_gui_set_disconnected (gui);
589 stlink_gui_open_file (STlinkGUI *gui)
595 dialog = gtk_file_chooser_dialog_new ("Open file",
597 GTK_FILE_CHOOSER_ACTION_OPEN,
598 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
599 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
602 if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
604 gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
606 store = GTK_LIST_STORE (gtk_tree_view_get_model (gui->filemem_treeview));
607 if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) {
608 gtk_list_store_clear (store);
611 stlink_gui_set_sensitivity (gui, FALSE);
612 gtk_notebook_set_current_page (gui->notebook, PAGE_FILEMEM);
613 gtk_widget_show (GTK_WIDGET (gui->progress.bar));
614 gtk_progress_bar_set_text (gui->progress.bar, "Reading file");
615 g_thread_new ("file", (GThreadFunc) stlink_gui_populate_filemem_view, gui);
617 gtk_widget_destroy (dialog);
621 open_button_cb (GtkWidget *widget, gpointer data)
625 gui = STLINK_GUI (data);
627 stlink_gui_open_file (gui);
631 stlink_gui_write_flash_update (STlinkGUI *gui)
633 stlink_gui_set_sensitivity (gui, TRUE);
634 gui->progress.activity_mode = FALSE;
635 gtk_widget_hide (GTK_WIDGET (gui->progress.bar));
641 stlink_gui_write_flash (STlinkGUI *gui)
643 g_return_if_fail (gui->sl != NULL);
644 g_return_if_fail (gui->filename != NULL);
646 if (stlink_fwrite_flash(gui->sl, gui->filename, gui->sl->flash_base) < 0) {
647 stlink_gui_set_info_error_message (gui, "Failed to write to flash");
650 g_idle_add ((GSourceFunc) stlink_gui_write_flash_update, gui);
654 flash_button_cb (GtkWidget *widget, gpointer data)
662 gui = STLINK_GUI (data);
663 g_return_if_fail (gui->sl != NULL);
665 if (!g_strcmp0 (gtk_entry_get_text (gui->flash_dialog_entry), "")) {
666 tmp_str = g_strdup_printf ("0x%08X", gui->sl->flash_base);
667 gtk_entry_set_text (gui->flash_dialog_entry, tmp_str);
671 result = gtk_dialog_run (gui->flash_dialog);
672 if (result == GTK_RESPONSE_OK) {
673 address = hexstr_to_guint32 (gtk_entry_get_text (gui->flash_dialog_entry),
676 stlink_gui_set_info_error_message (gui, err->message);
678 if (address > gui->sl->flash_base + gui->sl->flash_size ||
679 address < gui->sl->flash_base) {
680 stlink_gui_set_info_error_message (gui, "Invalid address");
682 else if (address + gui->file_mem.size >
683 gui->sl->flash_base + gui->sl->flash_size) {
684 stlink_gui_set_info_error_message (gui, "Binary overwrites flash");
686 stlink_gui_set_sensitivity (gui, FALSE);
687 gtk_progress_bar_set_text (gui->progress.bar,
689 gui->progress.activity_mode = TRUE;
690 gtk_widget_show (GTK_WIDGET (gui->progress.bar));
691 g_thread_new ("flash",
692 (GThreadFunc) stlink_gui_write_flash, gui);
699 progress_pulse_timeout (STlinkGUI *gui) {
700 if (gui->progress.activity_mode) {
701 gtk_progress_bar_pulse (gui->progress.bar);
703 gtk_progress_bar_set_fraction (gui->progress.bar, gui->progress.fraction);
709 notebook_switch_page_cb (GtkNotebook *notebook,
716 gui = STLINK_GUI (data);
719 if (gui->filename == NULL) {
720 stlink_gui_open_file (gui);
726 dnd_received_cb (GtkWidget *widget,
727 GdkDragContext *context,
730 GtkSelectionData *selection_data,
737 const guchar *file_data;
738 STlinkGUI *gui = STLINK_GUI (data);
742 if (selection_data != NULL &&
743 gtk_selection_data_get_length (selection_data) > 0) {
744 switch (target_type) {
745 case TARGET_FILENAME:
748 g_free (gui->filename);
751 file_data = gtk_selection_data_get_data (selection_data);
752 file_list = g_strsplit ((gchar *)file_data, "\r\n", 0);
754 file_uri = g_file_new_for_uri (file_list[0]);
755 gui->filename = g_file_get_path (file_uri);
757 g_strfreev (file_list);
758 g_object_unref (file_uri);
761 store = GTK_LIST_STORE (gtk_tree_view_get_model (gui->devmem_treeview));
762 if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) {
763 gtk_list_store_clear (store);
766 stlink_gui_set_sensitivity (gui, FALSE);
767 gtk_notebook_set_current_page (gui->notebook, PAGE_FILEMEM);
768 gtk_widget_show (GTK_WIDGET (gui->progress.bar));
769 gtk_progress_bar_set_text (gui->progress.bar, "Reading file");
770 g_thread_new ("file", (GThreadFunc) stlink_gui_populate_filemem_view, gui);
774 gtk_drag_finish (context,
776 gdk_drag_context_get_suggested_action (context) == GDK_ACTION_MOVE,
781 stlink_gui_init_dnd (STlinkGUI *gui)
783 GtkTargetEntry target_list[] = {
784 { "text/uri-list", 0, TARGET_FILENAME },
787 gtk_drag_dest_set (GTK_WIDGET (gui->window),
788 GTK_DEST_DEFAULT_ALL,
790 G_N_ELEMENTS (target_list),
793 g_signal_connect (gui->window, "drag-data-received",
794 G_CALLBACK (dnd_received_cb), gui);
798 stlink_gui_build_ui (STlinkGUI *gui) {
800 GtkListStore *devmem_store;
801 GtkListStore *filemem_store;
802 gchar *ui_file = STLINK_UI_DIR "/stlink-gui.ui";
804 if (!g_file_test (ui_file, G_FILE_TEST_EXISTS)) {
805 ui_file = "stlink-gui.ui";
807 builder = gtk_builder_new ();
808 if (!gtk_builder_add_from_file (builder, ui_file, NULL)) {
809 g_printerr ("Failed to load UI file: %s\n", ui_file);
813 gui->window = GTK_WINDOW (gtk_builder_get_object (builder, "window"));
814 g_signal_connect (G_OBJECT (gui->window), "destroy",
815 G_CALLBACK (gtk_main_quit), NULL);
817 /* set up toolutton clicked callbacks */
819 GTK_TOOL_BUTTON (gtk_builder_get_object (builder, "open_button"));
820 g_signal_connect (G_OBJECT (gui->open_button), "clicked",
821 G_CALLBACK (open_button_cb), gui);
823 gui->connect_button =
824 GTK_TOOL_BUTTON (gtk_builder_get_object (builder, "connect_button"));
825 g_signal_connect (G_OBJECT (gui->connect_button), "clicked",
826 G_CALLBACK (connect_button_cb), gui);
828 gui->disconnect_button =
829 GTK_TOOL_BUTTON (gtk_builder_get_object (builder, "disconnect_button"));
830 g_signal_connect (G_OBJECT (gui->disconnect_button), "clicked",
831 G_CALLBACK (disconnect_button_cb), gui);
834 GTK_TOOL_BUTTON (gtk_builder_get_object (builder, "flash_button"));
835 g_signal_connect (G_OBJECT (gui->flash_button), "clicked",
836 G_CALLBACK (flash_button_cb), gui);
838 gui->devmem_treeview =
839 GTK_TREE_VIEW (gtk_builder_get_object (builder, "devmem_treeview"));
840 gtk_tree_view_set_rules_hint (gui->devmem_treeview, TRUE);
841 mem_view_init_headers (gui->devmem_treeview);
842 devmem_store = gtk_list_store_new (5,
848 gtk_tree_view_set_model (gui->devmem_treeview, GTK_TREE_MODEL (devmem_store));
849 g_object_unref (devmem_store);
851 gui->filemem_treeview =
852 GTK_TREE_VIEW (gtk_builder_get_object (builder, "filemem_treeview"));
853 gtk_tree_view_set_rules_hint (gui->filemem_treeview, TRUE);
854 mem_view_init_headers (gui->filemem_treeview);
855 filemem_store = gtk_list_store_new (5,
861 gtk_tree_view_set_model (gui->filemem_treeview, GTK_TREE_MODEL (filemem_store));
862 g_object_unref (filemem_store);
865 GTK_LABEL (gtk_builder_get_object (builder, "core_id_value"));
868 GTK_LABEL (gtk_builder_get_object (builder, "chip_id_value"));
870 gui->flash_size_label =
871 GTK_LABEL (gtk_builder_get_object (builder, "flash_size_value"));
873 gui->ram_size_label =
874 GTK_LABEL (gtk_builder_get_object (builder, "ram_size_value"));
877 GTK_FRAME (gtk_builder_get_object (builder, "device_frame"));
880 GTK_NOTEBOOK (gtk_builder_get_object (builder, "mem_notebook"));
881 g_signal_connect (gui->notebook, "switch-page",
882 G_CALLBACK (notebook_switch_page_cb), gui);
885 GTK_BOX (gtk_builder_get_object (builder, "devmem_box"));
888 GTK_BOX (gtk_builder_get_object (builder, "filemem_box"));
890 gui->devmem_jmp_entry =
891 GTK_ENTRY (gtk_builder_get_object (builder, "devmem_jmp_entry"));
892 g_signal_connect (gui->devmem_jmp_entry, "activate",
893 G_CALLBACK (devmem_jmp_cb), gui);
895 gui->filemem_jmp_entry =
896 GTK_ENTRY (gtk_builder_get_object (builder, "filemem_jmp_entry"));
897 g_signal_connect (gui->filemem_jmp_entry, "activate",
898 G_CALLBACK (filemem_jmp_cb), gui);
899 gtk_editable_set_editable (GTK_EDITABLE (gui->filemem_jmp_entry), TRUE);
902 GTK_PROGRESS_BAR (gtk_builder_get_object (builder, "progressbar"));
903 gtk_progress_bar_set_show_text (gui->progress.bar, TRUE);
904 gui->progress.timer = g_timeout_add (100,
905 (GSourceFunc) progress_pulse_timeout,
909 GTK_STATUSBAR (gtk_builder_get_object (builder, "statusbar"));
912 GTK_INFO_BAR (gtk_builder_get_object (builder, "infobar"));
913 gtk_info_bar_add_button (gui->infobar, GTK_STOCK_OK, GTK_RESPONSE_OK);
914 gui->infolabel = GTK_LABEL (gtk_label_new (""));
915 gtk_container_add (GTK_CONTAINER (gtk_info_bar_get_content_area (gui->infobar)),
916 GTK_WIDGET (gui->infolabel));
917 g_signal_connect (gui->infobar, "response", G_CALLBACK (gtk_widget_hide), NULL);
921 GTK_DIALOG (gtk_builder_get_object (builder, "flash_dialog"));
922 g_signal_connect_swapped (gui->flash_dialog, "response",
923 G_CALLBACK (gtk_widget_hide), gui->flash_dialog);
925 gui->flash_dialog_ok =
926 GTK_BUTTON (gtk_builder_get_object (builder, "flash_dialog_ok_button"));
928 gui->flash_dialog_cancel =
929 GTK_BUTTON (gtk_builder_get_object (builder, "flash_dialog_cancel_button"));
931 gui->flash_dialog_entry =
932 GTK_ENTRY (gtk_builder_get_object (builder, "flash_dialog_entry"));
935 gtk_widget_show_all (GTK_WIDGET (gui->window));
936 gtk_widget_hide (GTK_WIDGET (gui->infobar));
937 gtk_widget_hide (GTK_WIDGET (gui->progress.bar));
939 stlink_gui_set_disconnected (gui);
943 main (int argc, char **argv)
947 gtk_init (&argc, &argv);
949 gui = g_object_new (STLINK_TYPE_GUI, NULL);
950 stlink_gui_build_ui (gui);
951 stlink_gui_init_dnd (gui);