X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/cce7d53002e8abc346b67ea4100507b0e7c4d68e..cb993c584c8ef91f5352ec9aa97d26fd76cfd643:/src/w32fns.c diff --git a/src/w32fns.c b/src/w32fns.c index ec48397657..f48e5764b4 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; @@ -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 */ @@ -1537,7 +1527,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 +1596,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 +1631,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 +2865,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 +2952,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 +3273,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 +3624,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; } @@ -3991,7 +3983,7 @@ 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 @@ -4532,8 +4524,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); } @@ -4830,7 +4820,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 +4869,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 +4890,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 +4906,6 @@ FRAME. Default is to change on the edit X window. */) XFlush (FRAME_W32_DISPLAY (f)); UNBLOCK_INPUT; -#endif /* TODO */ - return value; } @@ -4928,8 +4916,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 +4927,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 +4951,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 +4990,10 @@ no value of TYPE (always string in the MS Windows case). */) return prop_value; -#endif /* TODO */ return Qnil; } +#endif /* TODO */ /*********************************************************************** @@ -5183,7 +5166,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; @@ -5843,13 +5826,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 +5848,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); + + /* 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. */ + /* 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 +5955,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; @@ -6795,10 +6806,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)));