From 6fbcbee7e5224974ddc1bce70b84c0233de7a5f8 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Tue, 20 Jun 1995 02:53:59 +0000 Subject: Mostly rewritten. --- nt/addpm.c | 199 ++++++++++++++----------------------------------------------- 1 file changed, 44 insertions(+), 155 deletions(-) (limited to 'nt') diff --git a/nt/addpm.c b/nt/addpm.c index 395748f8a05..2355b6701cc 100644 --- a/nt/addpm.c +++ b/nt/addpm.c @@ -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 // required for all Windows applications -#include // required for DDEML -#include // 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 +#include +#include +#include - 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 idDde; + 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 (&idDde, (PFNCALLBACK)DdeCallback, APPCMD_CLIENTONLY, 0); - send_shell_command (id_inst, (LPSTR) "[ReplaceItem(Emacs)]"); + ProgMan = DdeCreateStringHandle (idDde, "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); } -- cgit v1.2.1