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., 675 Mass Ave, Cambridge, MA 02139, 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_widgetl(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
),
121 /* Add a button for each drive */
122 for (i
= 0; i
< m_drv
; i
++) {
124 sprintf (szTempBuf
, "&%c", *p
);
125 add_widgetl(drive_dlg
,
126 button_new (3, (m_drv
-i
-1)*2+4, B_DRIVE_BASE
+m_drv
-i
-1,
127 HIDDEN_BUTTON
, szTempBuf
, 0, NULL
, NULL
),
134 if (drive_dlg
->ret_value
!= B_CANCEL
) {
135 int errocc
= 0; /* no error */
139 /* Set the Panel to Directory listing mode first */
140 int is_right
=(this_panel
==right_panel
);
142 set_display_type (is_right
?1:0, view_listing
);
143 this_panel
=is_right
?right_panel
:left_panel
;
146 nNewDrive
= drive_dlg
->ret_value
- B_DRIVE_BASE
;
147 drvLetter
= (char) *(szDrivesAvail
+ (nNewDrive
*4));
149 if (win32_GetPlatform() == OS_WinNT
) { /* Windows NT */
150 rtn
= _chdrive(drvLetter
- 'A' + 1);
151 } else { /* Windows 95 */
153 SetCurrentDirectory(szDrivesAvail
+(nNewDrive
*4));
156 rtn
= DosSetDefaultDisk(nNewDrive
+ 1);
161 getcwd (this_panel
->cwd
, sizeof (this_panel
->cwd
)-2);
162 if (toupper(drvLetter
) == toupper(*(this_panel
->cwd
))) {
163 clean_dir (&this_panel
->dir
, this_panel
->count
);
164 this_panel
->count
= do_load_dir(&this_panel
->dir
,
165 this_panel
->sort_type
,
167 this_panel
->case_sensitive
,
169 this_panel
->top_file
= 0;
170 this_panel
->selected
= 0;
171 this_panel
->marked
= 0;
172 this_panel
->total
= 0;
173 show_dir(this_panel
);
179 message (1, _(" Error "), _(" Can't access drive %c: "),
180 *(szDrivesAvail
+(nNewDrive
*4)) );
182 destroy_dlg (drive_dlg
);
189 this_panel
= left_panel
;
195 this_panel
= right_panel
;
199 void drive_chg(WPanel
*panel
)
205 static int drive_dlg_callback (Dlg_head
*h
, int Par
, int Msg
)
210 drive_dlg_refresh ();
217 static void drive_dlg_refresh (void)
219 attrset (dialog_colors
[0]);
220 dlg_erase (drive_dlg
);
221 draw_box (drive_dlg
, 1, 1, drive_dlg
->lines
-2, drive_dlg
->cols
-2);
223 attrset (dialog_colors
[2]);
224 dlg_move (drive_dlg
, 1, drive_dlg
->cols
/2 - 7);
225 addstr (_(" Change Drive "));