aboutsummaryrefslogtreecommitdiffstats
path: root/src/macfns.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/macfns.c')
-rw-r--r--src/macfns.c98
1 files changed, 56 insertions, 42 deletions
diff --git a/src/macfns.c b/src/macfns.c
index 8716f072411..2d004be9962 100644
--- a/src/macfns.c
+++ b/src/macfns.c
@@ -1945,63 +1945,80 @@ static void
1945mac_update_proxy_icon (f) 1945mac_update_proxy_icon (f)
1946 struct frame *f; 1946 struct frame *f;
1947{ 1947{
1948 OSStatus err;
1948 Lisp_Object file_name = 1949 Lisp_Object file_name =
1949 XBUFFER (XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer)->filename; 1950 XBUFFER (XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer)->filename;
1950 Window w = FRAME_MAC_WINDOW (f); 1951 Window w = FRAME_MAC_WINDOW (f);
1951 1952 AliasHandle alias = NULL;
1952 if (FRAME_FILE_NAME (f) == NULL && !STRINGP (file_name))
1953 return;
1954 if (FRAME_FILE_NAME (f) && STRINGP (file_name)
1955 && strcmp (FRAME_FILE_NAME (f), SDATA (file_name)) == 0)
1956 return;
1957
1958 if (FRAME_FILE_NAME (f))
1959 {
1960 xfree (FRAME_FILE_NAME (f));
1961 FRAME_FILE_NAME (f) = NULL;
1962 }
1963 1953
1964 BLOCK_INPUT; 1954 BLOCK_INPUT;
1965 1955
1956 err = GetWindowProxyAlias (w, &alias);
1957 if (err == errWindowDoesNotHaveProxy && !STRINGP (file_name))
1958 goto out;
1959
1966 if (STRINGP (file_name)) 1960 if (STRINGP (file_name))
1967 { 1961 {
1968 OSStatus err;
1969 AEDesc desc; 1962 AEDesc desc;
1963#ifdef MAC_OSX
1964 FSRef fref;
1965#else
1966 FSSpec fss;
1967#endif
1968 Boolean changed;
1970 Lisp_Object encoded_file_name = ENCODE_FILE (file_name); 1969 Lisp_Object encoded_file_name = ENCODE_FILE (file_name);
1971 1970
1972#ifdef MAC_OS8 1971#ifdef MAC_OSX
1972 err = AECoercePtr (TYPE_FILE_NAME, SDATA (encoded_file_name),
1973 SBYTES (encoded_file_name), typeFSRef, &desc);
1974#else
1973 SetPortWindowPort (w); 1975 SetPortWindowPort (w);
1974#endif
1975 err = AECoercePtr (TYPE_FILE_NAME, SDATA (encoded_file_name), 1976 err = AECoercePtr (TYPE_FILE_NAME, SDATA (encoded_file_name),
1976 SBYTES (encoded_file_name), typeAlias, &desc); 1977 SBYTES (encoded_file_name), typeFSS, &desc);
1978#endif
1977 if (err == noErr) 1979 if (err == noErr)
1978 { 1980 {
1979 Size size = AEGetDescDataSize (&desc); 1981#ifdef MAC_OSX
1980 AliasHandle alias = (AliasHandle) NewHandle (size); 1982 err = AEGetDescData (&desc, &fref, sizeof (FSRef));
1981 1983#else
1982 if (alias == NULL) 1984 err = AEGetDescData (&desc, &fss, sizeof (FSSpec));
1983 err = memFullErr; 1985#endif
1984 else
1985 {
1986 HLock ((Handle) alias);
1987 err = AEGetDescData (&desc, *alias, size);
1988 HUnlock ((Handle) alias);
1989 if (err == noErr)
1990 err = SetWindowProxyAlias (w, alias);
1991 DisposeHandle ((Handle) alias);
1992 }
1993 AEDisposeDesc (&desc); 1986 AEDisposeDesc (&desc);
1994 } 1987 }
1995 if (err == noErr) 1988 if (err == noErr)
1996 { 1989 {
1997 FRAME_FILE_NAME (f) = xmalloc (SBYTES (file_name) + 1); 1990 if (alias)
1998 strcpy (FRAME_FILE_NAME (f), SDATA (file_name)); 1991 {
1992#ifdef MAC_OSX
1993 err = FSUpdateAlias (NULL, &fref, alias, &changed);
1994#else
1995 err = UpdateAlias (NULL, &fss, alias, &changed);
1996#endif
1997 }
1998 if (err != noErr || alias == NULL)
1999 {
2000 if (alias)
2001 DisposeHandle ((Handle) alias);
2002#ifdef MAC_OSX
2003 err = FSNewAliasMinimal (&fref, &alias);
2004#else
2005 err = NewAliasMinimal (&fss, &alias);
2006#endif
2007 changed = true;
2008 }
1999 } 2009 }
2010 if (err == noErr)
2011 if (changed)
2012 err = SetWindowProxyAlias (w, alias);
2000 } 2013 }
2001 2014
2002 if (FRAME_FILE_NAME (f) == NULL) 2015 if (alias)
2016 DisposeHandle ((Handle) alias);
2017
2018 if (err != noErr || !STRINGP (file_name))
2003 RemoveWindowProxy (w); 2019 RemoveWindowProxy (w);
2004 2020
2021 out:
2005 UNBLOCK_INPUT; 2022 UNBLOCK_INPUT;
2006} 2023}
2007#endif 2024#endif
@@ -2566,7 +2583,6 @@ This function is an internal primitive--use `make-frame' instead. */)
2566 f->output_data.mac = (struct mac_output *) xmalloc (sizeof (struct mac_output)); 2583 f->output_data.mac = (struct mac_output *) xmalloc (sizeof (struct mac_output));
2567 bzero (f->output_data.mac, sizeof (struct mac_output)); 2584 bzero (f->output_data.mac, sizeof (struct mac_output));
2568 FRAME_FONTSET (f) = -1; 2585 FRAME_FONTSET (f) = -1;
2569 record_unwind_protect (unwind_create_frame, frame);
2570 2586
2571 f->icon_name 2587 f->icon_name
2572 = mac_get_arg (parms, Qicon_name, "iconName", "Title", RES_TYPE_STRING); 2588 = mac_get_arg (parms, Qicon_name, "iconName", "Title", RES_TYPE_STRING);
@@ -2574,6 +2590,9 @@ This function is an internal primitive--use `make-frame' instead. */)
2574 f->icon_name = Qnil; 2590 f->icon_name = Qnil;
2575 2591
2576/* FRAME_MAC_DISPLAY_INFO (f) = dpyinfo; */ 2592/* FRAME_MAC_DISPLAY_INFO (f) = dpyinfo; */
2593
2594 /* With FRAME_MAC_DISPLAY_INFO set up, this unwind-protect is safe. */
2595 record_unwind_protect (unwind_create_frame, frame);
2577#if GLYPH_DEBUG 2596#if GLYPH_DEBUG
2578 image_cache_refcount = FRAME_X_IMAGE_CACHE (f)->refcount; 2597 image_cache_refcount = FRAME_X_IMAGE_CACHE (f)->refcount;
2579 dpyinfo_refcount = dpyinfo->reference_count; 2598 dpyinfo_refcount = dpyinfo->reference_count;
@@ -2876,14 +2895,9 @@ DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0,
2876 CHECK_STRING (color); 2895 CHECK_STRING (color);
2877 2896
2878 if (mac_defined_color (f, SDATA (color), &foo, 0)) 2897 if (mac_defined_color (f, SDATA (color), &foo, 0))
2879 { 2898 return list3 (make_number (foo.red),
2880 Lisp_Object rgb[3]; 2899 make_number (foo.green),
2881 2900 make_number (foo.blue));
2882 rgb[0] = make_number (foo.red);
2883 rgb[1] = make_number (foo.green);
2884 rgb[2] = make_number (foo.blue);
2885 return Flist (3, rgb);
2886 }
2887 else 2901 else
2888 return Qnil; 2902 return Qnil;
2889} 2903}