1 /* Ch-Drive command for Windows NT and OS/2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2 of the License, or
6 (at your option) any later version.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 the code will not work if you have more drives than those that
25 #include "util_win32.h"
31 #include "../src/tty.h"
32 #include "../src/mad.h"
33 #include "../src/util.h"
34 #include "../src/win.h"
35 #include "../src/color.h"
36 #include "../src/dlg.h"
37 #include "../src/widget.h"
38 #include "../src/dialog.h"
39 #include "../src/dir.h"
40 #include "../src/panel.h"
41 #include "../src/main.h"
42 #include "../src/cmd.h"
44 struct Dlg_head
*drive_dlg
;
47 static int drive_dlg_callback (Dlg_head
*h
, int Par
, int Msg
);
48 static void drive_dlg_refresh (void);
49 static void drive_cmd(void);
51 #define B_DRIVE_BASE 100
52 #define MAX_LGH 13 /* Length for drives */
54 static void drive_cmd()
56 int i
, nNewDrive
, nDrivesAvail
;
57 char szTempBuf
[7], szDrivesAvail
[27*4], *p
;
59 /* Dialogbox position */
61 int y_pos
= (LINES
-6)/2-3;
67 /* Get drives name and count */
69 GetLogicalDriveStrings (255, szDrivesAvail
);
70 for (nDrivesAvail
= 0, p
= szDrivesAvail
; *p
; nDrivesAvail
++)
73 unsigned long uDriveNum
, uDriveMap
;
76 DosQueryCurrentDisk(&uDriveNum
, &uDriveMap
);
77 for (i
= 0; i
< 26; i
++) {
78 if ( uDriveMap
& (1 << i
) ) {
90 m_drv
= ((nDrivesAvail
> MAX_LGH
) ? MAX_LGH
: nDrivesAvail
);
91 /* Center on x, relative to panel */
92 x_pos
= this_panel
->widget
.x
+ (this_panel
->widget
.cols
- m_drv
*3)/2 + 2;
94 if (nDrivesAvail
> MAX_LGH
) {
99 x_width
= (nDrivesAvail
- 1) * 2 + 9;
102 drive_dlg
= create_dlg (y_pos
, x_pos
, y_height
, x_width
, dialog_colors
,
103 drive_dlg_callback
, "[ChDrive]", "drive", DLG_NONE
);
105 x_set_dialog_title (drive_dlg
, "Change Drive");
107 if (nDrivesAvail
>MAX_LGH
) {
108 for (i
= 0; i
< nDrivesAvail
- MAX_LGH
; i
++) {
110 sprintf(szTempBuf
, "&%c", *p
);
111 add_widget (drive_dlg
,
113 (m_drv
-i
-1)*2+4 - (MAX_LGH
*2 - nDrivesAvail
) * 2,
114 B_DRIVE_BASE
+ nDrivesAvail
- i
- 1,
116 szTempBuf
, 0, NULL
, NULL
));
120 /* Add a button for each drive */
121 for (i
= 0; i
< m_drv
; i
++) {
123 sprintf (szTempBuf
, "&%c", *p
);
124 add_widget (drive_dlg
,
125 button_new (3, (m_drv
-i
-1)*2+4, B_DRIVE_BASE
+m_drv
-i
-1,
126 HIDDEN_BUTTON
, szTempBuf
, 0, NULL
, NULL
));
132 if (drive_dlg
->ret_value
!= B_CANCEL
) {
133 int errocc
= 0; /* no error */
137 nNewDrive
= drive_dlg
->ret_value
- B_DRIVE_BASE
;
138 drvLetter
= (char) *(szDrivesAvail
+ (nNewDrive
*4));
140 if (win32_GetPlatform() == OS_WinNT
) { /* Windows NT */
141 rtn
= _chdrive(drvLetter
- 'A' + 1);
142 } else { /* Windows 95 */
144 SetCurrentDirectory(szDrivesAvail
+(nNewDrive
*4));
147 rtn
= DosSetDefaultDisk(nNewDrive
+ 1);
152 getcwd (this_panel
->cwd
, sizeof (this_panel
->cwd
)-2);
153 if (toupper(drvLetter
) == toupper(*(this_panel
->cwd
))) {
154 clean_dir (&this_panel
->dir
, this_panel
->count
);
155 this_panel
->count
= do_load_dir(&this_panel
->dir
,
156 this_panel
->sort_type
,
158 this_panel
->case_sensitive
,
160 this_panel
->top_file
= 0;
161 this_panel
->selected
= 0;
162 this_panel
->marked
= 0;
163 this_panel
->total
= 0;
164 show_dir(this_panel
);
170 message (1, " Error ", " Can't access drive %c: ",
171 *(szDrivesAvail
+(nNewDrive
*4)) );
173 destroy_dlg (drive_dlg
);
179 this_panel
= left_panel
;
185 this_panel
= right_panel
;
189 void drive_chg(WPanel
*panel
)
195 static int drive_dlg_callback (Dlg_head
*h
, int Par
, int Msg
)
200 drive_dlg_refresh ();
207 static void drive_dlg_refresh (void)
209 attrset (dialog_colors
[0]);
210 dlg_erase (drive_dlg
);
211 draw_box (drive_dlg
, 1, 1, drive_dlg
->lines
-2, drive_dlg
->cols
-2);
213 attrset (dialog_colors
[2]);
214 dlg_move (drive_dlg
, 1, drive_dlg
->cols
/2 - 7);
215 addstr (" Change Drive ");