Ignore tags files, merge.
[jelmer/at89prog.git] / at89prog-gtk.c
1 /* 
2         at89prog
3         (c) 2003-2004 Jelmer Vernooij <jelmer@samba.org>
4
5         This program is free software; you can redistribute it and/or modify
6         it under the terms of the GNU General Public License as published by
7         the Free Software Foundation; either version 2 of the License, or
8         (at your option) any later version.
9
10         This program is distributed in the hope that it will be useful,
11         but WITHOUT ANY WARRANTY; without even the implied warranty of
12         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13         GNU General Public License for more details.
14
15         You should have received a copy of the GNU General Public License
16         along with this program; if not, write to the Free Software
17         Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20 #include <sys/types.h>
21 #include <sys/stat.h>
22 #include <unistd.h>
23 #include <string.h>
24 #include <stdio.h>
25
26 #include <gdk/gdkkeysyms.h>
27 #include <gtk/gtk.h>
28 #include <gtkhex.h>
29
30 #include "pins.h"
31 #include "at89ser.h"
32 #include "delays.h"
33 #include "hexfile.h"
34
35 char *buffer = NULL;
36 char *rcfile;
37 size_t bufferlen = 0;
38 GtkWidget* create_aboutwin (void);
39 GtkWidget* create_settingswin (void);
40 HexDocument *data = NULL;
41
42 void update_hex_field() 
43 {
44         /* FIXME */
45 }
46
47 void load_hex_file(const char *file)
48 {
49         FILE *fd = fopen(file, "r");
50         if(buffer)g_free(buffer);
51         bufferlen = 0; buffer = NULL;
52         /* FIXME */
53         fclose(fd);
54         update_hex_field();
55 }
56
57 void save_hex_file(const char *file)
58 {
59         FILE *fd = fopen(file, "w+");
60         /*FIXME*/
61
62         fclose(fd);
63 }
64
65 void on_new_activate (GtkMenuItem *menuitem, gpointer user_data)
66 {
67         if(buffer)g_free(buffer);
68         bufferlen = 0; buffer = NULL;
69         update_hex_field();
70 }
71
72 void on_open_activate (GtkMenuItem *menuitem, gpointer user_data)
73 {
74         GtkWidget *ok_button;
75         GtkWidget *cancel_button;
76         GtkWidget *openfilewin = gtk_file_selection_new ("Select File");
77         guint result;
78         gtk_container_set_border_width (GTK_CONTAINER (openfilewin), 10);
79
80         ok_button = GTK_FILE_SELECTION (openfilewin)->ok_button;
81         gtk_widget_show (ok_button);
82         GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
83
84         cancel_button = GTK_FILE_SELECTION (openfilewin)->cancel_button;
85         gtk_widget_show (cancel_button);
86         GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);
87
88         result = gtk_dialog_run(GTK_DIALOG(openfilewin));
89         switch(result) {
90         case GTK_RESPONSE_OK:
91                 load_hex_file(gtk_file_selection_get_filename(GTK_FILE_SELECTION(openfilewin)));
92                 break;
93
94         default:
95                 break;
96         }
97         gtk_widget_destroy(openfilewin);
98 }
99
100
101 void on_save_as_activate (GtkMenuItem *menuitem, gpointer user_data)
102 {
103         GtkWidget *ok_button;
104         GtkWidget *cancel_button;
105         GtkWidget *savefilewin = gtk_file_selection_new ("Select File");
106         guint result;
107         gtk_container_set_border_width (GTK_CONTAINER (savefilewin), 10);
108
109         ok_button = GTK_FILE_SELECTION (savefilewin)->ok_button;
110         gtk_widget_show (ok_button);
111         GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
112
113         cancel_button = GTK_FILE_SELECTION (savefilewin)->cancel_button;
114         gtk_widget_show (cancel_button);
115         GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);
116
117         result = gtk_dialog_run(GTK_DIALOG(savefilewin));
118         switch(result) {
119         case GTK_RESPONSE_OK:
120                 save_hex_file(gtk_file_selection_get_filename(GTK_FILE_SELECTION(savefilewin)));
121                 break;
122
123         default:
124                 break;
125         }
126         gtk_widget_destroy(savefilewin);
127 }
128
129
130 void on_quit_activate (GtkMenuItem *menuitem, gpointer user_data)
131 {
132         gtk_main_quit();
133 }
134
135
136 void on_settings_activate (GtkMenuItem *menuitem, gpointer user_data)
137 {
138         guint result;
139         GtkWidget *settingswin = create_settingswin();
140         gtk_widget_show_all(settingswin);
141     result = gtk_dialog_run(GTK_DIALOG(settingswin));
142         switch(result) {
143                 case GTK_RESPONSE_OK:
144                         /*FIXME*/
145                         break;
146                 default:
147                         break;
148         }
149
150     gtk_widget_destroy(settingswin);
151 }
152
153
154 void on_reset_activate (GtkMenuItem *menuitem, gpointer user_data)
155 {
156         deactivate();
157 }
158
159 void on_erase_activate (GtkMenuItem *menuitem, gpointer user_data)
160 {
161         programming();
162         erase();
163         /* FIXME */
164 }
165
166
167 void on_download_data_memory_activate (GtkMenuItem *menuitem, gpointer user_data)
168 {
169         /*FIXME*/
170 }
171
172
173 void on_download_code_memory_activate (GtkMenuItem *menuitem, gpointer user_data)
174 {
175         /*FIXME*/
176 }
177
178
179 void on_upload_data_memory_activate (GtkMenuItem *menuitem, gpointer user_data)
180 {
181         /*FIXME*/
182 }
183
184
185 void on_upload_code_memory_activate (GtkMenuItem *menuitem, gpointer user_data)
186 {
187         /*FIXME*/
188 }
189
190
191 void on_about_activate (GtkMenuItem *menuitem, gpointer user_data)
192 {
193         GtkWidget *aboutwin = create_aboutwin();
194     gtk_dialog_run(GTK_DIALOG(aboutwin));
195     gtk_widget_destroy(aboutwin);
196 }
197
198 void
199 hex_cell_data_func (GtkTreeViewColumn *col,
200                     GtkCellRenderer   *renderer,
201                     GtkTreeModel      *model,
202                     GtkTreeIter       *iter,
203                     gpointer           user_data)
204 {
205         int num = GPOINTER_TO_INT(user_data);
206         int hexnum;
207         char buf[64];
208
209         gtk_tree_model_get(model, iter, num, &hexnum, -1);
210
211         g_snprintf(buf, sizeof(buf), "%02x", hexnum);
212
213         g_object_set(renderer, "text", buf, NULL);
214 }
215
216
217 GtkWidget* create_mainwin (void)
218 {
219   GtkWidget *mainwin;
220   GtkWidget *vbox1;
221   GtkWidget *menubar;
222   GtkWidget *menuitem4;
223   GtkWidget *menuitem4_menu;
224   GtkWidget *new;
225   GtkWidget *open;
226   GtkWidget *scrolledwindow1;
227   GtkWidget *save_as;
228   GtkWidget *separatormenuitem1;
229   GtkWidget *quit;
230   GtkWidget *device;
231   GtkWidget *device_menu;
232   GtkWidget *settings;
233   GtkWidget *reset;
234   GtkWidget *erase;
235   GtkWidget *lock;
236   GtkWidget *download1;
237   GtkWidget *download1_menu;
238   GtkWidget *download_data_memory;
239   GtkWidget *download_code_memory;
240   GtkWidget *upload3;
241   GtkWidget *upload3_menu;
242   GtkWidget *upload_data_memory;
243   GtkWidget *upload_code_memory;
244   GtkWidget *menuitem7;
245   GtkWidget *menuitem7_menu;
246   GtkWidget *about;
247   GtkWidget *statusbar;
248   GtkWidget *hexview;
249   GtkCellRenderer *hexrenderer;
250   GtkListStore *hexstore;
251   GtkAccelGroup *accel_group;
252   GtkTreeViewColumn *curcol;
253
254   accel_group = gtk_accel_group_new ();
255
256   mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
257   gtk_window_set_title (GTK_WINDOW (mainwin), "AT89Prog");
258
259   vbox1 = gtk_vbox_new (FALSE, 0);
260   gtk_container_add (GTK_CONTAINER (mainwin), vbox1);
261
262   menubar = gtk_menu_bar_new ();
263   gtk_box_pack_start (GTK_BOX (vbox1), menubar, FALSE, FALSE, 0);
264
265   menuitem4 = gtk_menu_item_new_with_mnemonic ("_File");
266   gtk_container_add (GTK_CONTAINER (menubar), menuitem4);
267
268   menuitem4_menu = gtk_menu_new ();
269   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem4), menuitem4_menu);
270
271   new = gtk_image_menu_item_new_from_stock ("gtk-new", accel_group);
272   gtk_container_add (GTK_CONTAINER (menuitem4_menu), new);
273
274   open = gtk_image_menu_item_new_from_stock ("gtk-open", accel_group);
275   gtk_container_add (GTK_CONTAINER (menuitem4_menu), open);
276
277   save_as = gtk_image_menu_item_new_from_stock ("gtk-save-as", accel_group);
278   gtk_container_add (GTK_CONTAINER (menuitem4_menu), save_as);
279
280   separatormenuitem1 = gtk_menu_item_new ();
281   gtk_container_add (GTK_CONTAINER (menuitem4_menu), separatormenuitem1);
282   gtk_widget_set_sensitive (separatormenuitem1, FALSE);
283
284   quit = gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group);
285   gtk_container_add (GTK_CONTAINER (menuitem4_menu), quit);
286
287   device = gtk_menu_item_new_with_mnemonic ("_Device");
288   gtk_container_add (GTK_CONTAINER (menubar), device);
289
290   device_menu = gtk_menu_new ();
291   gtk_menu_item_set_submenu (GTK_MENU_ITEM (device), device_menu);
292
293   settings = gtk_menu_item_new_with_mnemonic ("_Settings");
294   gtk_container_add (GTK_CONTAINER (device_menu), settings);
295
296   separatormenuitem1 = gtk_menu_item_new ();
297   gtk_container_add (GTK_CONTAINER (device_menu), separatormenuitem1);
298   gtk_widget_set_sensitive (separatormenuitem1, FALSE);
299
300   reset = gtk_menu_item_new_with_mnemonic ("_Reset");
301   gtk_container_add (GTK_CONTAINER (device_menu), reset);
302
303   erase = gtk_menu_item_new_with_mnemonic ("_Erase");
304   gtk_container_add (GTK_CONTAINER (device_menu), erase);
305
306   lock = gtk_menu_item_new_with_mnemonic ("_Lock");
307   gtk_container_add (GTK_CONTAINER (device_menu), lock);
308
309   separatormenuitem1 = gtk_menu_item_new ();
310   gtk_container_add (GTK_CONTAINER (device_menu), separatormenuitem1);
311   gtk_widget_set_sensitive (separatormenuitem1, FALSE);
312
313   download1 = gtk_menu_item_new_with_mnemonic ("_Download");
314   gtk_container_add (GTK_CONTAINER (device_menu), download1);
315
316   download1_menu = gtk_menu_new ();
317   gtk_menu_item_set_submenu (GTK_MENU_ITEM (download1), download1_menu);
318
319   download_data_memory = gtk_menu_item_new_with_mnemonic ("_Data memory");
320   gtk_container_add (GTK_CONTAINER (download1_menu), download_data_memory);
321
322   download_code_memory = gtk_menu_item_new_with_mnemonic ("_Code memory");
323   gtk_container_add (GTK_CONTAINER (download1_menu), download_code_memory);
324
325   upload3 = gtk_menu_item_new_with_mnemonic ("_Upload");
326   gtk_container_add (GTK_CONTAINER (device_menu), upload3);
327
328   upload3_menu = gtk_menu_new ();
329   gtk_menu_item_set_submenu (GTK_MENU_ITEM (upload3), upload3_menu);
330
331   upload_data_memory = gtk_menu_item_new_with_mnemonic ("_Data memory");
332   gtk_container_add (GTK_CONTAINER (upload3_menu), upload_data_memory);
333
334   upload_code_memory = gtk_menu_item_new_with_mnemonic ("_Code memory");
335   gtk_container_add (GTK_CONTAINER (upload3_menu), upload_code_memory);
336
337   menuitem7 = gtk_menu_item_new_with_mnemonic ("_Help");
338   gtk_container_add (GTK_CONTAINER (menubar), menuitem7);
339
340   menuitem7_menu = gtk_menu_new ();
341   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem7), menuitem7_menu);
342
343   about = gtk_menu_item_new_with_mnemonic ("_About");
344   gtk_container_add (GTK_CONTAINER (menuitem7_menu), about);
345
346   scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
347   gtk_widget_show (scrolledwindow1);
348   gtk_box_pack_start (GTK_BOX (vbox1), scrolledwindow1, TRUE, TRUE, 0);
349
350   hexview = gtk_hex_new(data);
351   
352   statusbar = gtk_statusbar_new ();
353   gtk_box_pack_start (GTK_BOX (vbox1), statusbar, FALSE, FALSE, 0);
354
355   g_signal_connect ((gpointer) new, "activate",
356                     G_CALLBACK (on_new_activate),
357                     NULL);
358   g_signal_connect ((gpointer) open, "activate",
359                     G_CALLBACK (on_open_activate),
360                     NULL);
361   g_signal_connect ((gpointer) save_as, "activate",
362                     G_CALLBACK (on_save_as_activate),
363                     NULL);
364   g_signal_connect ((gpointer) quit, "activate",
365                     G_CALLBACK (on_quit_activate),
366                     NULL);
367   g_signal_connect ((gpointer) settings, "activate",
368                     G_CALLBACK (on_settings_activate),
369                     NULL);
370   g_signal_connect ((gpointer) reset, "activate",
371                     G_CALLBACK (on_reset_activate),
372                     NULL);
373   g_signal_connect ((gpointer) erase, "activate",
374                     G_CALLBACK (on_erase_activate),
375                     NULL);
376   g_signal_connect ((gpointer) download_data_memory, "activate",
377                     G_CALLBACK (on_download_data_memory_activate),
378                     NULL);
379   g_signal_connect ((gpointer) download_code_memory, "activate",
380                     G_CALLBACK (on_download_code_memory_activate),
381                     NULL);
382   g_signal_connect ((gpointer) upload_data_memory, "activate",
383                     G_CALLBACK (on_upload_data_memory_activate),
384                     NULL);
385   g_signal_connect ((gpointer) upload_code_memory, "activate",
386                     G_CALLBACK (on_upload_code_memory_activate),
387                     NULL);
388   g_signal_connect ((gpointer) about, "activate",
389                     G_CALLBACK (on_about_activate),
390                     NULL);
391
392   gtk_window_add_accel_group (GTK_WINDOW (mainwin), accel_group);
393
394
395   return mainwin;
396 }
397
398 GtkWidget* create_settingswin (void)
399 {
400   GtkWidget *settingswin;
401   GtkWidget *dialog_vbox1;
402   GtkWidget *vbox1;
403   GtkWidget *frame1;
404   GtkWidget *table1;
405   GtkWidget *label2;
406   GtkWidget *label3;
407   GtkWidget *settings_combo_port_type;
408   GtkWidget *settings_combo_port_type_entry;
409   GtkWidget *settings_combo_port_location;
410   GtkWidget *settings_combo_port_location_entry;
411   GtkWidget *label1;
412   GtkWidget *frame2;
413   GtkWidget *table2;
414   GtkWidget *label5;
415   GtkWidget *label6;
416   GtkWidget *label7;
417   GtkWidget *label8;
418   GtkWidget *label9;
419   GtkWidget *settings_combo_mosi;
420   GtkWidget *settings_combo_mosi_entry;
421   GtkWidget *settings_combo_miso;
422   GtkWidget *settings_combo_miso_entry;
423   GtkWidget *settings_combo_rst;
424   GtkWidget *settings_combo_rst_entry;
425   GtkWidget *settings_combo_chk;
426   GtkWidget *settings_combo_chk_entry;
427   GtkWidget *settings_combo_sck;
428   GtkWidget *settings_combo_sck_entry;
429   GtkWidget *label4;
430   GtkWidget *dialog_action_area1;
431   GtkWidget *cancelbutton1;
432   GtkWidget *applybutton1;
433   GtkWidget *okbutton1;
434
435   settingswin = gtk_dialog_new ();
436   gtk_window_set_title (GTK_WINDOW (settingswin), "Device Settings");
437
438   dialog_vbox1 = GTK_DIALOG (settingswin)->vbox;
439
440   vbox1 = gtk_vbox_new (FALSE, 0);
441   gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
442
443   frame1 = gtk_frame_new (NULL);
444   gtk_box_pack_start (GTK_BOX (vbox1), frame1, TRUE, TRUE, 0);
445
446   table1 = gtk_table_new (2, 2, FALSE);
447   gtk_container_add (GTK_CONTAINER (frame1), table1);
448
449   label2 = gtk_label_new ("Type:");
450   gtk_table_attach (GTK_TABLE (table1), label2, 0, 1, 0, 1,
451                     (GtkAttachOptions) (GTK_FILL),
452                     (GtkAttachOptions) (0), 0, 0);
453   gtk_misc_set_alignment (GTK_MISC (label2), 0, 0.5);
454
455   label3 = gtk_label_new ("Location:");
456   gtk_table_attach (GTK_TABLE (table1), label3, 0, 1, 1, 2,
457                     (GtkAttachOptions) (GTK_FILL),
458                     (GtkAttachOptions) (0), 0, 0);
459   gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5);
460
461   settings_combo_port_type = gtk_combo_new ();
462   g_object_set_data (G_OBJECT (GTK_COMBO (settings_combo_port_type)->popwin),
463                      "GladeParentKey", settings_combo_port_type);
464   gtk_table_attach (GTK_TABLE (table1), settings_combo_port_type, 1, 2, 0, 1,
465                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
466                     (GtkAttachOptions) (0), 0, 0);
467
468   settings_combo_port_type_entry = GTK_COMBO (settings_combo_port_type)->entry;
469
470   settings_combo_port_location = gtk_combo_new ();
471   g_object_set_data (G_OBJECT (GTK_COMBO (settings_combo_port_location)->popwin),
472                      "GladeParentKey", settings_combo_port_location);
473   gtk_table_attach (GTK_TABLE (table1), settings_combo_port_location, 1, 2, 1, 2,
474                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
475                     (GtkAttachOptions) (0), 0, 0);
476
477   settings_combo_port_location_entry = GTK_COMBO (settings_combo_port_location)->entry;
478
479   label1 = gtk_label_new ("Port");
480   gtk_frame_set_label_widget (GTK_FRAME (frame1), label1);
481
482   frame2 = gtk_frame_new (NULL);
483   gtk_box_pack_start (GTK_BOX (vbox1), frame2, TRUE, TRUE, 0);
484
485   table2 = gtk_table_new (5, 2, FALSE);
486   gtk_container_add (GTK_CONTAINER (frame2), table2);
487
488   label5 = gtk_label_new ("MOSI");
489   gtk_table_attach (GTK_TABLE (table2), label5, 0, 1, 0, 1,
490                     (GtkAttachOptions) (GTK_FILL),
491                     (GtkAttachOptions) (0), 0, 0);
492   gtk_misc_set_alignment (GTK_MISC (label5), 0, 0.5);
493
494   label6 = gtk_label_new ("MISO");
495   gtk_table_attach (GTK_TABLE (table2), label6, 0, 1, 1, 2,
496                     (GtkAttachOptions) (GTK_FILL),
497                     (GtkAttachOptions) (0), 0, 0);
498   gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5);
499
500   label7 = gtk_label_new ("RST");
501   gtk_table_attach (GTK_TABLE (table2), label7, 0, 1, 2, 3,
502                     (GtkAttachOptions) (GTK_FILL),
503                     (GtkAttachOptions) (0), 0, 0);
504   gtk_misc_set_alignment (GTK_MISC (label7), 0, 0.5);
505
506   label8 = gtk_label_new ("CHK");
507   gtk_table_attach (GTK_TABLE (table2), label8, 0, 1, 3, 4,
508                     (GtkAttachOptions) (GTK_FILL),
509                     (GtkAttachOptions) (0), 0, 0);
510   gtk_misc_set_alignment (GTK_MISC (label8), 0, 0.5);
511
512   label9 = gtk_label_new ("SCK");
513   gtk_table_attach (GTK_TABLE (table2), label9, 0, 1, 4, 5,
514                     (GtkAttachOptions) (GTK_FILL),
515                     (GtkAttachOptions) (0), 0, 0);
516   gtk_misc_set_alignment (GTK_MISC (label9), 0, 0.5);
517
518   settings_combo_mosi = gtk_combo_new ();
519   g_object_set_data (G_OBJECT (GTK_COMBO (settings_combo_mosi)->popwin),
520                      "GladeParentKey", settings_combo_mosi);
521   gtk_table_attach (GTK_TABLE (table2), settings_combo_mosi, 1, 2, 0, 1,
522                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
523                     (GtkAttachOptions) (0), 0, 0);
524
525   settings_combo_mosi_entry = GTK_COMBO (settings_combo_mosi)->entry;
526
527   settings_combo_miso = gtk_combo_new ();
528   g_object_set_data (G_OBJECT (GTK_COMBO (settings_combo_miso)->popwin),
529                      "GladeParentKey", settings_combo_miso);
530   gtk_table_attach (GTK_TABLE (table2), settings_combo_miso, 1, 2, 1, 2,
531                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
532                     (GtkAttachOptions) (0), 0, 0);
533
534   settings_combo_miso_entry = GTK_COMBO (settings_combo_miso)->entry;
535
536   settings_combo_rst = gtk_combo_new ();
537   g_object_set_data (G_OBJECT (GTK_COMBO (settings_combo_rst)->popwin),
538                      "GladeParentKey", settings_combo_rst);
539   gtk_table_attach (GTK_TABLE (table2), settings_combo_rst, 1, 2, 2, 3,
540                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
541                     (GtkAttachOptions) (0), 0, 0);
542
543   settings_combo_rst_entry = GTK_COMBO (settings_combo_rst)->entry;
544
545   settings_combo_chk = gtk_combo_new ();
546   g_object_set_data (G_OBJECT (GTK_COMBO (settings_combo_chk)->popwin),
547                      "GladeParentKey", settings_combo_chk);
548   gtk_table_attach (GTK_TABLE (table2), settings_combo_chk, 1, 2, 3, 4,
549                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
550                     (GtkAttachOptions) (0), 0, 0);
551
552   settings_combo_chk_entry = GTK_COMBO (settings_combo_chk)->entry;
553
554   settings_combo_sck = gtk_combo_new ();
555   g_object_set_data (G_OBJECT (GTK_COMBO (settings_combo_sck)->popwin),
556                      "GladeParentKey", settings_combo_sck);
557   gtk_table_attach (GTK_TABLE (table2), settings_combo_sck, 1, 2, 4, 5,
558                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
559                     (GtkAttachOptions) (0), 0, 0);
560
561   settings_combo_sck_entry = GTK_COMBO (settings_combo_sck)->entry;
562
563   label4 = gtk_label_new ("Pins:");
564   gtk_frame_set_label_widget (GTK_FRAME (frame2), label4);
565
566   dialog_action_area1 = GTK_DIALOG (settingswin)->action_area;
567   gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
568
569   cancelbutton1 = gtk_button_new_from_stock ("gtk-cancel");
570   gtk_dialog_add_action_widget (GTK_DIALOG (settingswin), cancelbutton1, GTK_RESPONSE_CANCEL);
571   GTK_WIDGET_SET_FLAGS (cancelbutton1, GTK_CAN_DEFAULT);
572
573   applybutton1 = gtk_button_new_from_stock ("gtk-apply");
574   gtk_dialog_add_action_widget (GTK_DIALOG (settingswin), applybutton1, GTK_RESPONSE_APPLY);
575   GTK_WIDGET_SET_FLAGS (applybutton1, GTK_CAN_DEFAULT);
576
577   okbutton1 = gtk_button_new_from_stock ("gtk-ok");
578   gtk_dialog_add_action_widget (GTK_DIALOG (settingswin), okbutton1, GTK_RESPONSE_OK);
579   GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
580
581   return settingswin;
582 }
583
584 GtkWidget* create_aboutwin (void)
585 {
586   GtkWidget *aboutwin;
587   GtkWidget *dialog_vbox2;
588   GtkWidget *vbox2;
589   GtkWidget *label10;
590   GtkWidget *label11;
591   GtkWidget *dialog_action_area2;
592   GtkWidget *closebutton1;
593
594   aboutwin = gtk_dialog_new ();
595   gtk_window_set_title (GTK_WINDOW (aboutwin), "About AT89Prog");
596   gtk_window_set_resizable (GTK_WINDOW (aboutwin), FALSE);
597
598   dialog_vbox2 = GTK_DIALOG (aboutwin)->vbox;
599   gtk_widget_show (dialog_vbox2);
600
601   vbox2 = gtk_vbox_new (FALSE, 0);
602   gtk_widget_show (vbox2);
603   gtk_box_pack_start (GTK_BOX (dialog_vbox2), vbox2, TRUE, TRUE, 0);
604
605   label10 = gtk_label_new ("<b>AT89Prog</b>");
606   gtk_widget_show (label10);
607   gtk_box_pack_start (GTK_BOX (vbox2), label10, FALSE, FALSE, 0);
608   gtk_label_set_use_markup (GTK_LABEL (label10), TRUE);
609
610   label11 = gtk_label_new ("(C) 2003-2004 Jelmer Vernooij &lt;jelmer@samba.org&gt;\n\nFor more information, see:\n\nhttp://jelmer.vernstok.nl/oss/at89prog/\n");
611   gtk_widget_show (label11);
612   gtk_box_pack_start (GTK_BOX (vbox2), label11, FALSE, FALSE, 0);
613   gtk_label_set_use_markup (GTK_LABEL (label11), TRUE);
614
615   dialog_action_area2 = GTK_DIALOG (aboutwin)->action_area;
616   gtk_widget_show (dialog_action_area2);
617   gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2), GTK_BUTTONBOX_END);
618
619   closebutton1 = gtk_button_new_from_stock ("gtk-close");
620   gtk_widget_show (closebutton1);
621   gtk_dialog_add_action_widget (GTK_DIALOG (aboutwin), closebutton1, GTK_RESPONSE_CLOSE);
622   GTK_WIDGET_SET_FLAGS (closebutton1, GTK_CAN_DEFAULT);
623
624   return aboutwin;
625 }
626
627 int main (int argc, char *argv[])
628 {
629   GtkWidget *mainwin;
630
631   gtk_init (&argc, &argv);
632
633   rcfile = g_strdup_printf("%s/.at89progrc", g_get_home_dir());
634   pins_read_config_file(rcfile);
635
636   mainwin = create_mainwin ();
637   gtk_widget_show_all(mainwin);
638
639   gtk_main ();
640   deactivate();
641   return 0;
642 }