comparison src/macterm.c @ 57357:05fe2d3ca439

macfns.c (mac_get_window_bounds): Add extern. (x_real_positions): Use mac_get_window_bounds. macmenu.c (update_submenu_strings): Apply 2004-09-07 change for xmenu.c (YAILOM). macterm.c [!MAC_OSX]: Include Windows.h. (front_emacs_window): Rename from mac_front_window. All uses changed. Return the frontmost non-tooltip emacs window. (mac_get_window_bounds): New function. (x_calc_absolute_position): Use the difference of width and height between the inner and outer window. (x_set_offset): Specify window position by the coordinae of the outer window. Adjust the position if the title bar is completely outside the screen. (app_is_suspended, app_sleep_time): Remove unused variables. (do_app_resume, do_app_suspend): Remove their contents because window-activate/deactivate events will do the job. (do_zoom_window): Remove unused variables. Make compliant to the standard way of zooming. Set f->left_pos and f->top_pos. (XTread_socket): Don't use argument `expected'. Don't use FrontWindow to determine the clicked window. Exclude unprocessed mouseUp cases in the early stage. Add parentheses to fix operator precedence. (XTread_socket) [TARGET_API_MAC_CARBON]: Don't specify drag area.
author Steven Tamm <steventamm@mac.com>
date Wed, 06 Oct 2004 15:38:53 +0000
parents e8bafb4b47db
children 38e45bf0128a d83f49cefda3
comparison
equal deleted inserted replaced
57356:8d418044266b 57357:05fe2d3ca439
48 #include <Resources.h> 48 #include <Resources.h>
49 #include <Fonts.h> 49 #include <Fonts.h>
50 #include <TextUtils.h> 50 #include <TextUtils.h>
51 #include <LowMem.h> 51 #include <LowMem.h>
52 #include <Controls.h> 52 #include <Controls.h>
53 #include <Windows.h>
53 #if defined (__MRC__) || (__MSL__ >= 0x6000) 54 #if defined (__MRC__) || (__MSL__ >= 0x6000)
54 #include <ControlDefinitions.h> 55 #include <ControlDefinitions.h>
55 #endif 56 #endif
56 57
57 #if __profile__ 58 #if __profile__
3885 } 3886 }
3886 } 3887 }
3887 3888
3888 3889
3889 static WindowPtr 3890 static WindowPtr
3890 mac_front_window () 3891 front_emacs_window ()
3891 { 3892 {
3892 #if TARGET_API_MAC_CARBON 3893 #if TARGET_API_MAC_CARBON
3893 return GetFrontWindowOfClass (kDocumentWindowClass, true); 3894 WindowPtr wp = GetFrontWindowOfClass (kDocumentWindowClass, true);
3895
3896 while (wp && !is_emacs_window (wp))
3897 wp = GetNextWindowOfClass (wp, kDocumentWindowClass, true);
3894 #else 3898 #else
3895 WindowPtr front_window = FrontWindow (); 3899 WindowPtr wp = FrontWindow ();
3896 3900
3897 if (tip_window && front_window == tip_window) 3901 while (wp && (wp == tip_window || !is_emacs_window (wp)))
3898 return GetNextWindow (front_window); 3902 wp = GetNextWindow (wp);
3899 else 3903 #endif
3900 return front_window; 3904
3901 #endif 3905 return wp;
3902 } 3906 }
3903 3907
3904 #define mac_window_to_frame(wp) (((mac_output *) GetWRefCon (wp))->mFP) 3908 #define mac_window_to_frame(wp) (((mac_output *) GetWRefCon (wp))->mFP)
3905 3909
3906 /* Return the current position of the mouse. 3910 /* Return the current position of the mouse.
3932 Lisp_Object *x, *y; 3936 Lisp_Object *x, *y;
3933 unsigned long *time; 3937 unsigned long *time;
3934 { 3938 {
3935 Point mouse_pos; 3939 Point mouse_pos;
3936 int ignore1, ignore2; 3940 int ignore1, ignore2;
3937 WindowPtr wp = mac_front_window (); 3941 WindowPtr wp = front_emacs_window ();
3938 struct frame *f; 3942 struct frame *f;
3939 Lisp_Object frame, tail; 3943 Lisp_Object frame, tail;
3940 3944
3941 if (is_emacs_window(wp)) 3945 if (is_emacs_window(wp))
3942 f = mac_window_to_frame (wp); 3946 f = mac_window_to_frame (wp);
4549 enum scroll_bar_part *part; 4553 enum scroll_bar_part *part;
4550 Lisp_Object *x, *y; 4554 Lisp_Object *x, *y;
4551 unsigned long *time; 4555 unsigned long *time;
4552 { 4556 {
4553 struct scroll_bar *bar = XSCROLL_BAR (last_mouse_scroll_bar); 4557 struct scroll_bar *bar = XSCROLL_BAR (last_mouse_scroll_bar);
4554 WindowPtr wp = mac_front_window (); 4558 WindowPtr wp = front_emacs_window ();
4555 Point mouse_pos; 4559 Point mouse_pos;
4556 struct frame *f = mac_window_to_frame (wp); 4560 struct frame *f = mac_window_to_frame (wp);
4557 int win_y, top_range; 4561 int win_y, top_range;
4558 4562
4559 SetPortWindowPort (wp); 4563 SetPortWindowPort (wp);
5034 xim_close_dpy (dpyinfo) 5038 xim_close_dpy (dpyinfo)
5035 5039
5036 */ 5040 */
5037 5041
5038 5042
5043 void
5044 mac_get_window_bounds (f, inner, outer)
5045 struct frame *f;
5046 Rect *inner, *outer;
5047 {
5048 #if TARGET_API_MAC_CARBON
5049 GetWindowBounds (FRAME_MAC_WINDOW (f), kWindowContentRgn, inner);
5050 GetWindowBounds (FRAME_MAC_WINDOW (f), kWindowStructureRgn, outer);
5051 #else /* not TARGET_API_MAC_CARBON */
5052 RgnHandle region = NewRgn ();
5053
5054 GetWindowRegion (FRAME_MAC_WINDOW (f), kWindowContentRgn, region);
5055 *inner = (*region)->rgnBBox;
5056 GetWindowRegion (FRAME_MAC_WINDOW (f), kWindowStructureRgn, region);
5057 *outer = (*region)->rgnBBox;
5058 DisposeRgn (region);
5059 #endif /* not TARGET_API_MAC_CARBON */
5060 }
5061
5062
5039 /* Calculate the absolute position in frame F 5063 /* Calculate the absolute position in frame F
5040 from its current recorded position values and gravity. */ 5064 from its current recorded position values and gravity. */
5041 5065
5042 void 5066 void
5043 x_calc_absolute_position (f) 5067 x_calc_absolute_position (f)
5044 struct frame *f; 5068 struct frame *f;
5045 { 5069 {
5046 Point pt; 5070 int width_diff = 0, height_diff = 0;
5047 int flags = f->size_hint_flags; 5071 int flags = f->size_hint_flags;
5048 5072 Rect inner, outer;
5049 pt.h = pt.v = 0; 5073
5050 5074 /* We have nothing to do if the current position
5051 /* Find the position of the outside upper-left corner of 5075 is already for the top-left corner. */
5076 if (! ((flags & XNegative) || (flags & YNegative)))
5077 return;
5078
5079 /* Find the offsets of the outside upper-left corner of
5052 the inner window, with respect to the outer window. */ 5080 the inner window, with respect to the outer window. */
5053 if (f->output_data.mac->parent_desc != FRAME_MAC_DISPLAY_INFO (f)->root_window) 5081 mac_get_window_bounds (f, &inner, &outer);
5054 { 5082
5055 GrafPtr savePort; 5083 width_diff = (outer.right - outer.left) - (inner.right - inner.left);
5056 GetPort (&savePort); 5084 height_diff = (outer.bottom - outer.top) - (inner.bottom - inner.top);
5057
5058 SetPortWindowPort (FRAME_MAC_WINDOW (f));
5059
5060 #if TARGET_API_MAC_CARBON
5061 {
5062 Rect r;
5063
5064 GetWindowPortBounds (FRAME_MAC_WINDOW (f), &r);
5065 SetPt(&pt, r.left, r.top);
5066 }
5067 #else /* not TARGET_API_MAC_CARBON */
5068 SetPt(&pt, FRAME_MAC_WINDOW (f)->portRect.left, FRAME_MAC_WINDOW (f)->portRect.top);
5069 #endif /* not TARGET_API_MAC_CARBON */
5070 LocalToGlobal (&pt);
5071 SetPort (savePort);
5072 }
5073 5085
5074 /* Treat negative positions as relative to the leftmost bottommost 5086 /* Treat negative positions as relative to the leftmost bottommost
5075 position that fits on the screen. */ 5087 position that fits on the screen. */
5076 if (flags & XNegative) 5088 if (flags & XNegative)
5077 f->left_pos = (FRAME_MAC_DISPLAY_INFO (f)->width 5089 f->left_pos = (FRAME_MAC_DISPLAY_INFO (f)->width
5078 - 2 * f->border_width - pt.h 5090 - width_diff
5079 - FRAME_PIXEL_WIDTH (f) 5091 - FRAME_PIXEL_WIDTH (f)
5080 + f->left_pos); 5092 + f->left_pos);
5081 /* NTEMACS_TODO: Subtract menubar height? */ 5093
5082 if (flags & YNegative) 5094 if (flags & YNegative)
5083 f->top_pos = (FRAME_MAC_DISPLAY_INFO (f)->height 5095 f->top_pos = (FRAME_MAC_DISPLAY_INFO (f)->height
5084 - 2 * f->border_width - pt.v 5096 - height_diff
5085 - FRAME_PIXEL_HEIGHT (f) 5097 - FRAME_PIXEL_HEIGHT (f)
5086 + f->top_pos); 5098 + f->top_pos);
5099
5087 /* The left_pos and top_pos 5100 /* The left_pos and top_pos
5088 are now relative to the top and left screen edges, 5101 are now relative to the top and left screen edges,
5089 so the flags should correspond. */ 5102 so the flags should correspond. */
5090 f->size_hint_flags &= ~ (XNegative | YNegative); 5103 f->size_hint_flags &= ~ (XNegative | YNegative);
5091 } 5104 }
5100 x_set_offset (f, xoff, yoff, change_gravity) 5113 x_set_offset (f, xoff, yoff, change_gravity)
5101 struct frame *f; 5114 struct frame *f;
5102 register int xoff, yoff; 5115 register int xoff, yoff;
5103 int change_gravity; 5116 int change_gravity;
5104 { 5117 {
5105 int modified_top, modified_left;
5106
5107 if (change_gravity > 0) 5118 if (change_gravity > 0)
5108 { 5119 {
5109 f->top_pos = yoff; 5120 f->top_pos = yoff;
5110 f->left_pos = xoff; 5121 f->left_pos = xoff;
5111 f->size_hint_flags &= ~ (XNegative | YNegative); 5122 f->size_hint_flags &= ~ (XNegative | YNegative);
5118 x_calc_absolute_position (f); 5129 x_calc_absolute_position (f);
5119 5130
5120 BLOCK_INPUT; 5131 BLOCK_INPUT;
5121 x_wm_set_size_hint (f, (long) 0, 0); 5132 x_wm_set_size_hint (f, (long) 0, 0);
5122 5133
5123 modified_left = f->left_pos; 5134 #if TARGET_API_MAC_CARBON
5124 modified_top = f->top_pos; 5135 MoveWindowStructure (FRAME_MAC_WINDOW (f), f->left_pos, f->top_pos);
5125 5136 /* If the title bar is completely outside the screen, adjust the
5126 MoveWindow (FRAME_MAC_WINDOW (f), modified_left + 6, 5137 position. */
5127 modified_top + 42, false); 5138 ConstrainWindowToScreen (FRAME_MAC_WINDOW (f), kWindowTitleBarRgn,
5139 kWindowConstrainMoveRegardlessOfFit
5140 | kWindowConstrainAllowPartial, NULL, NULL);
5141 x_real_positions (f, &f->left_pos, &f->top_pos);
5142 #else
5143 {
5144 Rect inner, outer, screen_rect, dummy;
5145 RgnHandle region = NewRgn ();
5146
5147 mac_get_window_bounds (f, &inner, &outer);
5148 f->x_pixels_diff = inner.left - outer.left;
5149 f->y_pixels_diff = inner.top - outer.top;
5150 MoveWindow (FRAME_MAC_WINDOW (f), f->left_pos + f->x_pixels_diff,
5151 f->top_pos + f->y_pixels_diff, false);
5152
5153 /* If the title bar is completely outside the screen, adjust the
5154 position. The variable `outer' holds the title bar rectangle.
5155 The variable `inner' holds slightly smaller one than `outer',
5156 so that the calculation of overlapping may not become too
5157 strict. */
5158 GetWindowRegion (FRAME_MAC_WINDOW (f), kWindowTitleBarRgn, region);
5159 outer = (*region)->rgnBBox;
5160 DisposeRgn (region);
5161 inner = outer;
5162 InsetRect (&inner, 8, 8);
5163 screen_rect = qd.screenBits.bounds;
5164 screen_rect.top += GetMBarHeight ();
5165
5166 if (!SectRect (&inner, &screen_rect, &dummy))
5167 {
5168 if (inner.right <= screen_rect.left)
5169 f->left_pos = screen_rect.left;
5170 else if (inner.left >= screen_rect.right)
5171 f->left_pos = screen_rect.right - (outer.right - outer.left);
5172
5173 if (inner.bottom <= screen_rect.top)
5174 f->top_pos = screen_rect.top;
5175 else if (inner.top >= screen_rect.bottom)
5176 f->top_pos = screen_rect.bottom - (outer.bottom - outer.top);
5177
5178 MoveWindow (FRAME_MAC_WINDOW (f), f->left_pos + f->x_pixels_diff,
5179 f->top_pos + f->y_pixels_diff, false);
5180 }
5181 }
5182 #endif
5128 5183
5129 UNBLOCK_INPUT; 5184 UNBLOCK_INPUT;
5130 } 5185 }
5131 5186
5132 /* Call this to change the size of frame F's x-window. 5187 /* Call this to change the size of frame F's x-window.
6898 #define WNE_SLEEP_AT_RESUME 1 6953 #define WNE_SLEEP_AT_RESUME 1
6899 6954
6900 /* true when cannot handle any Mac OS events */ 6955 /* true when cannot handle any Mac OS events */
6901 static int handling_window_update = 0; 6956 static int handling_window_update = 0;
6902 6957
6958 #if 0
6903 /* the flag appl_is_suspended is used both for determining the sleep 6959 /* the flag appl_is_suspended is used both for determining the sleep
6904 time to be passed to WaitNextEvent and whether the cursor should be 6960 time to be passed to WaitNextEvent and whether the cursor should be
6905 drawn when updating the display. The cursor is turned off when 6961 drawn when updating the display. The cursor is turned off when
6906 Emacs is suspended. Redrawing it is unnecessary and what needs to 6962 Emacs is suspended. Redrawing it is unnecessary and what needs to
6907 be done depends on whether the cursor lies inside or outside the 6963 be done depends on whether the cursor lies inside or outside the
6908 redraw region. So we might as well skip drawing it when Emacs is 6964 redraw region. So we might as well skip drawing it when Emacs is
6909 suspended. */ 6965 suspended. */
6910 static Boolean app_is_suspended = false; 6966 static Boolean app_is_suspended = false;
6911 static long app_sleep_time = WNE_SLEEP_AT_RESUME; 6967 static long app_sleep_time = WNE_SLEEP_AT_RESUME;
6968 #endif
6912 6969
6913 #define EXTRA_STACK_ALLOC (256 * 1024) 6970 #define EXTRA_STACK_ALLOC (256 * 1024)
6914 6971
6915 #define ARGV_STRING_LIST_ID 129 6972 #define ARGV_STRING_LIST_ID 129
6916 #define ABOUT_ALERT_ID 128 6973 #define ABOUT_ALERT_ID 128
7233 } 7290 }
7234 7291
7235 static void 7292 static void
7236 do_app_resume () 7293 do_app_resume ()
7237 { 7294 {
7295 /* Window-activate events will do the job. */
7296 #if 0
7238 WindowPtr wp; 7297 WindowPtr wp;
7239 struct frame *f; 7298 struct frame *f;
7240 7299
7241 wp = mac_front_window (); 7300 wp = front_emacs_window ();
7242 if (is_emacs_window (wp)) 7301 if (wp)
7243 { 7302 {
7244 f = mac_window_to_frame (wp); 7303 f = mac_window_to_frame (wp);
7245 7304
7246 if (f) 7305 if (f)
7247 { 7306 {
7250 } 7309 }
7251 } 7310 }
7252 7311
7253 app_is_suspended = false; 7312 app_is_suspended = false;
7254 app_sleep_time = WNE_SLEEP_AT_RESUME; 7313 app_sleep_time = WNE_SLEEP_AT_RESUME;
7314 #endif
7255 } 7315 }
7256 7316
7257 static void 7317 static void
7258 do_app_suspend () 7318 do_app_suspend ()
7259 { 7319 {
7320 /* Window-deactivate events will do the job. */
7321 #if 0
7260 WindowPtr wp; 7322 WindowPtr wp;
7261 struct frame *f; 7323 struct frame *f;
7262 7324
7263 wp = mac_front_window (); 7325 wp = front_emacs_window ();
7264 if (is_emacs_window (wp)) 7326 if (wp)
7265 { 7327 {
7266 f = mac_window_to_frame (wp); 7328 f = mac_window_to_frame (wp);
7267 7329
7268 if (f == FRAME_MAC_DISPLAY_INFO (f)->x_focus_frame) 7330 if (f == FRAME_MAC_DISPLAY_INFO (f)->x_focus_frame)
7269 { 7331 {
7272 } 7334 }
7273 } 7335 }
7274 7336
7275 app_is_suspended = true; 7337 app_is_suspended = true;
7276 app_sleep_time = WNE_SLEEP_AT_SUSPEND; 7338 app_sleep_time = WNE_SLEEP_AT_SUSPEND;
7339 #endif
7277 } 7340 }
7278 7341
7279 7342
7280 static void 7343 static void
7281 do_mouse_moved (mouse_pos, f) 7344 do_mouse_moved (mouse_pos, f)
7282 Point mouse_pos; 7345 Point mouse_pos;
7283 FRAME_PTR *f; 7346 FRAME_PTR *f;
7284 { 7347 {
7285 WindowPtr wp = mac_front_window (); 7348 WindowPtr wp = front_emacs_window ();
7286 struct x_display_info *dpyinfo; 7349 struct x_display_info *dpyinfo;
7287 7350
7288 if (is_emacs_window (wp)) 7351 if (wp)
7289 { 7352 {
7290 *f = mac_window_to_frame (wp); 7353 *f = mac_window_to_frame (wp);
7291 dpyinfo = FRAME_MAC_DISPLAY_INFO (*f); 7354 dpyinfo = FRAME_MAC_DISPLAY_INFO (*f);
7292 7355
7293 if (dpyinfo->mouse_face_hidden) 7356 if (dpyinfo->mouse_face_hidden)
7345 do_apple_menu (menu_item); 7408 do_apple_menu (menu_item);
7346 break; 7409 break;
7347 7410
7348 default: 7411 default:
7349 { 7412 {
7350 struct frame *f = mac_window_to_frame (mac_front_window ()); 7413 struct frame *f = mac_window_to_frame (front_emacs_window ());
7351 MenuHandle menu = GetMenuHandle (menu_id); 7414 MenuHandle menu = GetMenuHandle (menu_id);
7352 if (menu) 7415 if (menu)
7353 { 7416 {
7354 UInt32 refcon; 7417 UInt32 refcon;
7355 7418
7398 do_zoom_window (WindowPtr w, int zoom_in_or_out) 7461 do_zoom_window (WindowPtr w, int zoom_in_or_out)
7399 { 7462 {
7400 GrafPtr save_port; 7463 GrafPtr save_port;
7401 Rect zoom_rect, port_rect; 7464 Rect zoom_rect, port_rect;
7402 Point top_left; 7465 Point top_left;
7403 int w_title_height, columns, rows, width, height, dummy, x, y; 7466 int w_title_height, columns, rows;
7404 struct frame *f = mac_window_to_frame (w); 7467 struct frame *f = mac_window_to_frame (w);
7405 7468
7406 GetPort (&save_port);
7407
7408 SetPortWindowPort (w);
7409
7410 /* Clear window to avoid flicker. */
7411 #if TARGET_API_MAC_CARBON 7469 #if TARGET_API_MAC_CARBON
7412 { 7470 {
7413 Rect r; 7471 Point standard_size;
7414 BitMap bm; 7472
7415 7473 standard_size.h = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, DEFAULT_NUM_COLS);
7416 GetWindowPortBounds (w, &r); 7474 standard_size.v = FRAME_MAC_DISPLAY_INFO (f)->height;
7417 EraseRect (&r); 7475
7418 7476 if (IsWindowInStandardState (w, &standard_size, &zoom_rect))
7419 if (zoom_in_or_out == inZoomOut) 7477 zoom_in_or_out = inZoomIn;
7478 else
7420 { 7479 {
7421 /* calculate height of window's title bar (hard card it for now). */ 7480 /* Adjust the standard size according to character boundaries. */
7422 w_title_height = 20 + GetMBarHeight (); 7481
7423 7482 columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, zoom_rect.right - zoom_rect.left);
7424 /* get maximum height of window into zoom_rect.bottom - 7483 rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, zoom_rect.bottom - zoom_rect.top);
7425 zoom_rect.top */ 7484 standard_size.h = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, columns);
7426 GetQDGlobalsScreenBits (&bm); 7485 standard_size.v = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, rows);
7427 zoom_rect = bm.bounds; 7486 GetWindowBounds (w, kWindowContentRgn, &port_rect);
7428 zoom_rect.top += w_title_height; 7487 if (IsWindowInStandardState (w, &standard_size, &zoom_rect)
7429 InsetRect (&zoom_rect, 8, 4); /* not too tight */ 7488 && port_rect.left == zoom_rect.left
7430 7489 && port_rect.top == zoom_rect.top)
7431 zoom_rect.right = zoom_rect.left 7490 zoom_in_or_out = inZoomIn;
7432 + FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, DEFAULT_NUM_COLS); 7491 else
7433 7492 zoom_in_or_out = inZoomOut;
7434 SetWindowStandardState (w, &zoom_rect);
7435 } 7493 }
7494
7495 ZoomWindowIdeal (w, zoom_in_or_out, &standard_size);
7436 } 7496 }
7437 #else /* not TARGET_API_MAC_CARBON */ 7497 #else /* not TARGET_API_MAC_CARBON */
7498 GetPort (&save_port);
7499
7500 SetPortWindowPort (w);
7501
7502 /* Clear window to avoid flicker. */
7438 EraseRect (&(w->portRect)); 7503 EraseRect (&(w->portRect));
7439 if (zoom_in_or_out == inZoomOut) 7504 if (zoom_in_or_out == inZoomOut)
7440 { 7505 {
7441 SetPt (&top_left, w->portRect.left, w->portRect.top); 7506 SetPt (&top_left, w->portRect.left, w->portRect.top);
7442 LocalToGlobal (&top_left); 7507 LocalToGlobal (&top_left);
7451 InsetRect (&zoom_rect, 8, 4); /* not too tight */ 7516 InsetRect (&zoom_rect, 8, 4); /* not too tight */
7452 7517
7453 zoom_rect.right = zoom_rect.left 7518 zoom_rect.right = zoom_rect.left
7454 + FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, DEFAULT_NUM_COLS); 7519 + FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, DEFAULT_NUM_COLS);
7455 7520
7521 /* Adjust the standard size according to character boundaries. */
7522 rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, zoom_rect.bottom - zoom_rect.top);
7523 zoom_rect.bottom =
7524 zoom_rect.top + FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, rows);
7525
7456 (**((WStateDataHandle) ((WindowPeek) w)->dataHandle)).stdState 7526 (**((WStateDataHandle) ((WindowPeek) w)->dataHandle)).stdState
7457 = zoom_rect; 7527 = zoom_rect;
7458 } 7528 }
7529
7530 ZoomWindow (w, zoom_in_or_out, w == front_emacs_window ());
7531
7532 SetPort (save_port);
7459 #endif /* not TARGET_API_MAC_CARBON */ 7533 #endif /* not TARGET_API_MAC_CARBON */
7460
7461 ZoomWindow (w, zoom_in_or_out, w == mac_front_window ());
7462 7534
7463 /* retrieve window size and update application values */ 7535 /* retrieve window size and update application values */
7464 #if TARGET_API_MAC_CARBON 7536 #if TARGET_API_MAC_CARBON
7465 GetWindowPortBounds (w, &port_rect); 7537 GetWindowPortBounds (w, &port_rect);
7466 #else 7538 #else
7467 port_rect = w->portRect; 7539 port_rect = w->portRect;
7468 #endif 7540 #endif
7469 rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, port_rect.bottom - port_rect.top); 7541 rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, port_rect.bottom - port_rect.top);
7470 columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, port_rect.right - port_rect.left); 7542 columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, port_rect.right - port_rect.left);
7471 x_set_window_size (f, 0, columns, rows); 7543 x_set_window_size (f, 0, columns, rows);
7472 7544 x_real_positions (f, &f->left_pos, &f->top_pos);
7473 SetPort (save_port);
7474 } 7545 }
7475 7546
7476 /* Initialize Drag And Drop to allow files to be dropped onto emacs frames */ 7547 /* Initialize Drag And Drop to allow files to be dropped onto emacs frames */
7477 static OSErr 7548 static OSErr
7478 init_mac_drag_n_drop () 7549 init_mac_drag_n_drop ()
8018 #if !USE_CARBON_EVENTS 8089 #if !USE_CARBON_EVENTS
8019 event_mask = everyEvent; 8090 event_mask = everyEvent;
8020 if (NILP (Fboundp (Qmac_ready_for_drag_n_drop))) 8091 if (NILP (Fboundp (Qmac_ready_for_drag_n_drop)))
8021 event_mask -= highLevelEventMask; 8092 event_mask -= highLevelEventMask;
8022 8093
8023 while (WaitNextEvent (event_mask, &er, 8094 while (WaitNextEvent (event_mask, &er, 0L, NULL))
8024 (expected ? app_sleep_time : 0L), NULL)) 8095 #else /* USE_CARBON_EVENTS */
8025 #else 8096 while (!ReceiveNextEvent (0, NULL, kEventDurationNoWait,
8026 while (!ReceiveNextEvent (0, NULL,
8027 (expected ? TicksToEventTime (app_sleep_time) : 0),
8028 kEventRemoveFromQueue, &eventRef)) 8097 kEventRemoveFromQueue, &eventRef))
8029 #endif /* !USE_CARBON_EVENTS */ 8098 #endif /* USE_CARBON_EVENTS */
8030 { 8099 {
8031 int do_help = 0; 8100 int do_help = 0;
8032 struct frame *f; 8101 struct frame *f;
8033
8034 expected = 0;
8035 8102
8036 /* It is necessary to set this (additional) argument slot of an 8103 /* It is necessary to set this (additional) argument slot of an
8037 event to nil because keyboard.c protects incompletely 8104 event to nil because keyboard.c protects incompletely
8038 processed event from being garbage collected by placing them 8105 processed event from being garbage collected by placing them
8039 in the kbd_buffer_gcpro vector. */ 8106 in the kbd_buffer_gcpro vector. */
8053 GetEventParameter(eventRef, kEventParamDirectObject, 8120 GetEventParameter(eventRef, kEventParamDirectObject,
8054 typeWindowRef, NULL, sizeof(WindowPtr), 8121 typeWindowRef, NULL, sizeof(WindowPtr),
8055 NULL, &window_ptr); 8122 NULL, &window_ptr);
8056 f = mac_window_to_frame (window_ptr); 8123 f = mac_window_to_frame (window_ptr);
8057 if (f && !f->async_iconified) 8124 if (f && !f->async_iconified)
8058 { 8125 x_real_positions (f, &f->left_pos, &f->top_pos);
8059 int x, y;
8060
8061 x_real_positions (f, &x, &y);
8062 f->left_pos = x;
8063 f->top_pos = y;
8064 }
8065 SendEventToEventTarget (eventRef, toolbox_dispatcher); 8126 SendEventToEventTarget (eventRef, toolbox_dispatcher);
8066 } 8127 }
8067 break; 8128 break;
8068 case kEventClassMouse: 8129 case kEventClassMouse:
8069 if (GetEventKind (eventRef) == kEventMouseWheelMoved) 8130 if (GetEventKind (eventRef) == kEventMouseWheelMoved)
8070 { 8131 {
8071 SInt32 delta; 8132 SInt32 delta;
8072 Point point; 8133 Point point;
8073 WindowPtr window_ptr = mac_front_window (); 8134 WindowPtr window_ptr = front_emacs_window ();
8074 8135
8075 if (!IsValidWindowPtr (window_ptr)) 8136 if (!IsValidWindowPtr (window_ptr))
8076 { 8137 {
8077 SysBeep(1); 8138 SysBeep(1);
8078 break; 8139 break;
8130 window_ptr = FRAME_MAC_WINDOW (last_mouse_frame); 8191 window_ptr = FRAME_MAC_WINDOW (last_mouse_frame);
8131 part_code = inContent; 8192 part_code = inContent;
8132 } 8193 }
8133 else 8194 else
8134 { 8195 {
8135 window_ptr = FrontWindow (); 8196 part_code = FindWindow (er.where, &window_ptr);
8136 if (tip_window && window_ptr == tip_window) 8197 if (tip_window && window_ptr == tip_window)
8137 { 8198 {
8138 HideWindow (tip_window); 8199 HideWindow (tip_window);
8139 window_ptr = FrontWindow (); 8200 part_code = FindWindow (er.where, &window_ptr);
8140 } 8201 }
8141
8142 if (!is_emacs_window (window_ptr))
8143 break;
8144
8145 part_code = FindWindow (er.where, &window_ptr);
8146 } 8202 }
8203
8204 if (er.what != mouseDown && part_code != inContent)
8205 break;
8147 8206
8148 switch (part_code) 8207 switch (part_code)
8149 { 8208 {
8150 case inMenuBar: 8209 case inMenuBar:
8151 if (er.what == mouseDown) 8210 f = mac_window_to_frame (front_emacs_window ());
8152 { 8211 saved_menu_event_location = er.where;
8153 f = mac_window_to_frame (mac_front_window ()); 8212 inev.kind = MENU_BAR_ACTIVATE_EVENT;
8154 saved_menu_event_location = er.where; 8213 XSETFRAME (inev.frame_or_window, f);
8155 inev.kind = MENU_BAR_ACTIVATE_EVENT;
8156 XSETFRAME (inev.frame_or_window, f);
8157 }
8158 break; 8214 break;
8159 8215
8160 case inContent: 8216 case inContent:
8161 if (window_ptr != mac_front_window ()) 8217 if (window_ptr != front_emacs_window ())
8162 SelectWindow (window_ptr); 8218 SelectWindow (window_ptr);
8163 else 8219 else
8164 { 8220 {
8165 SInt16 control_part_code; 8221 SInt16 control_part_code;
8166 ControlHandle ch; 8222 ControlHandle ch;
8253 if (!tool_bar_p) 8309 if (!tool_bar_p)
8254 last_tool_bar_item = -1; 8310 last_tool_bar_item = -1;
8255 } 8311 }
8256 else 8312 else
8257 { 8313 {
8258 if (dpyinfo->grabbed & (1 << inev.code) == 0) 8314 if ((dpyinfo->grabbed & (1 << inev.code)) == 0)
8259 /* If a button is released though it was not 8315 /* If a button is released though it was not
8260 previously pressed, that would be because 8316 previously pressed, that would be because
8261 of multi-button emulation. */ 8317 of multi-button emulation. */
8262 dpyinfo->grabbed = 0; 8318 dpyinfo->grabbed = 0;
8263 else 8319 else
8276 } 8332 }
8277 break; 8333 break;
8278 8334
8279 case inDrag: 8335 case inDrag:
8280 #if TARGET_API_MAC_CARBON 8336 #if TARGET_API_MAC_CARBON
8281 if (er.what == mouseDown) 8337 DragWindow (window_ptr, er.where, NULL);
8282 {
8283 BitMap bm;
8284
8285 GetQDGlobalsScreenBits (&bm);
8286 DragWindow (window_ptr, er.where, &bm.bounds);
8287 }
8288 #else /* not TARGET_API_MAC_CARBON */ 8338 #else /* not TARGET_API_MAC_CARBON */
8289 DragWindow (window_ptr, er.where, &qd.screenBits.bounds); 8339 DragWindow (window_ptr, er.where, &qd.screenBits.bounds);
8290 #endif /* not TARGET_API_MAC_CARBON */ 8340 #endif /* not TARGET_API_MAC_CARBON */
8291 /* Update the frame parameters. */ 8341 /* Update the frame parameters. */
8292 { 8342 {
8293 struct frame *f = mac_window_to_frame (window_ptr); 8343 struct frame *f = mac_window_to_frame (window_ptr);
8344
8294 if (f && !f->async_iconified) 8345 if (f && !f->async_iconified)
8295 { 8346 x_real_positions (f, &f->left_pos, &f->top_pos);
8296 int x, y;
8297
8298 x_real_positions (f, &x, &y);
8299 f->left_pos = x;
8300 f->top_pos = y;
8301 }
8302 } 8347 }
8303 break; 8348 break;
8304 8349
8305 case inGoAway: 8350 case inGoAway:
8306 if (TrackGoAway (window_ptr, er.where)) 8351 if (TrackGoAway (window_ptr, er.where))
8311 } 8356 }
8312 break; 8357 break;
8313 8358
8314 /* window resize handling added --ben */ 8359 /* window resize handling added --ben */
8315 case inGrow: 8360 case inGrow:
8316 if (er.what == mouseDown) 8361 do_grow_window (window_ptr, &er);
8317 { 8362 break;
8318 do_grow_window(window_ptr, &er);
8319 break;
8320 }
8321 8363
8322 /* window zoom handling added --ben */ 8364 /* window zoom handling added --ben */
8323 case inZoomIn: 8365 case inZoomIn:
8324 case inZoomOut: 8366 case inZoomOut:
8325 if (TrackBox (window_ptr, er.where, part_code)) 8367 if (TrackBox (window_ptr, er.where, part_code))
8458 != eventNotHandledErr) 8500 != eventNotHandledErr)
8459 break; 8501 break;
8460 #endif 8502 #endif
8461 8503
8462 #if TARGET_API_MAC_CARBON 8504 #if TARGET_API_MAC_CARBON
8463 if (!IsValidWindowPtr (mac_front_window ())) 8505 if (!IsValidWindowPtr (front_emacs_window ()))
8464 { 8506 {
8465 SysBeep (1); 8507 SysBeep (1);
8466 break; 8508 break;
8467 } 8509 }
8468 #endif 8510 #endif
8562 inev.modifiers = mac_event_to_emacs_modifiers (eventRef); 8604 inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
8563 #else 8605 #else
8564 inev.modifiers = mac_to_emacs_modifiers (er.modifiers); 8606 inev.modifiers = mac_to_emacs_modifiers (er.modifiers);
8565 #endif 8607 #endif
8566 XSETFRAME (inev.frame_or_window, 8608 XSETFRAME (inev.frame_or_window,
8567 mac_window_to_frame (mac_front_window ())); 8609 mac_window_to_frame (front_emacs_window ()));
8568 inev.timestamp = er.when * (1000 / 60); /* ticks to milliseconds */ 8610 inev.timestamp = er.when * (1000 / 60); /* ticks to milliseconds */
8569 break; 8611 break;
8570 8612
8571 case kHighLevelEvent: 8613 case kHighLevelEvent:
8572 drag_and_drop_file_list = Qnil; 8614 drag_and_drop_file_list = Qnil;
8579 { 8621 {
8580 struct frame *f = NULL; 8622 struct frame *f = NULL;
8581 WindowPtr wp; 8623 WindowPtr wp;
8582 Lisp_Object frame; 8624 Lisp_Object frame;
8583 8625
8584 wp = mac_front_window (); 8626 wp = front_emacs_window ();
8585 8627
8586 if (!wp) 8628 if (!wp)
8587 { 8629 {
8588 struct frame *f = XFRAME (XCAR (Vframe_list)); 8630 struct frame *f = XFRAME (XCAR (Vframe_list));
8589 CollapseWindow (FRAME_MAC_WINDOW (f), false); 8631 CollapseWindow (FRAME_MAC_WINDOW (f), false);
8590 wp = mac_front_window (); 8632 wp = front_emacs_window ();
8591 } 8633 }
8592 8634
8593 if (wp && is_emacs_window (wp)) 8635 if (wp)
8594 f = mac_window_to_frame (wp); 8636 f = mac_window_to_frame (wp);
8595 8637
8596 inev.kind = DRAG_N_DROP_EVENT; 8638 inev.kind = DRAG_N_DROP_EVENT;
8597 inev.code = 0; 8639 inev.code = 0;
8598 inev.timestamp = er.when * (1000 / 60); 8640 inev.timestamp = er.when * (1000 / 60);
9045 e.kind = ASCII_KEYSTROKE_EVENT; 9087 e.kind = ASCII_KEYSTROKE_EVENT;
9046 e.code = quit_char; 9088 e.code = quit_char;
9047 e.arg = Qnil; 9089 e.arg = Qnil;
9048 e.modifiers = NULL; 9090 e.modifiers = NULL;
9049 e.timestamp = EventTimeToTicks (GetEventTime (event)) * (1000/60); 9091 e.timestamp = EventTimeToTicks (GetEventTime (event)) * (1000/60);
9050 XSETFRAME (e.frame_or_window, mac_window_to_frame (mac_front_window ())); 9092 XSETFRAME (e.frame_or_window, mac_window_to_frame (front_emacs_window ()));
9051 /* Remove event from queue to prevent looping. */ 9093 /* Remove event from queue to prevent looping. */
9052 RemoveEventFromQueue (GetMainEventQueue (), event); 9094 RemoveEventFromQueue (GetMainEventQueue (), event);
9053 ReleaseEvent (event); 9095 ReleaseEvent (event);
9054 kbd_buffer_store_event (&e); 9096 kbd_buffer_store_event (&e);
9055 } 9097 }