Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
emacs
emacs
Commits
6fbcbee7
Commit
6fbcbee7
authored
Jun 20, 1995
by
Richard M. Stallman
Browse files
Mostly rewritten.
parent
4e043ed3
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
44 additions
and
155 deletions
+44
-155
nt/addpm.c
nt/addpm.c
+44
-155
No files found.
nt/addpm.c
View file @
6fbcbee7
...
...
@@ -18,176 +18,65 @@
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* addpm: Adds entries to the GNU Emacs Program Manager folder.
argv[1] = full path to program to execute
argv[2] = full path to icon for emacs (optional)
*/
#include <windows.h> // required for all Windows applications
#include <ddeml.h> // required for DDEML
#include <string.h> // required for strcpy and strlen
HDDEDATA
EXPENTRY
dde_callback
(
WORD
,
WORD
,
HCONV
,
HSZ
,
HSZ
,
HDDEDATA
,
DWORD
,
DWORD
);
BOOL
send_shell_command
(
DWORD
,
LPSTR
);
// Global variables
HANDLE
gh_inst
;
// current instance
/****************************************************************************
FUNCTION: WinMain()
*
* Program: addpm (adds emacs to the Windows program manager)
*
* Usage:
* argv[1] = full path to program to execute
* argv[2] = full path to icon for emacs (optional)
*/
PURPOSE: Calls initialization function, processes message loop
#include <windows.h>
#include <ddeml.h>
#include <stdlib.h>
#include <stdio.h>
PARAMETERS:
HANDLE h_instance
HANDLE h_prev_instance
LPSTR lp_cmd_line
int n_cmd_show
HDDEDATA
CALLBACK
DdeCallback
(
UINT
uType
,
UINT
uFmt
,
HCONV
hconv
,
HSZ
hsz1
,
HSZ
hsz2
,
HDDEDATA
hdata
,
DWORD
dwData1
,
DWORD
dwData2
)
{
return
((
HDDEDATA
)
NULL
);
}
RETURNS:
int
****************************************************************************/
#define DdeCommand(str) \
DdeClientTransaction (str, strlen(str)+1, HConversation, (HSZ)NULL, \
CF_TEXT, XTYP_EXECUTE, 30000, NULL)
int
PASCAL
WinMain
(
HANDLE
h_instance
,
// current instance
HANDLE
h_prev_instance
,
// previous instance
LPSTR
lp_cmd_line
,
// command line
int
n_cmd_show
)
// show-window type (open/icon)
main
(
argc
,
argv
)
int
argc
;
char
*
argv
[];
{
DWORD
id
_inst
=
0L
;
// instance identifier
FARPROC
lp_dde_proc
;
char
*
path
,
*
icon
,
*
s
;
DWORD
id
Dde
;
HCONV
HConversation
;
HSZ
ProgMan
;
char
additem
[
MAX_PATH
*
2
+
100
];
gh_inst
=
h_instance
;
for
(
path
=
NULL
,
s
=
lp_cmd_line
;
*
s
&&
isspace
(
*
s
);
s
++
);
if
(
*
s
)
{
path
=
s
;
while
(
*
s
&&
!
isspace
(
*
s
))
s
++
;
if
(
*
s
)
*
(
s
++
)
=
'\0'
;
}
for
(
icon
=
NULL
;
*
s
&&
isspace
(
*
s
);
s
++
);
if
(
*
s
)
if
(
argc
<
2
||
argc
>
3
)
{
icon
=
s
;
while
(
*
s
&&
!
isspace
(
*
s
))
s
++
;
if
(
*
s
)
*
(
s
++
)
=
'\0'
;
fprintf
(
stderr
,
"usage: addpm exe_path [icon_path]
\n
"
);
exit
(
1
);
}
lp_dde_proc
=
MakeProcInstance
((
FARPROC
)
dde_callback
,
gh_inst
);
DdeInitialize
(
&
id_inst
,
// receives instance ID
(
PFNCALLBACK
)
lp_dde_proc
,
// address of callback function
APPCMD_CLIENTONLY
,
// this is a client app
0L
);
// reserved
send_shell_command
(
id
_inst
,
(
LPSTR
)
"[CreateGroup(Gnu Emacs)]"
);
DdeInitialize
(
&
id
Dde
,
(
PFNCALLBACK
)
DdeCallback
,
APPCMD_CLIENTONLY
,
0
);
send_shell_comm
and
(
id
_inst
,
(
LPSTR
)
"[ReplaceItem(Emacs)]"
);
ProgMan
=
DdeCreateStringH
and
le
(
id
Dde
,
"PROGMAN"
,
CP_WINANSI
);
sprintf
(
additem
,
"[AddItem(%s,Emacs%c%s)]"
,
path
,
(
icon
?
','
:
' '
),
(
icon
?
icon
:
""
));
send_shell_command
(
id_inst
,
additem
);
DdeUninitialize
(
id_inst
);
return
(
0
);
}
/****************************************************************************
FUNCTION: dde_callback()
PURPOSE: Processes messages for DDEML conversation
PARAMETERS:
WORD w_type
WORD w_fmt
HCONV h_conv
HSZ hsz1
HSZ hsz2
HDDEDATA h_data
DWORD dw_data1
DWORD dw_data2
RETURNS:
HDDEDATA
****************************************************************************/
HDDEDATA
EXPENTRY
dde_callback
(
WORD
w_type
,
// transaction type
WORD
w_fmt
,
// clipboard format
HCONV
h_conv
,
// handle of the conversation
HSZ
hsz1
,
// handle of a string
HSZ
hsz2
,
// handle of a string
HDDEDATA
h_data
,
// handle of a global memory object
DWORD
dw_data1
,
// transaction-specific data
DWORD
dw_data2
)
// transaction-specific data
{
// Nothing need be done here...
return
(
HDDEDATA
)
NULL
;
}
/****************************************************************************
FUNCTION: send_shell_command()
PURPOSE: Sends the given command string to Program Manager
PARAMETERS:
LPSTR - pointer to command string
RETURNS:
BOOL - TRUE if this function succeeds, FALSE otherwise
****************************************************************************/
BOOL
send_shell_command
(
DWORD
id_inst
,
// instance identifier
LPSTR
lp_command
)
// command string to execute
{
HSZ
hsz_serv_top
;
// Service and Topic name are "PROGMAN"
HCONV
hconv
;
// handle of conversation
int
n_len
;
// length of command string
HDDEDATA
h_data
;
// return value of DdeClientTransaction
DWORD
dw_result
;
// result of transaction
BOOL
b_result
=
FALSE
;
// TRUE if this function is successful
// create string handle to service/topic
hsz_serv_top
=
DdeCreateStringHandle
(
id_inst
,
"PROGMAN"
,
CP_WINANSI
);
// attempt to start conversation with server app
if
((
hconv
=
DdeConnect
(
id_inst
,
hsz_serv_top
,
hsz_serv_top
,
NULL
))
!=
(
HCONV
)
NULL
)
if
(
HConversation
=
DdeConnect
(
idDde
,
ProgMan
,
ProgMan
,
NULL
))
{
// get length of the command string
n_len
=
lstrlen
((
LPSTR
)
lp_command
);
// send command to server app
h_data
=
DdeClientTransaction
((
LPBYTE
)
lp_command
,
// data to pass
n_len
+
1
,
// length of data
hconv
,
// handle of conversation
(
HCONV
)
NULL
,
// handle of name-string
CF_TEXT
,
// clipboard format
XTYP_EXECUTE
,
// transaction type
1000
,
// timeout duration
&
dw_result
);
// transaction result
if
(
h_data
)
b_result
=
TRUE
;
// end conversation
DdeDisconnect
(
hconv
);
DdeCommand
(
"[CreateGroup(Gnu Emacs)]"
);
DdeCommand
(
"[ReplaceItem(Emacs)]"
);
sprintf
(
additem
,
"[AddItem(%s,Emacs%c%s)]"
,
argv
[
1
],
(
argc
>
2
?
','
:
' '
),
(
argc
>
2
?
argv
[
2
]
:
""
));
DdeCommand
(
additem
);
DdeDisconnect
(
HConversation
);
}
// free service/topic string handle
DdeFreeStringHandle
(
id_inst
,
hsz_serv_top
);
DdeFreeStringHandle
(
idDde
,
ProgMan
);
DdeUninitialize
(
idDde
);
return
b_result
;
return
(
0
)
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment