]> cygwin.com Git - cygwin-apps/setup.git/blame - root.cc
* choose.cc: Use a constant throughout to deal with chooser icon length.
[cygwin-apps/setup.git] / root.cc
CommitLineData
23c9e63c
DD
1/*
2 * Copyright (c) 2000, Red Hat, Inc.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * A copy of the GNU General Public License can be found at
10 * http://www.gnu.org/
11 *
12 * Written by DJ Delorie <dj@cygnus.com>
13 *
14 */
15
16/* The purpose of this file is to ask the user where they want the
17 root of the installation to be, and to ask whether the user prefers
18 text or binary mounts. */
19
8507f105
DD
20static char *cvsid = "\n%%% $Id$\n";
21
23c9e63c
DD
22#include "win32.h"
23#include <shlobj.h>
24#include <stdio.h>
25#include <stdlib.h>
26#include <ctype.h>
27
28#include "dialog.h"
29#include "resource.h"
30#include "state.h"
31#include "msg.h"
32#include "mount.h"
bf1d5889 33#include "concat.h"
89b1a15b 34#include "log.h"
23c9e63c
DD
35
36static int rb[] = { IDC_ROOT_TEXT, IDC_ROOT_BINARY, 0 };
24e259bb 37static int su[] = { IDC_ROOT_SYSTEM, IDC_ROOT_USER, 0 };
23c9e63c
DD
38
39static void
40check_if_enable_next (HWND h)
41{
24e259bb 42 EnableWindow (GetDlgItem (h, IDOK), root_text && root_dir && root_scope);
23c9e63c
DD
43}
44
45static void
46load_dialog (HWND h)
47{
48 rbset (h, rb, root_text);
24e259bb 49 rbset (h, su, root_scope);
23c9e63c
DD
50 eset (h, IDC_ROOT_DIR, root_dir);
51 check_if_enable_next (h);
52}
53
54static void
55save_dialog (HWND h)
56{
57 root_text = rbget (h, rb);
24e259bb 58 root_scope = rbget (h, su);
23c9e63c
DD
59 root_dir = eget (h, IDC_ROOT_DIR, root_dir);
60}
61
23c9e63c
DD
62static int CALLBACK
63browse_cb (HWND h, UINT msg, LPARAM lp, LPARAM data)
64{
65 switch (msg)
66 {
67 case BFFM_INITIALIZED:
bf1d5889
DD
68 if (root_dir)
69 SendMessage (h, BFFM_SETSELECTION, TRUE, (LPARAM)root_dir);
23c9e63c
DD
70 break;
71 }
72 return 0;
73}
74
75static void
76browse (HWND h)
77{
78 BROWSEINFO bi;
79 CHAR name[MAX_PATH];
80 LPITEMIDLIST pidl;
81 memset (&bi, 0, sizeof (bi));
82 bi.hwndOwner = h;
83 bi.pszDisplayName = name;
84 bi.lpszTitle = "Select an installation root directory";
85 bi.ulFlags = BIF_RETURNONLYFSDIRS;
86 bi.lpfn = browse_cb;
87 pidl = SHBrowseForFolder (&bi);
88 if (pidl)
89 {
90 if (SHGetPathFromIDList (pidl, name))
91 eset (h, IDC_ROOT_DIR, name);
92 }
93}
94
95#define isslash(c) ((c) == '\\' || (c) == '/')
96
97static int
98directory_is_absolute ()
99{
100 if (isalpha (root_dir[0])
101 && root_dir[1] == ':'
102 && (root_dir[2] == '\\' || root_dir[2] == '/'))
103 return 1;
104 return 0;
105}
106
107static int
108directory_is_rootdir ()
109{
110 char *c;
111 for (c = root_dir; *c; c++)
1fd6d0a2 112 if (isslash (c[0]) && c[1] && !isslash (c[1]))
23c9e63c
DD
113 return 0;
114 return 1;
115}
116
117static int
118directory_has_spaces ()
119{
120 if (strchr (root_dir, ' '))
121 return 1;
122 return 0;
123}
124
125static BOOL
126dialog_cmd (HWND h, int id, HWND hwndctl, UINT code)
127{
128 switch (id)
129 {
130
131 case IDC_ROOT_DIR:
132 case IDC_ROOT_TEXT:
133 case IDC_ROOT_BINARY:
24e259bb
DD
134 case IDC_ROOT_SYSTEM:
135 case IDC_ROOT_USER:
23c9e63c
DD
136 save_dialog (h);
137 check_if_enable_next (h);
138 break;
139
140 case IDC_ROOT_BROWSE:
141 browse (h);
142 break;
143
144 case IDOK:
1fd6d0a2 145 save_dialog (h);
23c9e63c
DD
146
147 if (! directory_is_absolute ())
148 {
149 note (IDS_ROOT_ABSOLUTE);
150 break;
151 }
152
153 if (directory_is_rootdir ())
154 if (IDNO == yesno (IDS_ROOT_SLASH))
155 break;
156
157 if (directory_has_spaces ())
158 if (IDNO == yesno (IDS_ROOT_SPACE))
159 break;
160
161 switch (source)
162 {
163 case IDC_SOURCE_NETINST:
1fd6d0a2 164 NEXT (IDD_NET);
23c9e63c
DD
165 break;
166 case IDC_SOURCE_CWD:
1fd6d0a2 167 NEXT (IDD_S_FROM_CWD);
23c9e63c
DD
168 break;
169 default:
1fd6d0a2
DD
170 msg ("source is default? %d\n", source);
171 NEXT (0);
23c9e63c
DD
172 }
173 break;
174
175 case IDC_BACK:
1fd6d0a2 176 save_dialog (h);
c92e1307 177 NEXT (IDD_LOCAL_DIR);
23c9e63c
DD
178 break;
179
180 case IDCANCEL:
1fd6d0a2 181 NEXT (0);
23c9e63c
DD
182 break;
183 }
184}
185
186static BOOL CALLBACK
187dialog_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)
188{
189 switch (message)
190 {
191 case WM_INITDIALOG:
1fd6d0a2 192 load_dialog (h);
23c9e63c
DD
193 return FALSE;
194 case WM_COMMAND:
1fd6d0a2 195 return HANDLE_WM_COMMAND (h, wParam, lParam, dialog_cmd);
23c9e63c
DD
196 }
197 return FALSE;
198}
199
200void
201do_root (HINSTANCE h)
202{
203 int rv = 0;
204 if (!root_dir)
a351e48c 205 read_mounts ();
23c9e63c
DD
206 rv = DialogBox (h, MAKEINTRESOURCE (IDD_ROOT), 0, dialog_proc);
207 if (rv == -1)
208 fatal (IDS_DIALOG_FAILED);
89b1a15b
DD
209
210 log (0, "root: %s %s %s", root_dir,
211 (root_text == IDC_ROOT_TEXT) ? "text" : "binary",
212 (root_scope == IDC_ROOT_USER) ? "user" : "system");
23c9e63c
DD
213}
214
This page took 0.044894 seconds and 5 git commands to generate.