diff src/gui_mac.c @ 13:24d5189d3956

updated for version 7.0005
author vimboss
date Sat, 03 Jul 2004 16:05:59 +0000
parents 4102fb4ea781
children a81bc802c17c
line wrap: on
line diff
--- a/src/gui_mac.c
+++ b/src/gui_mac.c
@@ -203,6 +203,16 @@ ControlActionUPP gScrollDrag;
 /* Keeping track of which scrollbar is being dragged */
 static ControlHandle dragged_sb = NULL;
 
+#if defined(USE_CARBONIZED) && defined(MACOS_X)
+static struct
+{
+    FMFontFamily family;
+    FMFontSize size;
+    FMFontStyle style;
+    Boolean isPanelVisible;
+} gFontPanelInfo = { 0, 0, 0, false };
+#endif
+
 /*
  * The Quickdraw global is predefined in CodeWarior
  * but is not in Apple MPW
@@ -1436,6 +1446,99 @@ InstallAEHandlers(void)
 }
 #endif /* USE_AEVENT */
 
+
+#if defined(USE_CARBONIZED) && defined(MACOS_X)
+/*
+ * Callback function, installed by InstallFontPanelHandler(), below,
+ * to handle Font Panel events.
+ */
+    static OSStatus
+FontPanelHandler(EventHandlerCallRef inHandlerCallRef, EventRef inEvent,
+    void *inUserData)
+{
+    if (GetEventKind(inEvent) == kEventFontPanelClosed)
+    {
+	gFontPanelInfo.isPanelVisible = false;
+	return noErr;
+    }
+
+    if (GetEventKind(inEvent) == kEventFontSelection)
+    {
+	OSStatus status;
+	FMFontFamily newFamily;
+	FMFontSize newSize;
+	FMFontStyle newStyle;
+
+	/* Retrieve the font family ID number. */
+	status = GetEventParameter(inEvent, kEventParamFMFontFamily,
+		/*inDesiredType=*/typeFMFontFamily, /*outActualType=*/NULL,
+		/*inBufferSize=*/sizeof(FMFontFamily), /*outActualSize=*/NULL,
+		&newFamily);
+	if (status == noErr)
+	    gFontPanelInfo.family = newFamily;
+
+	/* Retrieve the font size. */
+	status = GetEventParameter(inEvent, kEventParamFMFontSize,
+		typeFMFontSize, NULL, sizeof(FMFontSize), NULL, &newSize);
+	if (status == noErr)
+	    gFontPanelInfo.size = newSize;
+
+	/* Retrieve the font style (bold, etc.).  Currently unused. */
+	status = GetEventParameter(inEvent, kEventParamFMFontStyle,
+		typeFMFontStyle, NULL, sizeof(FMFontStyle), NULL, &newStyle);
+	if (status == noErr)
+	    gFontPanelInfo.style = newStyle;
+    }
+    return noErr;
+}
+
+
+    static void
+InstallFontPanelHandler()
+{
+    EventTypeSpec eventTypes[2];
+    EventHandlerUPP handlerUPP;
+    /* EventHandlerRef handlerRef; */
+
+    eventTypes[0].eventClass = kEventClassFont;
+    eventTypes[0].eventKind  = kEventFontSelection;
+    eventTypes[1].eventClass = kEventClassFont;
+    eventTypes[1].eventKind  = kEventFontPanelClosed;
+
+    handlerUPP = NewEventHandlerUPP(FontPanelHandler);
+
+    InstallApplicationEventHandler(handlerUPP, /*numTypes=*/2, eventTypes,
+	    /*userData=*/NULL, /*handlerRef=*/NULL);
+}
+
+
+/*
+ * Fill the buffer pointed to by outName with the name and size
+ * of the font currently selected in the Font Panel.
+ */
+    static void
+GetFontPanelSelection(char_u* outName)
+{
+    Str255 buf;
+    Boolean isBold = false, isItalic = false;
+
+    if (!outName)
+	return;
+
+    (void)FMGetFontFamilyName(gFontPanelInfo.family, buf);
+    p2cstrcpy(outName, buf);
+
+#if 0 /* TODO: enable when styles are supported in gui_mac_find_font() */
+    isBold = (gFontPanelInfo.style & bold);
+    isItalic = (gFontPanelInfo.style & italic);
+#endif
+
+    sprintf(&outName[buf[0]], ":h%d%s%s", gFontPanelInfo.size,
+	    (isBold ? ":b" : ""), (isItalic ? ":i" : ""));
+}
+#endif
+
+
 /*
  * ------------------------------------------------------------
  * Unfiled yet
@@ -2614,6 +2717,28 @@ gui_mac_find_font(font_name)
     *p = c;
 
     GetFNum(pFontName, &font_id);
+
+    if (font_id == 0)
+    {
+	/*
+	 * Try again, this time replacing underscores in the font name
+	 * with spaces (:set guifont allows the two to be used
+	 * interchangeably; the Font Manager doesn't).
+	 */
+	int i, changed = FALSE;
+
+	for (i = pFontName[0]; i > 0; --i)
+	{
+	    if (pFontName[i] == '_')
+	    {
+		pFontName[i] = ' ';
+		changed = TRUE;
+	    }
+	}
+	if (changed)
+	    GetFNum(pFontName, &font_id);
+    }
+
 #else
     /* name = C2Pascal_save(menu->dname); */
     fontNamePtr = C2Pascal_save_and_remove_backslash(font_name);
@@ -3002,6 +3127,11 @@ gui_mch_init()
     gScrollDrag   = NewControlActionProc(gui_mac_drag_thumb);
 #endif
 
+#if defined(USE_CARBONIZED) && defined(MACOS_X)
+    /* Install Carbon event callbacks. */
+    (void)InstallFontPanelHandler();
+#endif
+
     /* Getting a handle to the Help menu */
 #ifdef USE_HELPMENU
 # ifdef USE_CARBONIZED
@@ -3233,6 +3363,56 @@ gui_mch_get_screen_dimensions(screen_w, 
 }
 
 
+#if defined(USE_CARBONIZED) && defined(MACOS_X)
+/*
+ * Open the Font Panel and wait for the user to select a font and
+ * close the panel.  Then fill the buffer pointed to by font_name with
+ * the name and size of the selected font and return the font's handle,
+ * or NOFONT in case of an error.
+ */
+    static GuiFont
+gui_mac_select_font(char_u *font_name)
+{
+    GuiFont		    selected_font = NOFONT;
+    OSStatus		    status;
+    FontSelectionQDStyle    curr_font;
+
+    /* Initialize the Font Panel with the current font. */
+    curr_font.instance.fontFamily = gui.norm_font & 0xFFFF;
+    curr_font.size = (gui.norm_font >> 16);
+    /* TODO: set fontStyle once styles are supported in gui_mac_find_font() */
+    curr_font.instance.fontStyle = 0;
+    curr_font.hasColor = false;
+    curr_font.version = 0; /* version number of the style structure */
+    status = SetFontInfoForSelection(kFontSelectionQDType,
+	    /*numStyles=*/1, &curr_font, /*eventTarget=*/NULL);
+
+    gFontPanelInfo.family = curr_font.instance.fontFamily;
+    gFontPanelInfo.style = curr_font.instance.fontStyle;
+    gFontPanelInfo.size = curr_font.size;
+
+    /* Pop up the Font Panel. */
+    status = FPShowHideFontPanel();
+    if (status == noErr)
+    {
+	/*
+	 * The Font Panel is modeless.  We really need it to be modal,
+	 * so we spin in an event loop until the panel is closed.
+	 */
+	gFontPanelInfo.isPanelVisible = true;
+	while (gFontPanelInfo.isPanelVisible)
+	{
+	    EventRecord e;
+	    WaitNextEvent(everyEvent, &e, /*sleep=*/20, /*mouseRgn=*/NULL);
+	}
+
+	GetFontPanelSelection(font_name);
+	selected_font = gui_mac_find_font(font_name);
+    }
+    return selected_font;
+}
+#endif
+
 
 /*
  * Initialise vim to use the font with the given name.	Return FAIL if the font
@@ -3262,6 +3442,31 @@ gui_mch_init_font(font_name, fontset)
 	}
 	font = (suggestedSize << 16) + ((long) font_id & 0xFFFF);
     }
+#if defined(USE_CARBONIZED) && defined(MACOS_X)
+    else if (STRCMP(font_name, "*") == 0)
+    {
+	char_u *new_p_guifont, font_name[512];
+
+	font = gui_mac_select_font(font_name);
+	if (font == NOFONT)
+	    return FAIL;
+
+	/* Set guifont to the name of the selected font. */
+	new_p_guifont = alloc(STRLEN(font_name) + 1);
+	if (new_p_guifont != NULL)
+	{
+	    STRCPY(new_p_guifont, font_name);
+	    vim_free(p_guifont);
+	    p_guifont = new_p_guifont;
+	    /* Replace spaces in the font name with underscores. */
+	    for ( ; *new_p_guifont; ++new_p_guifont)
+	    {
+		if (*new_p_guifont == ' ')
+		    *new_p_guifont = '_';
+	    }
+	}
+    }
+#endif
     else
     {
 	font = gui_mac_find_font(font_name);