view nt/addpm.c @ 25022:3ea84b15b5e6

(read_char): Use message3_nolog to show help-echo. (make_lispy_event) <TOOLBAR_EVENT>: Apply modifiers. (kbd_store_ptr): Declare it as a volatile pointer instead of a pointer to a volatile input_event. (kbd_buffer_store_event): Remove volatile modifier from declaration of local variable `sp'. (Fdiscard_input): Don't cast when assigning kbd_store_ptr to kbd_fetch_ptr. (make_lispy_event): Handle mouse on top lines. (make_lispy_movement): Ditto. (read_char): Rename local variable echo_area_message because it shadows the global one. (cmd_error_internal): Set echo_areA_message. (command_loop_1): Test echo_areA_message. (read_char): Ditto. (record_menu_key): Set echo_area_message to nil. (Fexecute_extended_command): Test echo_area_message. (Fexecute_extended_command): Handle echo_area_message. (toolbar_items): Call access_keymap with third parameter 1, so that we don't get inherited toolbar item definitions. Ditto. (kbd_buffer_get_event): Set flag to prevent recording TOOLBAR_EVENT events in last_nonmenu_event. (timer_check): Inhibit busy cursor around calls to timer-event-handler. This busy cursor tends to be anoying if fontifying stealthily. (command_loop_1): Display busy cursor. (Vshow_help_function): New. (read_char): Use it. (make_lispy_event): Add string and string position info to mouse-click events. (read_key_sequence): Handle `local-map' property of mode line strings. (Qend_scroll): New. (scroll_bar_parts): Add it. (scroll_bar_parts): Add Qtop and Qbottom. (syms_of_keyboard): Add Qbottom. (make_lispy_event): Handle scroll_bar_click differently when using toolkit scroll bars. (cmd_error_internal): Bug fix. (syms_of_keyboard): Staticpro toolbar_item_properties and toolbar_items_vectors. (Qhelp_echo): New symbol. (read_char): Handle `toolbar' and `help_echo' events. (kbd_buffer_get_event): Handle HELP_ECHO input event. (make_lispy_event): Handle TOOLBAR_EVENT. (toolbar_items): New. (process_toolbar_item): New. (PROP): New. (init_toolbar_items): New. (append_toolbar_item): New. (read_char_x_menu_prompt): Handle `toolbar' event. (read_key_sequence): Ditto. (syms_of_keyboard): Intern `:help'. (toolbar_items): New. (process_toolbar_item): New. (parse_toolbar_item): New. (init_toolbar_items): New. (append_toolbar_item): New. (detect_input_pending_run_timers): Likewise. (detect_input_pending_run_timers): Call gobble_input after redisplaying. (clear_waiting_for_input): Return void. (record_asynch_buffer_change): Return void. (stop_polling): Return void. (start_polling): Ditto. (cmd_error_internal): Write to stderr if selected frame is Vterminal_frame under X. This is the case when a font cannot be loaded when Emacs starts. Replace test for FRAME_MESSAGE_BUF with test for glyphs_initialized_p. (quit_throw_to_read_char): Ditto. (make_lispy_event): mouse clicks; don't do frame glyph position calculations. (make_lispy_movement): Use buffer_posn_from_coords and window relative coordinates. (make_lispy_event): For mouse clicks, use x_y_to_hpos_vpos. (make_lispy_event): Use BUFFER_POSN_FROM_COORDS with window relative pixel coordinates. Use GLYPH_TO_PIXEL_- COORDS mit new arguments. (make_lispy_event): WINDOW_FROM_COORDINATES with pixel coords. (make_lispy_movement): Same. (interrupt_signal): Cursor_to with 4 params. (command_loop_1): Call DIRECT_OUTPUT_FOR_INSERT for any character.
author Gerd Moellmann <gerd@gnu.org>
date Wed, 21 Jul 1999 21:43:52 +0000
parents 903554be7bfc
children 4c7c77193f79
line wrap: on
line source

/* 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, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */

/****************************************************************************
 *
 * Program: addpm	(adds emacs to the Windows program manager)
 *
 * Usage:
 *   	argv[1] = install path for emacs
 *	argv[2] = full path to icon for emacs (optional)
 */

#include <windows.h>
#include <ddeml.h>
#include <stdlib.h>
#include <stdio.h>

HDDEDATA CALLBACK 
DdeCallback (UINT uType, UINT uFmt, HCONV hconv,
	     HSZ hsz1, HSZ hsz2, HDDEDATA hdata,
	     DWORD dwData1, DWORD dwData2)
{
  return ((HDDEDATA) NULL);
}

#define DdeCommand(str) 	\
	DdeClientTransaction (str, strlen (str)+1, HConversation, (HSZ)NULL, \
		              CF_TEXT, XTYP_EXECUTE, 30000, NULL)

#define REG_ROOT "SOFTWARE\\GNU\\Emacs"

static struct entry
{
  char *name;
  char *value;
} 
env_vars[] = 
{
  {"emacs_dir", NULL},
  {"EMACSLOADPATH", "%emacs_dir%/site-lisp;%emacs_dir%/lisp"},
  {"SHELL", "%emacs_dir%/bin/cmdproxy.exe"},
  {"EMACSDATA", "%emacs_dir%/etc"},
  {"EMACSPATH", "%emacs_dir%/bin"},
  {"EMACSLOCKDIR", "%emacs_dir%/lock"},
  /* We no longer set INFOPATH because Info-default-directory-list
     is then ignored.  */
  /*  {"INFOPATH", "%emacs_dir%/info"},  */
  {"EMACSDOC", "%emacs_dir%/etc"},
  {"TERM", "cmd"}
};

BOOL 
add_registry (path)
     char *path;
{
  HKEY hrootkey = NULL;
  DWORD dwDisp;
  int i;
  BOOL ok = TRUE;
  
  /* Check both the current user and the local machine to see if we 
     have any resources.  */
  
  if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, REG_ROOT,
		      0, "", REG_OPTION_NON_VOLATILE,
		      KEY_WRITE, NULL, &hrootkey, &dwDisp) != ERROR_SUCCESS 
      && RegCreateKeyEx (HKEY_CURRENT_USER, REG_ROOT,
			 0, "", REG_OPTION_NON_VOLATILE,
			 KEY_WRITE, NULL, &hrootkey, &dwDisp) != ERROR_SUCCESS)
    {
      return FALSE;
    }
  
  for (i = 0; i < (sizeof (env_vars) / sizeof (env_vars[0])); i++) 
    {
      char * value = env_vars[i].value ? env_vars[i].value : path;
	
      if (RegSetValueEx (hrootkey, env_vars[i].name,
			 0, REG_EXPAND_SZ,
			 value, lstrlen (value) + 1) != ERROR_SUCCESS)
	ok = FALSE;
    }			      
  
  RegCloseKey (hrootkey);
  
  return (ok);
}

int
main (argc, argv)
     int argc;
     char *argv[];			
{
  DWORD idDde = 0;
  HCONV HConversation;
  HSZ ProgMan;
  char modname[MAX_PATH];
  char additem[MAX_PATH*2 + 100];
  char *prog_name;
  char *emacs_path;
  char *p;

  /* If no args specified, use our location to set emacs_path.  */
#if 0
  if (argc < 2 || argc > 3)
    {
      fprintf (stderr, "usage: addpm emacs_path [icon_path]\n");
      exit (1);
    }
#endif

  if (argc > 1)
    emacs_path = argv[1];
  else
    {
      if (!GetModuleFileName (NULL, modname, MAX_PATH) ||
	  (p = strrchr (modname, '\\')) == NULL)
	{
	  fprintf (stderr, "fatal error");
	  exit (1);
	}
      *p = 0;

      /* Set emacs_path to emacs_dir if we are in "%emacs_dir%\bin".  */
      if ((p = strrchr (modname, '\\')) && stricmp (p, "\\bin") == 0)
	{
	  *p = 0;
	  emacs_path = modname;
	}
      else
	{
	  fprintf (stderr, "usage: addpm emacs_path [icon_path]\n");
	  exit (1);
	}

      /* Tell user what we are going to do.  */
      {
	int result;

	char msg[ MAX_PATH ];
	sprintf (msg, "Install Emacs at %s?\n", emacs_path);
	result = MessageBox (NULL, msg, "Install Emacs", MB_OKCANCEL | MB_ICONQUESTION);
	if (result != IDOK)
	  {
	    fprintf (stderr, "Install cancelled\n");
	    exit (1);
	  }
      }
    }

  prog_name = add_registry (emacs_path) ? "runemacs.exe" : "emacs.bat";

  DdeInitialize (&idDde, (PFNCALLBACK)DdeCallback, APPCMD_CLIENTONLY, 0);

  ProgMan = DdeCreateStringHandle (idDde, "PROGMAN", CP_WINANSI);

  HConversation = DdeConnect (idDde, ProgMan, ProgMan, NULL);
  if (HConversation != 0)
    {
      DdeCommand ("[CreateGroup (\"Gnu Emacs\")]");
      DdeCommand ("[ReplaceItem (Emacs)]");
      if (argc > 2)
	sprintf (additem, "[AddItem (\"%s\\bin\\%s\", Emacs, \"%s\")]",
		 emacs_path, prog_name, argv[2]);
      else
	sprintf (additem, "[AddItem (\"%s\\bin\\%s\", Emacs)]",
		 emacs_path, prog_name);
      DdeCommand (additem);

      DdeDisconnect (HConversation);
    }

  DdeFreeStringHandle (idDde, ProgMan);

  DdeUninitialize (idDde);

  return (0);
}