diff options
Diffstat (limited to 'nt')
-rw-r--r-- | nt/addpm.c | 193 | ||||
-rw-r--r-- | nt/emacs.bat.in | 38 |
2 files changed, 231 insertions, 0 deletions
diff --git a/nt/addpm.c b/nt/addpm.c new file mode 100644 index 00000000000..395748f8a05 --- /dev/null +++ b/nt/addpm.c @@ -0,0 +1,193 @@ +/* Add entries to the GNU Emacs Program Manager folder. + Copyright (C) 1995 Free Software Foundation, Inc. + + This file is part of GNU Emacs. + + GNU Emacs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any later + version. + + GNU Emacs is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + You should have received a copy of the GNU General Public License along + with GNU Emacs; see the file COPYING. If not, write to the Free Software + 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() + + PURPOSE: Calls initialization function, processes message loop + + PARAMETERS: + HANDLE h_instance + HANDLE h_prev_instance + LPSTR lp_cmd_line + int n_cmd_show + + RETURNS: + int +****************************************************************************/ + +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) +{ + DWORD id_inst = 0L; // instance identifier + FARPROC lp_dde_proc; + char *path, *icon, *s; + 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) + { + icon = s; + while (*s && !isspace (*s)) + s++; + if (*s) + *(s++) = '\0'; + } + + 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)]"); + + send_shell_command (id_inst, (LPSTR) "[ReplaceItem(Emacs)]"); + + 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) + { + // 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); + } + + // free service/topic string handle + DdeFreeStringHandle (id_inst, hsz_serv_top); + + return b_result; +} diff --git a/nt/emacs.bat.in b/nt/emacs.bat.in new file mode 100644 index 00000000000..2894971516d --- /dev/null +++ b/nt/emacs.bat.in @@ -0,0 +1,38 @@ + +REM Here begins emacs.bat.in + +REM Set OS specific values. +set ARCH_SAVE=%PROCESSOR_ARCHITECTURE% +set PROCESSOR_ARCHITECTURE= +if "%ARCH_SAVE%" == "%PROCESSOR_ARCHITECTURE%" goto win95 +set PROCESSOR_ARCHITECTURE=%ARCH_SAVE% +set SHELL=cmd +goto next + +:win95 +set SHELL=command + +:next + +set EMACSLOADPATH=%emacs_dir%\lisp +set EMACSDATA=%emacs_dir%\etc +set EMACSPATH=%emacs_dir%\bin +set EMACSLOCKDIR=%emacs_dir%\lock +set INFOPATH=%emacs_dir%\info +set EMACSDOC=%emacs_dir%\etc +set TERM=CMD + +REM The variable HOME is used to find the startup file, ~\_emacs. Ideally, +REM this will not be set in this file but should already be set before +REM this file is invoked. If HOME is not set, use some generic default. + +set HOME_SAVE=%HOME% +set HOME_EXISTS=yes +set HOME_DEFAULT=C:\ +set HOME= +if "%HOME%" == "%HOME_SAVE%" set HOME_EXISTS=no +if "%HOME_EXISTS%" == "yes" set HOME=%HOME_SAVE% +if "%HOME_EXISTS%" == "no" set HOME=%HOME_DEFAULT% +if "%HOME_EXISTS%" == "no" echo HOME is not set! Using %HOME% as a default... + +%emacs_dir%\bin\emacs.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 |