usbonly checkbox callback
[instimg] / src / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <ctype.h>
4 #include <windows.h>
5 #include "widgets.h"
6 #include "rawdisk.h"
7
8 static struct wgt_window *win;
9 static struct wgt_widget *lb_instto, *bn_inst, *bn_cancel, *cb_devs, *ck_usbonly;
10
11 static struct rawdisk_device rawdev[64];
12 static const char *items[64];
13 static int num_rawdev;
14
15
16 static void update_disks(void);
17 static void onclick(struct wgt_widget *w);
18 static void onmodify(struct wgt_widget *w);
19 static void ck_usbonly_handler(struct wgt_widget *w);
20
21
22 int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprevinst, char *cmdline, int showcmd)
23 {
24         int x, y;
25         MSG msg;
26
27
28         if(!(win = wgt_window("256boss USB stick installer", 400, 300))) {
29                 return 1;
30         }
31         lb_instto = wgt_label(win, "Install to device:", 10, 10);
32
33         x = wgt_xpos_after(lb_instto, WGT_AUTO);
34         cb_devs = wgt_combo(win, items, num_rawdev, 0, x, 10, 200, WGT_AUTO, onmodify);
35
36         y = wgt_ypos_after(cb_devs, 16);
37         ck_usbonly = wgt_checkbox(win, "only show USB devices", 1, x, y,
38                         WGT_AUTO, WGT_AUTO, ck_usbonly_handler);
39
40         y = wgt_ypos_after(ck_usbonly, 16);
41         bn_inst = wgt_button(win, "Install", 10, y, WGT_AUTO, WGT_AUTO, onclick);
42
43         x = wgt_xpos_after(bn_inst, WGT_AUTO);
44         bn_cancel = wgt_button(win, "Cancel", x, y, WGT_AUTO, WGT_AUTO, onclick);
45
46         update_disks();
47
48         while(GetMessage(&msg, 0, 0, 0)) {
49                 TranslateMessage(&msg);
50                 DispatchMessage(&msg);
51         }
52
53         wgt_destroy_window(win);
54         return 0;
55 }
56
57 static int isusbdev(struct rawdisk_device *dev)
58 {
59         char *ptr = dev->path;
60         while(*ptr) {
61                 int i;
62                 char buf[3];
63                 for(i=0; i<3; i++) {
64                         buf[i] = tolower(ptr[i]);
65                 }
66                 if(memcmp(buf, "usb", 3) == 0) {
67                         return 1;
68                 }
69                 ptr++;
70         }
71         return 0;
72 }
73
74 static void update_disks(void)
75 {
76         int i;
77
78         for(i=0; i<num_rawdev; i++) {
79                 free(rawdev[i].name);
80                 free(rawdev[i].path);
81         }
82
83         if((num_rawdev = rawdisk_detect(rawdev, sizeof rawdev / sizeof *rawdev)) == -1) {
84                 MessageBox(0, "Failed to detect storage devices!", 0, MB_OK);
85                 exit(1);
86         }
87
88         if(wgt_checkbox_checked(ck_usbonly)) {
89                 for(i=0; i<num_rawdev; i++) {
90                         if(!isusbdev(rawdev + i)) {
91                                 free(rawdev[i].name);
92                                 free(rawdev[i].path);
93                                 rawdev[i] = rawdev[--num_rawdev];
94                         }
95                 }
96         }
97
98         for(i=0; i<num_rawdev; i++) {
99                 items[i] = rawdev[i].name;
100         }
101
102         wgt_combo_setitems(cb_devs, items, num_rawdev);
103
104         if(num_rawdev) {
105                 wgt_enable_widget(cb_devs);
106                 wgt_enable_widget(bn_inst);
107         } else {
108                 wgt_disable_widget(cb_devs);
109                 wgt_disable_widget(bn_inst);
110         }
111 }
112
113 static void onclick(struct wgt_widget *w)
114 {
115         if(w == bn_inst) {
116                 MessageBox(0, "clicked", "clicked", MB_OK);
117         } else if(w == bn_cancel) {
118                 PostQuitMessage(0);
119         } else if(w == ck_usbonly) {
120                 update_disks();
121         }
122 }
123
124 static void onmodify(struct wgt_widget *w)
125 {
126         int sel = wgt_combo_selected(w);
127         if(sel >= 0) {
128                 const char *selstr = wgt_get_combo_item(w, sel);
129                 MessageBox(0, selstr, "selected item", MB_OK);
130         }
131 }
132
133 static void ck_usbonly_handler(struct wgt_widget *w)
134 {
135         printf("FOO\n");
136         update_disks();
137 }