X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/8678d9e413593b0abab296551a20589745c459da..dbdb703130b27983c3848d2a10aa44bc5aa6526e:/src/w32fns.c diff --git a/src/w32fns.c b/src/w32fns.c index 64e073bedb..6f32442514 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -60,6 +60,8 @@ along with GNU Emacs. If not, see . */ #include #include #define FILE_NAME_TEXT_FIELD edt1 +#define FILE_NAME_COMBO_BOX cmb13 +#define FILE_NAME_LIST lst1 #include "font.h" #include "w32font.h" @@ -78,10 +80,6 @@ extern void w32_menu_display_help (HWND, HMENU, UINT, UINT); extern void w32_free_menu_strings (HWND); extern const char *map_w32_filename (const char *, const char **); -extern int quit_char; - -extern const char *const lispy_function_keys[]; - /* If non-zero, a w32 timer that, when it expires, displays an hourglass cursor on all frames. */ static unsigned hourglass_timer = 0; @@ -142,8 +140,8 @@ struct MONITOR_INFO DWORD dwFlags; }; -/* Reportedly, VS 6 does not have this in its headers. */ -#if defined (_MSC_VER) && _MSC_VER < 1300 +/* Reportedly, MSVC does not have this in its headers. */ +#ifdef _MSC_VER DECLARE_HANDLE(HMONITOR); #endif @@ -185,18 +183,10 @@ unsigned int msh_mousewheel = 0; #define MENU_FREE_DELAY 1000 static unsigned menu_free_timer = 0; -extern Lisp_Object Qtooltip; - -#ifdef GLYPH_DEBUG -int image_cache_refcount, dpyinfo_refcount; +#if GLYPH_DEBUG +static int image_cache_refcount, dpyinfo_refcount; #endif - -extern HWND w32_system_caret_hwnd; - -extern int w32_system_caret_height; -extern int w32_system_caret_x; -extern int w32_system_caret_y; static HWND w32_visible_system_caret_hwnd; /* From w32menu.c */ @@ -645,9 +635,8 @@ colormap_t w32_color_map[] = {"LightGreen" , PALETTERGB (144,238,144)}, }; -DEFUN ("w32-default-color-map", Fw32_default_color_map, Sw32_default_color_map, - 0, 0, 0, doc: /* Return the default color map. */) - (void) +static Lisp_Object +w32_default_color_map (void) { int i; colormap_t *pc = w32_color_map; @@ -668,6 +657,13 @@ DEFUN ("w32-default-color-map", Fw32_default_color_map, Sw32_default_color_map, return (cmap); } +DEFUN ("w32-default-color-map", Fw32_default_color_map, Sw32_default_color_map, + 0, 0, 0, doc: /* Return the default color map. */) + (void) +{ + return w32_default_color_map (); +} + static Lisp_Object w32_color_map_lookup (char *colorname) { @@ -693,7 +689,6 @@ w32_color_map_lookup (char *colorname) QUIT; } - UNBLOCK_INPUT; return ret; @@ -1537,7 +1532,6 @@ void x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) { int nlines; - int olines = FRAME_MENU_BAR_LINES (f); /* Right now, menu bars don't work properly in minibuf-only frames; most of the commands try to apply themselves to the minibuffer @@ -1607,7 +1601,7 @@ x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) } FRAME_TOOL_BAR_LINES (f) = nlines; - change_window_heights (root_window, delta); + resize_frame_windows (f, FRAME_LINES (f), 0); adjust_glyphs (f); /* We also have to make sure that the internal border at the top of @@ -1642,6 +1636,9 @@ x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) if (WINDOWP (f->tool_bar_window)) clear_glyph_matrix (XWINDOW (f->tool_bar_window)->current_matrix); } + + run_window_configuration_change_hook (f); + } @@ -2873,7 +2870,6 @@ w32_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) base character (ie. translating the base key plus shift modifier). */ int add; - int isdead = 0; KEY_EVENT_RECORD key; key.bKeyDown = TRUE; @@ -2961,7 +2957,7 @@ w32_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) HIMC context = get_ime_context_fn (hwnd); wmsg.dwModifiers = w32_get_key_modifiers (wParam, lParam); /* Get buffer size. */ - size = get_composition_string_fn (context, GCS_RESULTSTR, buffer, 0); + size = get_composition_string_fn (context, GCS_RESULTSTR, NULL, 0); buffer = alloca (size); size = get_composition_string_fn (context, GCS_RESULTSTR, buffer, size); @@ -3282,7 +3278,8 @@ w32_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { /* Free memory used by owner-drawn and help-echo strings. */ w32_free_menu_strings (hwnd); - f->output_data.w32->menubar_active = 0; + if (f) + f->output_data.w32->menubar_active = 0; menubar_in_use = 0; } } @@ -3632,10 +3629,10 @@ w32_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) if (LOWORD (lParam) == HTCLIENT) { f = x_window_to_frame (dpyinfo, hwnd); - if (f->output_data.w32->hourglass_p && !menubar_in_use - && !current_popup_menu) + if (f && f->output_data.w32->hourglass_p + && !menubar_in_use && !current_popup_menu) SetCursor (f->output_data.w32->hourglass_cursor); - else + else if (f) SetCursor (f->output_data.w32->current_cursor); return 0; } @@ -3980,7 +3977,7 @@ x_make_gc (struct frame *f) /* Handler for signals raised during x_create_frame and - x_create_top_frame. FRAME is the frame which is partially + x_create_tip_frame. FRAME is the frame which is partially constructed. */ static Lisp_Object @@ -3991,11 +3988,12 @@ unwind_create_frame (Lisp_Object frame) /* If frame is ``official'', nothing to do. */ if (!CONSP (Vframe_list) || !EQ (XCAR (Vframe_list), frame)) { -#ifdef GLYPH_DEBUG +#if GLYPH_DEBUG struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f); #endif x_free_frame_resources (f); + free_glyphs (f); #if GLYPH_DEBUG /* Check that reference counts are indeed correct. */ @@ -4137,7 +4135,6 @@ This function is an internal primitive--use `make-frame' instead. */) FRAME_CONFIG_SCROLL_BAR_WIDTH (f) = GetSystemMetrics (SM_CXVSCROLL); f->terminal = dpyinfo->terminal; - f->terminal->reference_count++; f->output_method = output_w32; f->output_data.w32 = @@ -4156,7 +4153,8 @@ This function is an internal primitive--use `make-frame' instead. */) /* With FRAME_X_DISPLAY_INFO set up, this unwind-protect is safe. */ record_unwind_protect (unwind_create_frame, frame); #if GLYPH_DEBUG - image_cache_refcount = FRAME_IMAGE_CACHE (f)->refcount; + image_cache_refcount = + FRAME_IMAGE_CACHE (f) ? FRAME_IMAGE_CACHE (f)->refcount : 0; dpyinfo_refcount = dpyinfo->reference_count; #endif /* GLYPH_DEBUG */ @@ -4289,6 +4287,7 @@ This function is an internal primitive--use `make-frame' instead. */) x_make_gc (f); /* Now consider the frame official. */ + f->terminal->reference_count++; FRAME_W32_DISPLAY_INFO (f)->reference_count++; Vframe_list = Fcons (frame, Vframe_list); @@ -4348,9 +4347,9 @@ This function is an internal primitive--use `make-frame' instead. */) /* Initialize `default-minibuffer-frame' in case this is the first frame on this terminal. */ if (FRAME_HAS_MINIBUF_P (f) - && (!FRAMEP (kb->Vdefault_minibuffer_frame) - || !FRAME_LIVE_P (XFRAME (kb->Vdefault_minibuffer_frame)))) - kb->Vdefault_minibuffer_frame = frame; + && (!FRAMEP (KVAR (kb, Vdefault_minibuffer_frame)) + || !FRAME_LIVE_P (XFRAME (KVAR (kb, Vdefault_minibuffer_frame))))) + KVAR (kb, Vdefault_minibuffer_frame) = frame; /* All remaining specified parameters, which have not been "used" by x_get_arg and friends, now go in the misc. alist of the frame. */ @@ -4532,8 +4531,6 @@ DISPLAY should be either a frame or a display name (a string). If omitted or nil, that stands for the selected frame's display. */) (Lisp_Object display) { - struct w32_display_info *dpyinfo = check_x_display_info (display); - return make_number (1); } @@ -4778,7 +4775,7 @@ terminate Emacs if we can't open the connection. UNGCPRO; } if (NILP (Vw32_color_map)) - Vw32_color_map = Fw32_default_color_map (); + Vw32_color_map = w32_default_color_map (); /* Merge in system logical colors. */ add_system_logical_colors_to_map (&Vw32_color_map); @@ -4830,7 +4827,6 @@ If DISPLAY is nil, that stands for the selected frame's display. */) (Lisp_Object display) { struct w32_display_info *dpyinfo = check_x_display_info (display); - int i; if (dpyinfo->reference_count > 0) error ("Display still has frames on it"); @@ -4880,6 +4876,8 @@ If TERMINAL is omitted or nil, that stands for the selected frame's display. */ Window properties ***********************************************************************/ +#if 0 /* TODO : port window properties to W32 */ + DEFUN ("x-change-window-property", Fx_change_window_property, Sx_change_window_property, 2, 6, 0, doc: /* Change window property PROP to VALUE on the X window of FRAME. @@ -4899,7 +4897,6 @@ If OUTER_P is non-nil, the property is changed for the outer X window of FRAME. Default is to change on the edit X window. */) (Lisp_Object prop, Lisp_Object value, Lisp_Object frame, Lisp_Object type, Lisp_Object format, Lisp_Object outer_p) { -#if 0 /* TODO : port window properties to W32 */ struct frame *f = check_x_frame (frame); Atom prop_atom; @@ -4916,8 +4913,6 @@ FRAME. Default is to change on the edit X window. */) XFlush (FRAME_W32_DISPLAY (f)); UNBLOCK_INPUT; -#endif /* TODO */ - return value; } @@ -4928,8 +4923,6 @@ DEFUN ("x-delete-window-property", Fx_delete_window_property, FRAME nil or omitted means use the selected frame. Value is PROP. */) (Lisp_Object prop, Lisp_Object frame) { -#if 0 /* TODO : port window properties to W32 */ - struct frame *f = check_x_frame (frame); Atom prop_atom; @@ -4941,7 +4934,6 @@ FRAME nil or omitted means use the selected frame. Value is PROP. */) /* Make sure the property is removed when we return. */ XFlush (FRAME_W32_DISPLAY (f)); UNBLOCK_INPUT; -#endif /* TODO */ return prop; } @@ -4966,8 +4958,6 @@ Value is nil if FRAME hasn't a property with name PROP or if PROP has no value of TYPE (always string in the MS Windows case). */) (Lisp_Object prop, Lisp_Object frame) { -#if 0 /* TODO : port window properties to W32 */ - struct frame *f = check_x_frame (frame); Atom prop_atom; int rc; @@ -5007,10 +4997,10 @@ no value of TYPE (always string in the MS Windows case). */) return prop_value; -#endif /* TODO */ return Qnil; } +#endif /* TODO */ /*********************************************************************** @@ -5183,7 +5173,7 @@ x_create_tip_frame (struct w32_display_info *dpyinfo, Lisp_Object parms, Lisp_Object text) { struct frame *f; - Lisp_Object frame, tem; + Lisp_Object frame; Lisp_Object name; long window_prompting = 0; int width, height; @@ -5225,7 +5215,7 @@ x_create_tip_frame (struct w32_display_info *dpyinfo, Fset_window_buffer (FRAME_ROOT_WINDOW (f), buffer, Qnil); old_buffer = current_buffer; set_buffer_internal_1 (XBUFFER (buffer)); - B_ (current_buffer, truncate_lines) = Qnil; + BVAR (current_buffer, truncate_lines) = Qnil; specbind (Qinhibit_read_only, Qt); specbind (Qinhibit_modification_hooks, Qt); Ferase_buffer (); @@ -5240,7 +5230,6 @@ x_create_tip_frame (struct w32_display_info *dpyinfo, from this point on, x_destroy_window might screw up reference counts etc. */ f->terminal = dpyinfo->terminal; - f->terminal->reference_count++; f->output_method = output_w32; f->output_data.w32 = (struct w32_output *) xmalloc (sizeof (struct w32_output)); @@ -5250,7 +5239,8 @@ x_create_tip_frame (struct w32_display_info *dpyinfo, f->icon_name = Qnil; #if GLYPH_DEBUG - image_cache_refcount = FRAME_IMAGE_CACHE (f)->refcount; + image_cache_refcount = + FRAME_IMAGE_CACHE ? FRAME_IMAGE_CACHE (f)->refcount : 0; dpyinfo_refcount = dpyinfo->reference_count; #endif /* GLYPH_DEBUG */ FRAME_KBOARD (f) = kb; @@ -5391,15 +5381,16 @@ x_create_tip_frame (struct w32_display_info *dpyinfo, UNGCPRO; + /* Now that the frame is official, it counts as a reference to + its display. */ + FRAME_W32_DISPLAY_INFO (f)->reference_count++; + f->terminal->reference_count++; + /* It is now ok to make the frame official even if we get an error below. And the frame needs to be on Vframe_list or making it visible won't work. */ Vframe_list = Fcons (frame, Vframe_list); - /* Now that the frame is official, it counts as a reference to - its display. */ - FRAME_W32_DISPLAY_INFO (f)->reference_count++; - /* Setting attributes of faces of the tooltip frame from resources and similar will increment face_change_count, which leads to the clearing of all current matrices. Since this isn't necessary @@ -5655,7 +5646,7 @@ Text larger than the specified size is clipped. */) /* Display the tooltip text in a temporary buffer. */ old_buffer = current_buffer; set_buffer_internal_1 (XBUFFER (XWINDOW (FRAME_ROOT_WINDOW (f))->buffer)); - B_ (current_buffer, truncate_lines) = Qnil; + BVAR (current_buffer, truncate_lines) = Qnil; clear_glyph_matrix (w->desired_matrix); clear_glyph_matrix (w->current_matrix); SET_TEXT_POS (pos, BEGV, BEGV_BYTE); @@ -5843,13 +5834,10 @@ Value is t if tooltip was open, nil otherwise. */) UNGCPRO; return unbind_to (count, deleted); } - - /*********************************************************************** File selection dialog ***********************************************************************/ -extern Lisp_Object Qfile_name_history; /* Callback for altering the behavior of the Open File dialog. Makes the Filename text field contain "Current Directory" and be @@ -5868,13 +5856,37 @@ file_dialog_callback (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND dialog = GetParent (hwnd); HWND edit_control = GetDlgItem (dialog, FILE_NAME_TEXT_FIELD); + HWND list = GetDlgItem (dialog, FILE_NAME_LIST); - /* Directories is in index 2. */ + /* At least on Windows 7, the above attempt to get the window handle + to the File Name Text Field fails. The following code does the + job though. Note that this code is based on my examination of the + window hierarchy using Microsoft Spy++. bk */ + if (edit_control == NULL) + { + HWND tmp = GetDlgItem (dialog, FILE_NAME_COMBO_BOX); + if (tmp) + { + tmp = GetWindow (tmp, GW_CHILD); + if (tmp) + edit_control = GetWindow (tmp, GW_CHILD); + } + } + + /* Directories is in index 2. */ if (notify->lpOFN->nFilterIndex == 2) { CommDlg_OpenSave_SetControlText (dialog, FILE_NAME_TEXT_FIELD, "Current Directory"); EnableWindow (edit_control, FALSE); + /* Note that at least on Windows 7, the above call to EnableWindow + disables the window that would ordinarily have focus. If we + do not set focus to some other window here, focus will land in + no man's land and the user will be unable to tab through the + dialog box (pressing tab will only result in a beep). + Avoid that problem by setting focus to the list here. */ + if (notify->hdr.code == CDN_INITDONE) + SetFocus (list); } else { @@ -5951,6 +5963,13 @@ Otherwise, if ONLY-DIR-P is non-nil, the user can only select directories. */) else filename[0] = '\0'; + /* The code in file_dialog_callback that attempts to set the text + of the file name edit window when handling the CDN_INITDONE + WM_NOTIFY message does not work. Setting filename to "Current + Directory" in the only_dir_p case here does work however. */ + if (filename[0] == 0 && ! NILP (only_dir_p)) + strcpy (filename, "Current Directory"); + { NEWOPENFILENAME new_file_details; BOOL file_opened = FALSE; @@ -6162,7 +6181,7 @@ an integer representing a ShowWindow flag: CHECK_STRING (document); /* Encode filename, current directory and parameters. */ - current_dir = ENCODE_FILE (B_ (current_buffer, directory)); + current_dir = ENCODE_FILE (BVAR (current_buffer, directory)); document = ENCODE_FILE (document); if (STRINGP (parameters)) parameters = ENCODE_SYSTEM (parameters); @@ -6795,10 +6814,6 @@ syms_of_w32fns (void) DEFSYM (Qfont_param, "font-parameter"); /* This is the end of symbol initialization. */ - /* Text property `display' should be nonsticky by default. */ - Vtext_property_default_nonsticky - = Fcons (Fcons (Qdisplay, Qt), Vtext_property_default_nonsticky); - Fput (Qundefined_color, Qerror_conditions, pure_cons (Qundefined_color, pure_cons (Qerror, Qnil)));