1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-23 07:19:15 +00:00

[!TARGET_API_MAC_CARBON] Include Displays.h.

(mac_screen_config_changed): New variable.
(mac_handle_dm_notification, init_dm_notification_handler)
(mac_get_screen_info): New functions.
[MAC_OS8] (main): Call init_dm_notification_handler.
(mac_initialize) [MAC_OSX]: Likewise.
(XTread_socket): Call mac_get_screen_info if screen config changed.
(mac_initialized): Make static.
(mac_initialize_display_info): Remove function.
(mac_term_init): Call mac_get_screen_info.  Add partial contents of
mac_initialize_display_info.
This commit is contained in:
YAMAMOTO Mitsuharu 2007-04-13 08:14:23 +00:00
parent c8286c2ca4
commit 19ee09cc77
2 changed files with 141 additions and 88 deletions

View File

@ -1,3 +1,17 @@
2007-04-13 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
* macterm.c [!TARGET_API_MAC_CARBON]: Include Displays.h.
(mac_screen_config_changed): New variable.
(mac_handle_dm_notification, init_dm_notification_handler)
(mac_get_screen_info): New functions.
[MAC_OS8] (main): Call init_dm_notification_handler.
(mac_initialize) [MAC_OSX]: Likewise.
(XTread_socket): Call mac_get_screen_info if screen config changed.
(mac_initialized): Make static.
(mac_initialize_display_info): Remove function.
(mac_term_init): Call mac_get_screen_info. Add partial contents of
mac_initialize_display_info.
2007-04-12 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
* mac.c (xrm_get_preference_database, Fmac_get_preference)

View File

@ -52,6 +52,7 @@ Boston, MA 02110-1301, USA. */
#include <LowMem.h>
#include <Controls.h>
#include <Windows.h>
#include <Displays.h>
#if defined (__MRC__) || (__MSL__ >= 0x6000)
#include <ControlDefinitions.h>
#endif
@ -8869,6 +8870,9 @@ int mac_pass_control_to_system;
Carbon/Apple event handlers. */
static struct input_event *read_socket_inev = NULL;
/* Whether or not the screen configuration has changed. */
static int mac_screen_config_changed = 0;
Point saved_menu_event_location;
/* Apple Events */
@ -10399,6 +10403,87 @@ remove_window_handler (window)
}
static pascal void
mac_handle_dm_notification (event)
AppleEvent *event;
{
mac_screen_config_changed = 1;
}
static OSErr
init_dm_notification_handler ()
{
OSErr err;
static DMNotificationUPP handle_dm_notificationUPP = NULL;
ProcessSerialNumber psn;
if (handle_dm_notificationUPP == NULL)
handle_dm_notificationUPP =
NewDMNotificationUPP (mac_handle_dm_notification);
err = GetCurrentProcess (&psn);
if (err == noErr)
err = DMRegisterNotifyProc (handle_dm_notificationUPP, &psn);
return err;
}
static void
mac_get_screen_info (dpyinfo)
struct mac_display_info *dpyinfo;
{
#ifdef MAC_OSX
/* HasDepth returns true if it is possible to have a 32 bit display,
but this may not be what is actually used. Mac OSX can do better. */
dpyinfo->color_p = CGDisplaySamplesPerPixel (kCGDirectMainDisplay) > 1;
dpyinfo->n_planes = CGDisplayBitsPerPixel (kCGDirectMainDisplay);
{
CGDisplayErr err;
CGDisplayCount ndisps;
CGDirectDisplayID *displays;
err = CGGetActiveDisplayList (0, NULL, &ndisps);
if (err == noErr)
{
displays = alloca (sizeof (CGDirectDisplayID) * ndisps);
err = CGGetActiveDisplayList (ndisps, displays, &ndisps);
}
if (err == noErr)
{
CGRect bounds = CGRectZero;
while (ndisps-- > 0)
bounds = CGRectUnion (bounds, CGDisplayBounds (displays[ndisps]));
dpyinfo->height = CGRectGetHeight (bounds);
dpyinfo->width = CGRectGetWidth (bounds);
}
else
{
dpyinfo->height = CGDisplayPixelsHigh (kCGDirectMainDisplay);
dpyinfo->width = CGDisplayPixelsWide (kCGDirectMainDisplay);
}
}
#else /* !MAC_OSX */
{
GDHandle gdh = GetMainDevice ();
Rect rect = (**gdh).gdRect;
dpyinfo->color_p = TestDeviceAttribute (gdh, gdDevType);
for (dpyinfo->n_planes = 32; dpyinfo->n_planes > 0; dpyinfo->n_planes >>= 1)
if (HasDepth (gdh, dpyinfo->n_planes, gdDevType, dpyinfo->color_p))
break;
for (gdh = DMGetFirstScreenDevice (dmOnlyActiveDisplays); gdh;
gdh = DMGetNextScreenDevice (gdh, dmOnlyActiveDisplays))
UnionRect (&rect, &(**gdh).gdRect, &rect);
dpyinfo->height = rect.bottom - rect.top;
dpyinfo->width = rect.right - rect.left;
}
#endif /* !MAC_OSX */
}
#if __profile__
void
profiler_exit_proc ()
@ -10456,6 +10541,8 @@ main (void)
init_apple_event_handler ();
init_dm_notification_handler ();
{
char **argv;
int argc = 0;
@ -11377,6 +11464,12 @@ XTread_socket (sd, expected, hold_quit)
pending_autoraise_frame = 0;
}
if (mac_screen_config_changed)
{
mac_get_screen_info (dpyinfo);
mac_screen_config_changed = 0;
}
#if !USE_CARBON_EVENTS
/* Check which frames are still visible. We do this here because
there doesn't seem to be any direct notification from the Window
@ -11511,92 +11604,7 @@ make_mac_terminal_frame (struct frame *f)
Initialization
***********************************************************************/
int mac_initialized = 0;
void
mac_initialize_display_info ()
{
struct mac_display_info *dpyinfo = &one_mac_display_info;
bzero (dpyinfo, sizeof (*dpyinfo));
#ifdef MAC_OSX
dpyinfo->mac_id_name
= (char *) xmalloc (SCHARS (Vinvocation_name)
+ SCHARS (Vsystem_name)
+ 2);
sprintf (dpyinfo->mac_id_name, "%s@%s",
SDATA (Vinvocation_name), SDATA (Vsystem_name));
#else
dpyinfo->mac_id_name = (char *) xmalloc (strlen ("Mac Display") + 1);
strcpy (dpyinfo->mac_id_name, "Mac Display");
#endif
dpyinfo->reference_count = 0;
dpyinfo->resx = 72.0;
dpyinfo->resy = 72.0;
#ifdef MAC_OSX
/* HasDepth returns true if it is possible to have a 32 bit display,
but this may not be what is actually used. Mac OSX can do better. */
dpyinfo->color_p = CGDisplaySamplesPerPixel (kCGDirectMainDisplay) > 1;
dpyinfo->n_planes = CGDisplayBitsPerPixel (kCGDirectMainDisplay);
{
CGDisplayErr err;
CGDisplayCount ndisps;
CGDirectDisplayID *displays;
err = CGGetActiveDisplayList (0, NULL, &ndisps);
if (err == noErr)
{
displays = alloca (sizeof (CGDirectDisplayID) * ndisps);
err = CGGetActiveDisplayList (ndisps, displays, &ndisps);
}
if (err == noErr)
{
CGRect bounds = CGRectZero;
while (ndisps-- > 0)
bounds = CGRectUnion (bounds, CGDisplayBounds (displays[ndisps]));
dpyinfo->height = CGRectGetHeight (bounds);
dpyinfo->width = CGRectGetWidth (bounds);
}
else
{
dpyinfo->height = CGDisplayPixelsHigh (kCGDirectMainDisplay);
dpyinfo->width = CGDisplayPixelsWide (kCGDirectMainDisplay);
}
}
#else
{
GDHandle gdh = GetMainDevice ();
Rect rect = (**gdh).gdRect;
dpyinfo->color_p = TestDeviceAttribute (gdh, gdDevType);
for (dpyinfo->n_planes = 32; dpyinfo->n_planes > 0; dpyinfo->n_planes >>= 1)
if (HasDepth (gdh, dpyinfo->n_planes, gdDevType, dpyinfo->color_p))
break;
for (gdh = GetDeviceList (); gdh; gdh = GetNextDevice (gdh))
if (TestDeviceAttribute (gdh, screenDevice)
&& TestDeviceAttribute (gdh, screenActive))
UnionRect (&rect, &(**gdh).gdRect, &rect);
dpyinfo->height = rect.bottom - rect.top;
dpyinfo->width = rect.right - rect.left;
}
#endif
dpyinfo->grabbed = 0;
dpyinfo->root_window = NULL;
dpyinfo->image_cache = make_image_cache ();
dpyinfo->mouse_face_beg_row = dpyinfo->mouse_face_beg_col = -1;
dpyinfo->mouse_face_end_row = dpyinfo->mouse_face_end_col = -1;
dpyinfo->mouse_face_face_id = DEFAULT_FACE_ID;
dpyinfo->mouse_face_window = Qnil;
dpyinfo->mouse_face_overlay = Qnil;
dpyinfo->mouse_face_hidden = 0;
}
static int mac_initialized = 0;
static XrmDatabase
mac_make_rdb (xrm_option)
@ -11630,9 +11638,37 @@ mac_term_init (display_name, xrm_option, resource_name)
if (x_display_list)
error ("Sorry, this version can only handle one display");
mac_initialize_display_info ();
dpyinfo = &one_mac_display_info;
bzero (dpyinfo, sizeof (*dpyinfo));
#ifdef MAC_OSX
dpyinfo->mac_id_name
= (char *) xmalloc (SCHARS (Vinvocation_name)
+ SCHARS (Vsystem_name)
+ 2);
sprintf (dpyinfo->mac_id_name, "%s@%s",
SDATA (Vinvocation_name), SDATA (Vsystem_name));
#else
dpyinfo->mac_id_name = (char *) xmalloc (strlen ("Mac Display") + 1);
strcpy (dpyinfo->mac_id_name, "Mac Display");
#endif
dpyinfo->reference_count = 0;
dpyinfo->resx = 72.0;
dpyinfo->resy = 72.0;
mac_get_screen_info (dpyinfo);
dpyinfo->grabbed = 0;
dpyinfo->root_window = NULL;
dpyinfo->image_cache = make_image_cache ();
dpyinfo->mouse_face_beg_row = dpyinfo->mouse_face_beg_col = -1;
dpyinfo->mouse_face_end_row = dpyinfo->mouse_face_end_col = -1;
dpyinfo->mouse_face_face_id = DEFAULT_FACE_ID;
dpyinfo->mouse_face_window = Qnil;
dpyinfo->mouse_face_overlay = Qnil;
dpyinfo->mouse_face_hidden = 0;
dpyinfo->xrdb = mac_make_rdb (xrm_option);
@ -11650,6 +11686,7 @@ mac_term_init (display_name, xrm_option, resource_name)
return dpyinfo;
}
/* Get rid of display DPYINFO, assuming all frames are already gone. */
void
@ -11869,6 +11906,8 @@ mac_initialize ()
init_apple_event_handler ();
init_dm_notification_handler ();
if (!inhibit_window_system)
{
static const ProcessSerialNumber psn = {0, kCurrentProcess};